unity3d 着色器ColorMask和ScrollView Mask导致材质不更新

pgky5nke  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(340)

我已经得到了下面的着色器,基于我几年前创建的一个着色器来处理进度条类型的对象,类似于Alpha截止,但有一些变化。
其中一项变更是[HideInInspector]属性系列,可让着色器在UI Images上正常运作。但是,ColorMask属性(部分负责ScrollRect检视裁剪遮色片区域外的对象)会导致材料在其值变更时无法正确更新。

1.图形未更新,被ScrollRect遮盖
1.图形更新,不屏蔽
如果删除了_ColorMask属性(和ColorMask[_ColorMask]),则会发生以下情况:

Shader "Unlit/AlphaCutoffAA_UI" {
    Properties {
        _MainTex ("Base (RGB)", 2D) = "white" {}
        _Color("Color Multiplier", Color) = (1, 1, 1, 1) // color
        _Cutoff ("Cutoff", Range(0,1)) = 0.5
        _Blend ("Blend Range", Range(0,.2)) = 0.1

        [HideInInspector]_StencilComp("Stencil Comparison", Float) = 8
        [HideInInspector]_Stencil("Stencil ID", Float) = 1
        [HideInInspector]_StencilOp("Stencil Operation", Float) = 0
        [HideInInspector]_StencilWriteMask("Stencil Write Mask", Float) = 255
        [HideInInspector]_StencilReadMask("Stencil Read Mask", Float) = 255
        [HideInInspector]_ColorMask("Color Mask", Float) = 15  //adding this breaks everything
    }
    SubShader {
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
        Blend SrcAlpha OneMinusSrcAlpha
        LOD 100

        Lighting Off

        Stencil
        {
            Ref[_Stencil]
            Comp[_StencilComp]
            Pass[_StencilOp]
            ReadMask[_StencilReadMask]
            WriteMask[_StencilWriteMask]
        }
        ColorMask[_ColorMask]

        Pass {  
            CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag

                #include "UnityCG.cginc"

                struct appdata_t {
                    float4 vertex : POSITION;
                    float2 texcoord : TEXCOORD0;
                };

                struct v2f {
                    float4 vertex : SV_POSITION;
                    half2 texcoord : TEXCOORD0;
                };

                sampler2D _MainTex;
                float4 _MainTex_ST;
                fixed _Cutoff;
                fixed _Blend;
                float4 _Color;

                v2f vert (appdata_t v)
                {
                    v2f o;
                    o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                    o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                    return o;
                }

                fixed4 frag (v2f i) : COLOR
                {
                    fixed4 col = tex2D(_MainTex, i.texcoord);
                    if(col.a < _Cutoff) {
                        col.a = 0;
                    }
                    else if (col.a == 1) {
                        col.a = 1.0;
                    }
                    else if(col.a < _Cutoff + _Blend) {
                        col.a = (col.a - _Cutoff + (_Blend/100)) / _Blend;
                    }
                    else {
                        col.a = 1.0;
                    }
                    col.r *= _Color.r;
                    col.g *= _Color.g;
                    col.b *= _Color.b;
                    col.a *= _Color.a;
                    return col;
                }
            ENDCG
        }
    }
}

我该如何解决这个问题?

vybvopom

vybvopom1#

我也想知道这个问题的正确答案。我发现的一个解决方法是在改变材料属性后禁用并重新启用图像/原始图像。例如

Image.material.SetColor("_blah", color);
Image.enabled = false;
Image.enabled = true;

相关问题