WaterPlaneClip.shader 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. Shader "Custom/WaterClip"
  2. {
  3. Properties
  4. {
  5. _Color("Color", Color) = (1,1,1,1)
  6. _Color2("Color2", Color) = (1,1,1,1)
  7. _MainTex("Albedo (RGB)", 2D) = "white" {}
  8. _NormalSpeed1("NormalSpeed1",Vector) = (1,1,2,0.5)
  9. _NormalSpeed2("NormalSpeed2",Vector) = (1,1,2,0.5)
  10. _NormalSpeed3("NormalSpeed3",Vector) = (1,1,2,0.5)
  11. _DetailNormal("DetailNormal",2D) = "bump"{}
  12. _Glossiness("Smoothness", Range(0,1)) = 0.5
  13. _Metallic("Metallic", Range(0,1)) = 0.0
  14. _Depth("Depth",float) = 15
  15. /* _Wavelength("Wavelength",Range(0.01,10)) = 6.28
  16. _WaveSpeed("WaveSpeed",Range(0,10)) = 1
  17. _Amplitude("Amplitude",Range(0,10)) = 1*/
  18. /*_Wave1("Wave1(direct(xy),Wavelength(z),Amplitude(w))",Vector) = (1,1,2,0.5)
  19. _Wave2("Wave1(direct(xy),Wavelength(z),Amplitude(w))",Vector) = (1,0,0,0.5)
  20. _Wave3("Wave1(direct(xy),Wavelength(z),Amplitude(w))",Vector) = (0,1,2,0.5)*/
  21. _ClipTex("ClipTex",2D) = "white" {}
  22. _ClipLength("ClipLength",Range(0,1))=0.5
  23. _ClipOffset("ClipOffset",Range(-0.5,0.5))=0
  24. }
  25. SubShader
  26. {
  27. Tags { "Queue" = "Geometry" "RenderType" = "Transparent" }
  28. //ZWrite On
  29. GrabPass{}
  30. CGPROGRAM
  31. // Physically based Standard lighting model, and enable shadows on all light types
  32. #pragma surface surf Standard fullforwardshadows
  33. // Use shader model 3.0 target, to get nicer looking lighting
  34. #pragma target 3.0
  35. sampler2D _CameraDepthTexture;
  36. sampler2D _MainTex, _GrabTexture, _ClipTex;
  37. sampler2D _DetailNormal;
  38. float _ClipLength, _ClipOffset;
  39. struct Input
  40. {
  41. float2 uv_MainTex;
  42. float2 uv_DetailNormal;
  43. float2 uv_ClipTex;
  44. float4 screenPos;
  45. float3 worldPos;
  46. //float VextexNormal;
  47. float3 viewDir;
  48. };
  49. float _Depth;
  50. half _Glossiness;
  51. half _Metallic;
  52. fixed4 _Color,_Color2;
  53. /* float _Wavelength, _WaveSpeed, _Amplitude;*/
  54. //float4 _Wave1, _Wave2, _Wave3;
  55. float4 _NormalSpeed1, _NormalSpeed2, _NormalSpeed3;
  56. // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader.
  57. // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing.
  58. // #pragma instancing_options assumeuniformscaling
  59. UNITY_INSTANCING_BUFFER_START(Props)
  60. // put more per-instance properties here
  61. UNITY_INSTANCING_BUFFER_END(Props)
  62. void surf(Input IN, inout SurfaceOutputStandard o)
  63. {
  64. float clipCount = tex2D(_ClipTex, IN.uv_ClipTex).r;
  65. clip(clipCount+ _ClipOffset - _ClipLength);
  66. //²ÉÑùÉî¶Èͼ
  67. float2 uv = IN.screenPos.xy / IN.screenPos.w;
  68. //uv = (uv + 1) / 2;
  69. float depth = LinearEyeDepth(SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, uv));
  70. float surfaceDepth = UNITY_Z_0_FAR_FROM_CLIPSPACE(IN.screenPos.z);
  71. surfaceDepth = max(((1.0 - (IN.screenPos.z) / _ProjectionParams.y) * _ProjectionParams.z), 0);
  72. float colfactor = smoothstep(0, _Depth, depth - surfaceDepth);
  73. float3 bCol = tex2D(_GrabTexture, uv);
  74. o.Metallic = _Metallic;
  75. o.Smoothness = _Glossiness;
  76. half3 MyNormal1 = UnpackNormal(tex2D(_DetailNormal, IN.uv_DetailNormal * _NormalSpeed1.zw + _Time.y * normalize(_NormalSpeed1.xy) * 0.3));
  77. half3 MyNormal2 = UnpackNormal(tex2D(_DetailNormal, IN.uv_DetailNormal * _NormalSpeed2.zw + _Time.y * normalize(_NormalSpeed2.xy) * 0.3));
  78. half3 MyNormal3 = UnpackNormal(tex2D(_DetailNormal, IN.uv_DetailNormal * _NormalSpeed3.zw + _Time.y * normalize(_NormalSpeed3.xy) * 0.3));
  79. o.Normal = MyNormal1 + MyNormal2 + MyNormal3;
  80. o.Normal.z *= 3;
  81. o.Normal = normalize(o.Normal);
  82. float FFactor = pow(1 - saturate(dot(o.Normal, normalize(IN.viewDir))), 5);
  83. //FFactor = lerp(0.2, 2, FFactor);
  84. o.Albedo = lerp(_Color.rgb, _Color2.rgb, FFactor)/*_Color.rgb * FFactor*/;
  85. o.Albedo = lerp(bCol, o.Albedo, colfactor);
  86. o.Alpha = 1;
  87. }
  88. float3 GenerateWave(float4 wave,float3 clipPos,inout float3 tangent, inout float3 bNormal) {
  89. float2 Dirc = normalize(wave.xy);
  90. float3 p = clipPos.xyz;
  91. float k = 2 * UNITY_PI / wave.z;
  92. float _Amplitude = wave.w / k;
  93. float c = sqrt(9.8 / k);
  94. float f = k * (dot(p.xz, Dirc) - c * _Time.y);
  95. float Dx = Dirc.x;
  96. float Dy = Dirc.y;
  97. /* p.x += Dx * _Amplitude * cos(f);
  98. p.y += _Amplitude * sin(f);
  99. p.z += Dy * _Amplitude * cos(f);*/
  100. tangent += float3(1 - Dx * Dx * k * _Amplitude * sin(f), k * _Amplitude * cos(f), -Dx * Dy * k * _Amplitude * sin(f));
  101. bNormal += float3(-Dx * Dy * k * _Amplitude * sin(f), k * _Amplitude * cos(f), 1 - Dy * Dy * k * _Amplitude * sin(f));
  102. return float3(
  103. Dx * _Amplitude * cos(f),
  104. _Amplitude * sin(f),
  105. Dy * _Amplitude * cos(f)
  106. );
  107. }
  108. void MyVertext(inout appdata_full v, out Input o) {
  109. UNITY_INITIALIZE_OUTPUT(Input, o);
  110. /* float2 Dirc = normalize(_Direction.xy);
  111. float3 p = v.vertex.xyz;
  112. float k = 2 * UNITY_PI / _Wavelength;
  113. float c = sqrt(9.8 / k);
  114. float f = k * (dot(p.xz, Dirc) - c * _Time.y);
  115. float Dx = Dirc.x;
  116. float Dy = Dirc.y;
  117. p.x += Dx *_Amplitude * cos(f);
  118. p.y += _Amplitude * sin(f);
  119. p.z += Dy *_Amplitude * cos(f);
  120. v.vertex.xyz = p;
  121. float3 tangent = normalize(float3(1 - Dx * Dx * k * _Amplitude * sin(f), k * _Amplitude * cos(f), -Dx * Dy * k * _Amplitude * sin(f)));
  122. float3 bNorm = normalize( float3( - Dx * Dy * k * _Amplitude * sin(f), k * _Amplitude * cos(f),1-Dy * Dy * k * _Amplitude * sin(f)));*/
  123. /* float3 tangent = float3(1, 0, 0);
  124. float3 bNormal = float3(0, 0, 1);
  125. float3 clipPos = v.vertex.xyz;
  126. clipPos += GenerateWave(_Wave1, v.vertex.xyz, tangent, bNormal);
  127. clipPos += GenerateWave(_Wave2, v.vertex.xyz, tangent, bNormal);
  128. clipPos += GenerateWave(_Wave3, v.vertex.xyz, tangent, bNormal);
  129. v.normal =normalize( cross(bNormal, tangent));
  130. v.tangent.xyz = normalize( tangent);
  131. o.VextexNormal = smoothstep(-2, 10, clipPos.y - v.vertex.y);
  132. v.vertex.xyz = clipPos;*/
  133. }
  134. ENDCG
  135. }
  136. FallBack "Diffuse"
  137. }