Unity内置Shader能否同时支持Cutout与可调控的Transparency效果?
实现支持Cutout与独立透明度调控的Unity内置Shader
当然可以实现这类Shader。核心是将Cutout的裁剪逻辑和非裁剪区域的透明度调控拆分开,用独立参数控制,避免互相干扰。下面是基于Unity内置Standard Cutout Shader修改的版本,完全符合你的需求:
Shader "Custom/Standard Cutout with Opacity" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 _Cutoff ("Alpha Cutoff", Range(0,1)) = 0.5 _Opacity ("Non-Cutout Opacity", Range(0,1)) = 1.0 // 新增:控制非裁剪区域的整体透明度 } SubShader { Tags { "RenderType"="TransparentCutout" "Queue"="AlphaTest" "IgnoreProjector"="True" } LOD 200 CGPROGRAM // 采用Standard光照模型,开启alpha测试,同时支持透明度混合 #pragma surface surf Standard alphatest:_Cutoff alpha:blend #pragma target 3.0 sampler2D _MainTex; struct Input { float2 uv_MainTex; }; half _Glossiness; half _Metallic; fixed4 _Color; fixed _Opacity; // 声明透明度参数 void surf (Input IN, inout SurfaceOutputStandard o) { // 采样纹理并叠加颜色 fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; // 金属度和光滑度保持原逻辑 o.Metallic = _Metallic; o.Smoothness = _Glossiness; // 关键:先通过alpha测试裁剪像素(仅判断原纹理alpha是否低于_Cutoff) // 裁剪后,非透明区域的最终alpha = 原alpha * _Opacity o.Alpha = c.a * _Opacity; } ENDCG } FallBack "Standard/Cutout" }
关键逻辑说明:
- Cutout效果保留:通过
alphatest:_Cutoff指令,Unity会自动对片元的alpha值进行裁剪判断——只要原纹理的alpha低于_Cutoff,该像素就会被丢弃,完全保留Cutout的硬边缘效果。 - 独立透明度调控:新增的
_Opacity参数仅作用于通过裁剪的像素,将其最终alpha值乘以_Opacity,实现非裁剪区域的整体透明度调节,且不会改变Cutout的阈值判断逻辑。 - 渲染队列设置:保持
Queue="AlphaTest"确保Cutout的正确渲染顺序,同时开启alpha:blend支持透明度混合,让_Opacity的调节生效。
内容的提问来源于stack exchange,提问作者WILEz
相关产品推荐
相关产品推荐

