MWWater.shader 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
  2. // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
  3. Shader "M/Water" {
  4. Properties {
  5. _Color1 ("Color1", Color) = (0.0824, 0.219,0.116,1)
  6. _Color2 ("Color2", Color) = (0.05, 0.171, 0.219, 1)
  7. _RefMap("Reflection Map", 2D) = "white" {}
  8. _NormalMap("Normal map", 2D) = "white" {}
  9. _RippleAmount("Ripple amount", Float) = 0.5
  10. _Speed("Speed", Vector) = (0.02, 0.02, 0.02, 0.02)
  11. _FresnelPower("Fresnel Power", Float) = 2
  12. }
  13. SubShader {
  14. Tags { "Queue"="Geometry+1" "IgnoreProjector"="True" "RenderType"="Opaque"}
  15. LOD 200
  16. Pass {
  17. CGPROGRAM
  18. #pragma vertex vert
  19. #pragma fragment frag
  20. #include "UnityCG.cginc"
  21. sampler2D _NormalMap;
  22. sampler2D _RefMap;
  23. float4 _Color1;
  24. float4 _Color2;
  25. float4 _RefMap_ST;
  26. float4 _NormalMap_ST;
  27. float _RippleAmount;
  28. float4 _Speed;
  29. float _FresnelPower;
  30. struct appdata {
  31. float4 vertex : POSITION0;
  32. float3 Normal: NORMAL;
  33. float2 Texcoord : TEXCOORD0;
  34. };
  35. struct v2f {
  36. float4 pos : SV_POSITION;
  37. float4 WorldPos : TEXCOORD0;
  38. float3 WorldNormal : TEXCOORD1;
  39. float2 Texcoord : TEXCOORD2;
  40. };
  41. float fresnel (float3 light, float3 normal, float R0, float p)
  42. {
  43. float cosAngle = 1 - saturate(dot(light, normal));
  44. float result = cosAngle * cosAngle;
  45. result = result * result;
  46. result = result * cosAngle;
  47. result = saturate(result * (1 - saturate(R0)) + R0);
  48. return pow(result, p);
  49. }
  50. float4 desaturation(float4 c, float k)
  51. {
  52. float f = dot(c.xyz, float3(0.3, 0.59, 0.11));
  53. float3 cc = lerp(c.xyz, f.xxx, k);
  54. return float4(cc, c.w);
  55. }
  56. float3 calcNormal(float3 worldNormal, float2 texcoord)
  57. {
  58. float2 p1 = texcoord + float2(0.484, 0.867);
  59. float2 p2 = texcoord + float2(0.685, 0.447);
  60. float2 p3 = texcoord + float2(0.0954, 0.04);
  61. float2 p4 = texcoord;
  62. p1.y -= _Speed.x * _Time.y;
  63. p2.y += _Speed.y * _Time.y;
  64. p3.x -= _Speed.z * _Time.y;
  65. p4.x -= _Speed.w * _Time.y;
  66. p1 *= 2;
  67. p2 *= 2;
  68. p3 *= 2;
  69. p4 *= 2;
  70. float3 n1 = tex2D(_NormalMap, p1);
  71. float3 n2 = tex2D(_NormalMap, p2);
  72. //float3 n3 = tex2D(_NormalMap, p3);
  73. //float3 n4 = tex2D(_NormalMap, p4);
  74. float3 n = n1 + n2;// + n3 + n4;
  75. //n = n * 2 - 4;
  76. n = n * 2 - 2;
  77. //n *= 0.5;
  78. n = lerp(n, float3(0, 1, 0), _RippleAmount);
  79. return n;
  80. }
  81. v2f vert (appdata v)
  82. {
  83. v2f Output;
  84. Output.pos = UnityObjectToClipPos( v.vertex );
  85. Output.WorldPos = mul(unity_ObjectToWorld, v.vertex);
  86. Output.WorldNormal = normalize(mul(unity_ObjectToWorld, float4(v.Normal, 0)));
  87. Output.Texcoord = TRANSFORM_TEX(v.Texcoord, _NormalMap);
  88. return( Output );
  89. }
  90. float3 mReflect(float3 eye, float3 norm)
  91. {
  92. return eye - 2 * norm * dot(eye, norm);
  93. }
  94. fixed4 frag (v2f i) : COLOR
  95. {
  96. float3 n = normalize(i.WorldNormal);
  97. float3 v = normalize(i.WorldPos.xyz - _WorldSpaceCameraPos.xyz);
  98. float3 norm = calcNormal(n, i.Texcoord);
  99. float3 ref = normalize(mReflect(v, norm));
  100. //float4 c = texCUBE(_Env, ref.xzy);
  101. float2 texCoord = ref.xz * 0.5 + 0.5;
  102. float4 c = tex2D(_RefMap, TRANSFORM_TEX(texCoord, _RefMap));
  103. return c;
  104. c = desaturation(c, 0.7);
  105. float4 c1 = _Color1 + c;
  106. float4 c2 = _Color2 + c;
  107. float fres = fresnel(-v, n, 0.018, _FresnelPower);
  108. c = lerp(c1, c2, fres);
  109. return c;
  110. }
  111. ENDCG
  112. }
  113. }
  114. }