FixedStartWave.shader 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. Shader "Custom/FixedStartWave"
  2. {
  3. Properties
  4. {
  5. _Amplitude("Amplitude", Float) = 0.5
  6. _WaveLength("Wave Length", Float) = 1.0 // 控制波长(单位宽度)
  7. //_Frequency("Frequency", Float) = 6 // 波数,控制波长
  8. _Speed("Wave Speed", Float) = 1
  9. //_TimeValue("Time", Float) = 0
  10. _AnchorX("Anchor X", Float) = 0
  11. _MainTex("Texture", 2D) = "white" {}
  12. }
  13. SubShader
  14. {
  15. Tags { "RenderType" = "Opaque" }
  16. Pass
  17. {
  18. CGPROGRAM
  19. #pragma vertex vert
  20. #pragma fragment frag
  21. #include "UnityCG.cginc"
  22. struct appdata
  23. {
  24. float4 vertex : POSITION;
  25. float2 uv : TEXCOORD0;
  26. };
  27. struct v2f
  28. {
  29. float4 vertex : SV_POSITION;
  30. float2 uv : TEXCOORD0;
  31. };
  32. float _Amplitude;
  33. float _WaveLength;
  34. float _Speed;
  35. float _AnchorX;
  36. sampler2D _MainTex;
  37. v2f vert(appdata v)
  38. {
  39. v2f o;
  40. float x = v.vertex.x;
  41. //float relativeX = x - _AnchorX;
  42. // 波动值
  43. //float wavePhase = _Frequency * relativeX - _Speed * _TimeValue;
  44. float relativeX = v.vertex.x - _AnchorX;
  45. float wavePhase = (2 * UNITY_PI * relativeX / _WaveLength) - _Speed * _Time.y;
  46. //float wavePhase = _Frequency * relativeX - _Speed * _Time.y;
  47. float yOffset = _Amplitude * sin(wavePhase);
  48. // 起点偏移,确保锚点y=0固定
  49. //float anchorOffset = _Amplitude * sin(-_Speed * _TimeValue);
  50. float anchorOffset = _Amplitude * sin((2 * UNITY_PI * 0 / _WaveLength) - _Speed * _Time.y);
  51. //float anchorOffset = _Amplitude * sin(-_Speed * _Time.y);
  52. v.vertex.y += yOffset - anchorOffset;
  53. o.vertex = UnityObjectToClipPos(v.vertex);
  54. o.uv = v.uv;
  55. return o;
  56. }
  57. fixed4 frag(v2f i) : SV_Target
  58. {
  59. return tex2D(_MainTex, i.uv);
  60. }
  61. ENDCG
  62. }
  63. }
  64. }