-
添加一个
_SolidColor
属性,用于指定纯色。 -
添加一个
_UseSolidColor
属性,用于控制是否启用纯色模式。 -
在片段着色器中,根据
_UseSolidColor
的值决定是否将图像替换为纯色。
以下是修改后的Shader代码:
Shader "Demo/SpriteShader"
{Properties{[PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}_Color ("Alpha Color Key", Color) = (0,0,0,1)_Range("Range", Range(0, 1.01)) = 0.1_SolidColor("Solid Color", Color) = (1,1,1,1) // 新增:纯色属性_UseSolidColor("Use Solid Color", Float) = 0 // 新增:是否启用纯色模式[MaterialToggle] PixelSnap ("Pixel snap", Float) = 0}SubShader{Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "PreviewType"="Plane""CanUseSpriteAtlas"="True"}// 关键修复:添加Stencil块以支持Mask组件Stencil{Ref 1Comp EqualPass KeepFail Keep}Pass{Cull OffLighting OffZWrite OffBlend SrcAlpha OneMinusSrcAlphaCGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile _ PIXELSNAP_ONsampler2D _MainTex;float4 _Color;half _Range;float4 _SolidColor; // 新增:纯色属性float _UseSolidColor; // 新增:是否启用纯色模式struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float4 vertex : SV_POSITION;float2 uv : TEXCOORD0;};v2f vert(appdata v){v2f o;o.vertex = UnityObjectToClipPos(v.vertex);o.uv = v.uv;#ifdef PIXELSNAP_ONo.vertex = UnityPixelSnap(o.vertex);#endifreturn o;}half4 frag(v2f IN) : SV_Target{half4 c = tex2D(_MainTex, IN.uv);// 计算颜色差值half3 diff = abs(c.rgb - _Color.rgb);half maxDiff = max(diff.r, max(diff.g, diff.b));// 使用clip函数直接丢弃像素,兼容AlphaTestclip(maxDiff - _Range);// 新增:纯色模式if (_UseSolidColor > 0.5){c.rgb = _SolidColor.rgb; // 替换为纯色c.a *= _SolidColor.a; // 保留原始Alpha值,与纯色的Alpha混合}return c;}ENDCG}}
}
新增功能说明
-
_SolidColor
属性-
用于指定纯色的颜色值。
-
在材质面板中可以调整颜色。
-
-
_UseSolidColor
属性-
用于控制是否启用纯色模式。
-
值为
1
时启用纯色模式,值为0
时禁用。
-
-
纯色模式逻辑
-
在片段着色器中,如果
_UseSolidColor > 0.5
,则将像素颜色替换为_SolidColor
。 -
同时保留原始Alpha值,与
_SolidColor
的Alpha混合,确保透明效果正确。
-
使用示例
-
创建材质
-
将Shader赋给一个材质。
-
在材质面板中设置
_SolidColor
为你想要的纯色(例如红色(1,0,0,1)
)。 -
勾选
_UseSolidColor
启用纯色模式。
-
-
应用到RawImage
-
将材质赋给
RawImage
组件。 -
运行场景,观察图像是否被替换为纯色。
-
-
动态切换纯色模式
-
可以通过脚本动态修改
_UseSolidColor
的值,实现纯色模式的开关:
-
Material material = rawImage.material;
material.SetFloat("_UseSolidColor", 1); // 启用纯色模式
material.SetFloat("_UseSolidColor", 0); // 禁用纯色模式
效果展示
-
禁用纯色模式
图像正常显示,抠图逻辑生效。 -
启用纯色模式
图像被替换为指定的纯色,同时保留抠图逻辑(透明区域仍然透明)。
注意事项
-
Alpha混合
-
如果
_SolidColor
的Alpha值小于1
,图像会与背景混合。 -
如果需要完全不透明,可以将
_SolidColor
的Alpha值设为1
。
-
-
性能优化
-
如果不需要动态切换纯色模式,可以将
_UseSolidColor
设为材质常量,避免每帧上传。
-
-
兼容性
-
该Shader兼容
Mask
组件,确保裁剪效果正常。
-
通过以上修改,你的Shader现在既能实现抠图功能,又能将图像处理为纯色,满足更多使用场景!