123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
- // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
- Shader "M/Water" {
- Properties {
- _Color1 ("Color1", Color) = (0.0824, 0.219,0.116,1)
- _Color2 ("Color2", Color) = (0.05, 0.171, 0.219, 1)
- _RefMap("Reflection Map", 2D) = "white" {}
- _NormalMap("Normal map", 2D) = "white" {}
- _RippleAmount("Ripple amount", Float) = 0.5
- _Speed("Speed", Vector) = (0.02, 0.02, 0.02, 0.02)
- _FresnelPower("Fresnel Power", Float) = 2
- }
- SubShader {
- Tags { "Queue"="Geometry+1" "IgnoreProjector"="True" "RenderType"="Opaque"}
- LOD 200
-
- Pass {
- CGPROGRAM
-
- #pragma vertex vert
- #pragma fragment frag
- #include "UnityCG.cginc"
-
- sampler2D _NormalMap;
- sampler2D _RefMap;
- float4 _Color1;
- float4 _Color2;
- float4 _RefMap_ST;
- float4 _NormalMap_ST;
- float _RippleAmount;
- float4 _Speed;
- float _FresnelPower;
-
- struct appdata {
- float4 vertex : POSITION0;
- float3 Normal: NORMAL;
- float2 Texcoord : TEXCOORD0;
- };
-
- struct v2f {
- float4 pos : SV_POSITION;
- float4 WorldPos : TEXCOORD0;
- float3 WorldNormal : TEXCOORD1;
- float2 Texcoord : TEXCOORD2;
- };
-
- float fresnel (float3 light, float3 normal, float R0, float p)
- {
-
- float cosAngle = 1 - saturate(dot(light, normal));
- float result = cosAngle * cosAngle;
- result = result * result;
- result = result * cosAngle;
- result = saturate(result * (1 - saturate(R0)) + R0);
- return pow(result, p);
- }
- float4 desaturation(float4 c, float k)
- {
- float f = dot(c.xyz, float3(0.3, 0.59, 0.11));
- float3 cc = lerp(c.xyz, f.xxx, k);
-
- return float4(cc, c.w);
- }
- float3 calcNormal(float3 worldNormal, float2 texcoord)
- {
-
- float2 p1 = texcoord + float2(0.484, 0.867);
- float2 p2 = texcoord + float2(0.685, 0.447);
- float2 p3 = texcoord + float2(0.0954, 0.04);
- float2 p4 = texcoord;
-
-
-
-
- p1.y -= _Speed.x * _Time.y;
- p2.y += _Speed.y * _Time.y;
- p3.x -= _Speed.z * _Time.y;
- p4.x -= _Speed.w * _Time.y;
-
- p1 *= 2;
- p2 *= 2;
- p3 *= 2;
- p4 *= 2;
- float3 n1 = tex2D(_NormalMap, p1);
- float3 n2 = tex2D(_NormalMap, p2);
- //float3 n3 = tex2D(_NormalMap, p3);
- //float3 n4 = tex2D(_NormalMap, p4);
-
- float3 n = n1 + n2;// + n3 + n4;
-
- //n = n * 2 - 4;
- n = n * 2 - 2;
- //n *= 0.5;
-
-
-
-
- n = lerp(n, float3(0, 1, 0), _RippleAmount);
-
-
- return n;
- }
-
- v2f vert (appdata v)
- {
- v2f Output;
- Output.pos = UnityObjectToClipPos( v.vertex );
- Output.WorldPos = mul(unity_ObjectToWorld, v.vertex);
- Output.WorldNormal = normalize(mul(unity_ObjectToWorld, float4(v.Normal, 0)));
- Output.Texcoord = TRANSFORM_TEX(v.Texcoord, _NormalMap);
- return( Output );
- }
- float3 mReflect(float3 eye, float3 norm)
- {
- return eye - 2 * norm * dot(eye, norm);
- }
-
- fixed4 frag (v2f i) : COLOR
- {
- float3 n = normalize(i.WorldNormal);
- float3 v = normalize(i.WorldPos.xyz - _WorldSpaceCameraPos.xyz);
- float3 norm = calcNormal(n, i.Texcoord);
- float3 ref = normalize(mReflect(v, norm));
- //float4 c = texCUBE(_Env, ref.xzy);
- float2 texCoord = ref.xz * 0.5 + 0.5;
- float4 c = tex2D(_RefMap, TRANSFORM_TEX(texCoord, _RefMap));
-
- return c;
- c = desaturation(c, 0.7);
-
- float4 c1 = _Color1 + c;
- float4 c2 = _Color2 + c;
- float fres = fresnel(-v, n, 0.018, _FresnelPower);
- c = lerp(c1, c2, fres);
-
- return c;
- }
-
- ENDCG
- }
- }
- }
|