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