Shader "Custom/ParticleUnlitLocalYGradient" { Properties { _Color1 ("Color 1", Color) = (1, 1, 1, 1) _Color2 ("Color 2", Color) = (0, 0, 0, 1) _GradientRange ("Gradient Range", Vector) = (0, 1, 0, 0) } SubShader { Tags { "Queue" = "Overlay" } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma exclude_renderers gles xbox360 ps3 struct appdata_t { float4 vertex : POSITION; float4 color : COLOR; }; struct v2f { float4 pos : POSITION; float4 color : COLOR; float localY : TEXCOORD0; }; float4 _Color1; float4 _Color2; float4 _GradientRange; // xy 是范围的最小值和最大值 v2f vert (appdata_t v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.color = v.color; // 将模型空间的 Y 坐标传递到片段着色器 o.localY = v.vertex.y; return o; } fixed4 frag (v2f i) : SV_Target { // 计算渐变的值 float gradient = (i.localY - _GradientRange.x) / (_GradientRange.y - _GradientRange.x); gradient = clamp(gradient, 0.0, 1.0); // 确保渐变值在 0 到 1 之间 // 线性插值两种颜色 fixed4 interpolatedColor = lerp(_Color1, _Color2, gradient); return interpolatedColor * i.color; } ENDCG } } FallBack "Diffuse" }