Unity 6中Shader转Shader Graph实现战争迷雾问题求助
用Shader Graph复刻俯视角战争迷雾Shader的解决方案
原CG实现的战争迷雾Shader代码如下:
Shader "Hidden/FogOfWar" { Properties { _MainTex ("Main Texture", 2D) = "white" {} _SecondaryTex ("Secondary Texture", 2D) = "white" {} } SubShader { Tags { "Queue" = "Transparent+1" // makes it sort using sorting layer and not default to z value } Pass { Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } sampler2D _MainTex; sampler2D _SecondaryTex; fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); col.a = 1 - col.r; return fixed4(0,0,0,col.a); } ENDCG } } }
这段Shader通过纯红色精灵对象搭配纯黑色输入材质显示迷雾区域,设置"Queue" = "Transparent+1"时效果正常,但改用Shader Graph复刻时无法实现预期效果;将原Shader Queue改为"Transparent"可正常工作,但需求是仅通过Shader Graph生成的Shader解决问题。
Shader Graph复刻步骤
1. 初始化Shader Graph
- 新建Unlit Graph(原Shader为无光照逻辑),在Graph Settings中设置:
- Surface Type:
Transparent - Blend Mode:
Alpha Blend(对应原Shader的Blend SrcAlpha OneMinusSrcAlpha)
- Surface Type:
2. 还原片段着色逻辑
- 添加
Texture2D节点,命名为MainTex(对应原Shader的_MainTex属性)。 - 添加
Sample Texture 2D节点,连接MainTex与默认的UV节点,完成纹理采样。 - 提取采样结果的R通道,接入
One Minus节点取反(对应原Shader的1 - col.r),将输出连接到Graph的Alpha端口。 - 将Graph的RGB端口固定为
(0, 0, 0)(对应原Shader返回的黑色迷雾颜色)。
3. 配置渲染队列(匹配Transparent+1)
原Shader的Transparent+1队列是为了让迷雾渲染在普通透明物体之后,Shader Graph中按以下方式设置:
- 在Graph Settings的Render Queue选项中,选择
Custom并输入3001(Transparent队列默认值为3000,+1即3001);或选择Transparent后手动修改为Transparent+1。 - 确保Sorting Layer设置与原场景一致,保证渲染按排序层而非Z值排序。
4. 材质与场景验证
- 给Shader Graph生成的材质赋值纯黑色的
MainTex。 - 使用纯红色精灵对象测试,确认迷雾区域显示正常。
常见问题排查
- 检查Shader Graph的Z Write是否关闭(透明Shader默认关闭,与原Shader逻辑一致),避免遮挡问题。
- 确认精灵的Sorting Layer和Order in Layer与原场景设置匹配,防止渲染顺序错误。
内容的提问来源于stack exchange,提问作者Snedden27
相关产品推荐
相关产品推荐

