Shader "Custom/LeafWindShaderWithDisplacement" { Properties { [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {} [HDR] _Color ("Color", Color) = (1, 1, 1, 1) _ShakeAmplitude ("Shake Amplitude", Range(0, 0.5)) = 0.1 _ShakeSpeed ("Shake Speed", Range(0, 5)) = 1 _ShakeX ("Shake X", Range(-1, 1)) = 0 _ShakeY ("Shake Y", Range(-1, 1)) = 0 _ShakeZ ("Shake Z", Range(-1, 1)) = 0 _Alpha ("Alpha", Range(0, 1)) = 1 _VertexDisplacementRandomness ("Vertex Displacement Randomness", Range(0, 1)) = 0.1 _VertexDisplacementLag ("Vertex Displacement Lag", Range(0, 1)) = 0.1 } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata_t { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _Color; float _ShakeAmplitude; float _ShakeSpeed; float _ShakeX; float _ShakeY; float _ShakeZ; float _Alpha; float _VertexDisplacementRandomness; float _VertexDisplacementLag; v2f vert (appdata_t v) { v2f o; // Apply vertex shaking float displacementFactor = 1.0 - _VertexDisplacementRandomness + _VertexDisplacementRandomness * (1 - 2 * frac(_Time.y * _VertexDisplacementLag + v.vertex.x * 0.1)); float3 shakeOffset = float3(_ShakeX, _ShakeY, _ShakeZ) * _ShakeAmplitude * sin(_Time.y * _ShakeSpeed + v.vertex.x * 0.1) * displacementFactor; v.vertex.xyz += shakeOffset; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv) * _Color; clip(col.a - 0.1); if (col.a < _Alpha) { discard; } return col; } ENDCG } } }