如何让ScrollView中带渐变Shader的Material被正确剔除?
解决ScrollView中渐变Shader不被边界剔除的问题
你的渐变Shader无法被ScrollView边界剔除,核心原因是没适配UI的模板(Stencil)裁剪机制,同时缺少UI裁剪逻辑、未正确处理主纹理Alpha。以下是修改方案:
修改步骤及完整代码
"Custom/SpriteGradient" { Properties{ [PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {} _Color("Left Color", Color) = (1,1,1,1) _Color2("Right Color", Color) = (1,1,1,1) _Scale("Scale", Float) = 1 // UI系统必需的模板属性 _StencilComp("Stencil Comparison", Float) = 8 _Stencil("Stencil ID", Float) = 0 _StencilOp("Stencil Operation", Float) = 0 _StencilWriteMask("Stencil Write Mask", Float) = 255 _StencilReadMask("Stencil Read Mask", Float) = 255 _ColorMask("Color Mask", Float) = 15 _ClipRect("Clip Rect", Vector) = (-32767, -32767, 32767, 32767) } SubShader{ Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane" "CanUseSpriteAtlas"="True" } LOD 100 ZWrite Off Blend SrcAlpha OneMinusSrcAlpha Cull Off // 启用模板测试,适配UI Mask Stencil { Ref [_Stencil] Comp [_StencilComp] Pass [_StencilOp] ReadMask [_StencilReadMask] WriteMask [_StencilWriteMask] } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "UnityUI.cginc" sampler2D _MainTex; fixed4 _Color; fixed4 _Color2; fixed _Scale; float4 _ClipRect; fixed4 _TextureSampleAdd; struct appdata_t { float4 vertex : POSITION; float2 texcoord : TEXCOORD0; float4 color : COLOR; }; struct v2f { float4 pos : SV_POSITION; float2 uv : TEXCOORD0; fixed4 col : COLOR; float4 worldPosition : TEXCOORD1; }; v2f vert(appdata_t v) { v2f o; o.worldPosition = v.vertex; o.pos = UnityObjectToClipPos(o.worldPosition); o.uv = v.texcoord; // 结合渐变颜色和顶点色 o.col = lerp(_Color, _Color2, v.texcoord.x) * v.color; return o; } float4 frag(v2f i) : COLOR { // 采样主纹理,保留Alpha通道 fixed4 texColor = tex2D(_MainTex, i.uv) + _TextureSampleAdd; fixed4 finalColor = i.col * texColor; // UI裁剪判断,超出ClipRect的部分直接丢弃 finalColor.a *= UnityGet2DClipping(i.worldPosition.xy, _ClipRect); return finalColor; } ENDCG } } FallBack "UI/Default" }
关键修改说明
- 模板测试配置:添加
Stencil块,直接使用Properties中定义的模板参数,让Shader遵守ScrollView的Mask规则,实现边界剔除。 - UI渲染适配:修改Tags为UI专用的
Transparent队列,关闭ZWrite并启用Alpha混合,符合UI的渲染逻辑。 - 裁剪逻辑支持:引入
UnityUI.cginc,添加_ClipRect属性,在片元着色器中调用UnityGet2DClipping判断像素是否在裁剪范围内,超出则Alpha置0。 - 主纹理处理:采样
_MainTex并结合渐变颜色,保留纹理的Alpha通道,确保Image的遮罩和裁剪正常工作。 - 顶点色支持:将渐变颜色与顶点色相乘,兼容UI元素的颜色调整功能。
内容的提问来源于stack exchange,提问作者Kastor438
相关产品推荐
相关产品推荐

