WaterWave Effect.shader 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. Shader "Custom/WaterWave Effect"
  2. {
  3. Properties
  4. {
  5. _MainTex("Base (RGB)", 2D) = "white" {}
  6. }
  7. SubShader
  8. {
  9. Pass
  10. {
  11. ZTest Always
  12. Cull Off
  13. ZWrite Off
  14. Fog{ Mode off }
  15. CGPROGRAM
  16. #pragma vertex vert_img
  17. #pragma fragment frag
  18. #pragma fragmentoption ARB_precision_hint_fastest
  19. #include "UnityCG.cginc"
  20. uniform sampler2D _MainTex;
  21. float4 _MainTex_TexelSize;
  22. uniform float _distanceFactor;
  23. uniform float _timeFactor;
  24. uniform float _totalFactor;
  25. uniform float _wavePower;
  26. uniform float _timeFade;
  27. uniform float4 _startPos;
  28. uniform float _effectDis;
  29. fixed4 frag(v2f_img i) : SV_Target
  30. {
  31. //DX下纹理坐标反向问题
  32. #if UNITY_UV_STARTS_AT_TOP
  33. if (_MainTex_TexelSize.y < 0)
  34. _startPos.y = 1 - _startPos.y;
  35. #endif
  36. //计算uv到中间点的向量(向外扩,反过来就是向里缩)
  37. float2 dv = _startPos.xy - i.uv;
  38. //按照屏幕长宽比进行缩放
  39. dv *= float2(_ScreenParams.x / _ScreenParams.y, 1);
  40. //计算像素点距中点的距离
  41. float dis = sqrt(dv.x * dv.x + dv.y * dv.y);
  42. float2 uv = i.uv;
  43. if (_effectDis == 0 || dis < _effectDis)
  44. {
  45. //用sin函数计算出波形的偏移值factor
  46. //dis在这里都是小于1的,所以我们需要乘以一个比较大的数,比如60,这样就有多个波峰波谷
  47. //sin函数是(-1,1)的值域,我们希望偏移值很小,所以这里我们缩小100倍,据说乘法比较快,so...
  48. float sinFactor = sin(dis * _distanceFactor + _Time.y * _timeFactor) * _totalFactor * 0.01;
  49. //计算每个像素uv的偏移值
  50. float2 offset = normalize(dv) * sinFactor;
  51. //像素采样时偏移offset
  52. uv += offset * pow(dis, _wavePower) * _timeFade;
  53. }
  54. fixed4 c = tex2D(_MainTex, uv);
  55. return c;
  56. }
  57. ENDCG
  58. }
  59. }
  60. Fallback off
  61. }