我已经得到了下面的着色器,基于我几年前创建的一个着色器来处理进度条类型的对象,类似于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
}
}
}
我该如何解决这个问题?
1条答案
按热度按时间vybvopom1#
我也想知道这个问题的正确答案。我发现的一个解决方法是在改变材料属性后禁用并重新启用图像/原始图像。例如