TerrainWater.shader 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. Shader "Unlit/TerrainWater"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. _WaterMask("WaterMask",2D) = "white" {}
  7. _WaterCol("WaterCol",color) = (1,1,1,1)
  8. //_WaterFarCol("WaterFarCol",color) = (1,1,1,1)
  9. _DetailNormal("DetailNormal",2D) = "bump" {}
  10. _NormalSpeed1("NormalSpeed1",Vector) = (1,1,2,0.5)
  11. _NormalSpeed2("NormalSpeed2",Vector) = (1,1,2,0.5)
  12. _NormalSpeed3("NormalSpeed3",Vector) = (1,1,2,0.5)
  13. }
  14. SubShader
  15. {
  16. Tags { "RenderType"="Opaque" }
  17. LOD 100
  18. Pass
  19. {
  20. CGPROGRAM
  21. #pragma vertex vert
  22. #pragma fragment frag
  23. // make fog work
  24. #pragma multi_compile_fog
  25. #include "UnityCG.cginc"
  26. struct appdata
  27. {
  28. float4 vertex : POSITION;
  29. float2 uv : TEXCOORD0;
  30. float4 normal: NORMAL;
  31. float4 tangent: TANGENT;
  32. };
  33. struct v2f
  34. {
  35. float4 uv : TEXCOORD0;
  36. float4 vertex : SV_POSITION;
  37. float4 tangentToWorld1: TEXCOORD1;
  38. float4 tangentToWorld2: TEXCOORD2;
  39. float4 tangentToWorld3: TEXCOORD3;
  40. };
  41. sampler2D _MainTex, _DetailNormal, _WaterMask;
  42. float4 _MainTex_ST, _DetailNormal_ST, _WaterMask_ST;
  43. half4 _WaterCol/*, _WaterFarCol*/;
  44. float4 _NormalSpeed1, _NormalSpeed2, _NormalSpeed3;
  45. v2f vert (appdata v)
  46. {
  47. v2f o;
  48. o.vertex = UnityObjectToClipPos(v.vertex);
  49. float3 worldPos = mul(unity_ObjectToWorld, float4(o.vertex.xyz, 1)).xyz;
  50. o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex);
  51. o.uv.zw = TRANSFORM_TEX(v.uv, _DetailNormal);
  52. float3 worldNormal = UnityObjectToWorldNormal(v.normal);
  53. float3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
  54. float3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w;
  55. o.tangentToWorld1 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x);
  56. o.tangentToWorld2 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y);
  57. o.tangentToWorld3 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z);
  58. return o;
  59. }
  60. half4 frag (v2f i) : SV_Target
  61. {
  62. // sample the texture
  63. fixed4 col = tex2D(_MainTex, i.uv.xy);
  64. fixed waterFactor = tex2D(_WaterMask, i.uv.xy).r;
  65. half3 MyNormal1 = UnpackNormal(tex2D(_DetailNormal, i.uv.wz * _NormalSpeed1.zw + _Time.y * normalize(_NormalSpeed1.xy) * 0.3));
  66. half3 worldMyNormal1 = half3(dot(i.tangentToWorld1.xyz, MyNormal1), dot(i.tangentToWorld2.xyz, MyNormal1), dot(i.tangentToWorld3.xyz, MyNormal1));
  67. half3 MyNormal2 = UnpackNormal(tex2D(_DetailNormal, i.uv.wz * _NormalSpeed2.zw + _Time.y * normalize(_NormalSpeed2.xy) * 0.3));
  68. half3 worldMyNormal2 = half3(dot(i.tangentToWorld1.xyz, MyNormal2), dot(i.tangentToWorld2.xyz, MyNormal2), dot(i.tangentToWorld3.xyz, MyNormal2));
  69. half3 MyNormal3 = UnpackNormal(tex2D(_DetailNormal, i.uv.wz * _NormalSpeed3.zw + _Time.y * normalize(_NormalSpeed3.xy) * 0.3));
  70. half3 worldMyNormal3 = half3(dot(i.tangentToWorld1.xyz, MyNormal3), dot(i.tangentToWorld2.xyz, MyNormal3), dot(i.tangentToWorld3.xyz, MyNormal3));
  71. half3 wNormal = worldMyNormal1 + worldMyNormal2 + worldMyNormal3;
  72. wNormal.xy *= 1;
  73. //wNormal.z *=0.5;
  74. wNormal = normalize(wNormal);
  75. // wNormal = UnityObjectToWorldNormal(wNormal);
  76. float3 lightDir = normalize(_WorldSpaceLightPos0.xyz);
  77. float3 worldpos = float3(i.tangentToWorld1.w, i.tangentToWorld2.w, i.tangentToWorld3.w);
  78. fixed3 viewDir = normalize(_WorldSpaceCameraPos - worldpos);
  79. /*fixed3 halfDir = normalize(viewDir+ lightDir);
  80. half3 HeightLingt = half3(2, 2, 2) *pow( saturate(dot(halfDir, wNormal)),20)* waterCol;*/
  81. /*float distance = length(_WorldSpaceCameraPos - worldpos);
  82. half3 waterBaseCol = lerp(_WaterCol.rgb, _WaterFarCol.rgb, pow(saturate((distance /12000)),5)); */
  83. half3 waterCol = saturate(dot(wNormal, lightDir)) * _WaterCol.rgb * 0.5 + _WaterCol.rgb * 0.5;
  84. float3 reflectDir = reflect(-viewDir, wNormal);
  85. float4 envSamlpe= UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, reflectDir);
  86. half3 refecltCol = DecodeHDR(envSamlpe, unity_SpecCube0_HDR);
  87. half3 finalWaterCol = waterCol /*+ HeightLingt*/+ refecltCol*0.4;
  88. half4 fnialCol = half4(lerp(col.rgb, finalWaterCol, waterFactor), 1);
  89. return fnialCol;
  90. }
  91. ENDCG
  92. }
  93. }
  94. }