着色器ColorMask和ScrollView Mask导致材质无法更新

时间:2018-05-18 23:50:09

标签: unity3d hlsl

我有以下着色器,基于我多年前创建的着色器处理进度条类型对象,类似于Alpha Cutoff,但有一些更改。

其中一项更改是允许着色器在UI [HideInInspector]上正常运行的一系列Images属性。但是,ColorMask属性(部分负责ScrollRect查看屏蔽区域之外的剪切对象)会导致材料在其值更改时无法正确更新。

Example behavior

  1. 图片未更新,由ScrollRect屏蔽
  2. 图形更新,未屏蔽
  3. 如果删除_ColorMask属性(和ColorMask[_ColorMask]),则会发生这种情况:

    Bad

    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
            }
        }
    }
    

    我该如何解决这个问题?

0 个答案:

没有答案