You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:41:29