| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 | 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        }    }}
 |