Shader "Unlit/TerrainWater" { Properties { _MainTex ("Texture", 2D) = "white" {} _WaterMask("WaterMask",2D) = "white" {} _WaterCol("WaterCol",color) = (1,1,1,1) //_WaterFarCol("WaterFarCol",color) = (1,1,1,1) _DetailNormal("DetailNormal",2D) = "bump" {} _NormalSpeed1("NormalSpeed1",Vector) = (1,1,2,0.5) _NormalSpeed2("NormalSpeed2",Vector) = (1,1,2,0.5) _NormalSpeed3("NormalSpeed3",Vector) = (1,1,2,0.5) } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float4 normal: NORMAL; float4 tangent: TANGENT; }; struct v2f { float4 uv : TEXCOORD0; float4 vertex : SV_POSITION; float4 tangentToWorld1: TEXCOORD1; float4 tangentToWorld2: TEXCOORD2; float4 tangentToWorld3: TEXCOORD3; }; sampler2D _MainTex, _DetailNormal, _WaterMask; float4 _MainTex_ST, _DetailNormal_ST, _WaterMask_ST; half4 _WaterCol/*, _WaterFarCol*/; float4 _NormalSpeed1, _NormalSpeed2, _NormalSpeed3; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); float3 worldPos = mul(unity_ObjectToWorld, float4(o.vertex.xyz, 1)).xyz; o.uv.xy = TRANSFORM_TEX(v.uv, _MainTex); o.uv.zw = TRANSFORM_TEX(v.uv, _DetailNormal); float3 worldNormal = UnityObjectToWorldNormal(v.normal); float3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz); float3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w; o.tangentToWorld1 = float4(worldTangent.x, worldBinormal.x, worldNormal.x, worldPos.x); o.tangentToWorld2 = float4(worldTangent.y, worldBinormal.y, worldNormal.y, worldPos.y); o.tangentToWorld3 = float4(worldTangent.z, worldBinormal.z, worldNormal.z, worldPos.z); return o; } half4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv.xy); fixed waterFactor = tex2D(_WaterMask, i.uv.xy).r; half3 MyNormal1 = UnpackNormal(tex2D(_DetailNormal, i.uv.wz * _NormalSpeed1.zw + _Time.y * normalize(_NormalSpeed1.xy) * 0.3)); half3 worldMyNormal1 = half3(dot(i.tangentToWorld1.xyz, MyNormal1), dot(i.tangentToWorld2.xyz, MyNormal1), dot(i.tangentToWorld3.xyz, MyNormal1)); half3 MyNormal2 = UnpackNormal(tex2D(_DetailNormal, i.uv.wz * _NormalSpeed2.zw + _Time.y * normalize(_NormalSpeed2.xy) * 0.3)); half3 worldMyNormal2 = half3(dot(i.tangentToWorld1.xyz, MyNormal2), dot(i.tangentToWorld2.xyz, MyNormal2), dot(i.tangentToWorld3.xyz, MyNormal2)); half3 MyNormal3 = UnpackNormal(tex2D(_DetailNormal, i.uv.wz * _NormalSpeed3.zw + _Time.y * normalize(_NormalSpeed3.xy) * 0.3)); half3 worldMyNormal3 = half3(dot(i.tangentToWorld1.xyz, MyNormal3), dot(i.tangentToWorld2.xyz, MyNormal3), dot(i.tangentToWorld3.xyz, MyNormal3)); half3 wNormal = worldMyNormal1 + worldMyNormal2 + worldMyNormal3; wNormal.xy *= 1; //wNormal.z *=0.5; wNormal = normalize(wNormal); // wNormal = UnityObjectToWorldNormal(wNormal); float3 lightDir = normalize(_WorldSpaceLightPos0.xyz); float3 worldpos = float3(i.tangentToWorld1.w, i.tangentToWorld2.w, i.tangentToWorld3.w); fixed3 viewDir = normalize(_WorldSpaceCameraPos - worldpos); /*fixed3 halfDir = normalize(viewDir+ lightDir); half3 HeightLingt = half3(2, 2, 2) *pow( saturate(dot(halfDir, wNormal)),20)* waterCol;*/ /*float distance = length(_WorldSpaceCameraPos - worldpos); half3 waterBaseCol = lerp(_WaterCol.rgb, _WaterFarCol.rgb, pow(saturate((distance /12000)),5)); */ half3 waterCol = saturate(dot(wNormal, lightDir)) * _WaterCol.rgb * 0.5 + _WaterCol.rgb * 0.5; float3 reflectDir = reflect(-viewDir, wNormal); float4 envSamlpe= UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, reflectDir); half3 refecltCol = DecodeHDR(envSamlpe, unity_SpecCube0_HDR); half3 finalWaterCol = waterCol /*+ HeightLingt*/+ refecltCol*0.4; half4 fnialCol = half4(lerp(col.rgb, finalWaterCol, waterFactor), 1); return fnialCol; } ENDCG } } }