Unity Shader Graph:单个着色器实现光照/无光照过渡及对象自定义雾效?
在Unity 2021.3 URP的ShaderGraph中实现对象级个性化雾效过渡
核心思路
直接在单个ShaderGraph内完成光照渲染结果与固定雾色的线性混合,通过[0…1]范围的控制因子实现平滑过渡,无需依赖全局雾效或复杂渲染扩展,适合新手快速落地需求。
具体实现步骤
1. 初始化ShaderGraph
- 创建一个
URP Lit Shader Graph(保留光照逻辑的基础模板),进入Graph编辑界面。 - 在Graph Settings中确认Surface Type设为Opaque(半透明对象可按需调整,不透明场景下过渡效果更稳定)。
2. 添加自定义参数
在Blackboard面板新增以下参数:
- Float类型:命名为
FogBlendFactor,设置范围为0到1,默认值0。这是过渡效果的核心控制变量。 - Color类型:命名为
FixedFogColor,预设你需要的固定雾色(比如常用的灰蓝色调)。
3. 搭建混合逻辑节点
按以下顺序连接节点:
- 获取
Lit Master节点的Base Color与Emission输出(两者之和为对象的最终光照渲染色),可通过Add节点合并这两个输出。 - 添加
Lerp节点(线性插值):- 将
Lerp的A端口连接到合并后的光照渲染色; - 将
Lerp的B端口连接到FixedFogColor参数; - 将
Lerp的T端口连接到FogBlendFactor参数。
- 将
- 将
Lerp节点的输出连接回Lit Master的Base Color输入端口,替换原有的Base Color连接。
4. 可选:基于距离的自动过渡
如果需要让对象随距离相机的远近自动触发雾效过渡,可把FogBlendFactor替换为动态计算值:
- 添加
Object Space Position和Camera Space Position节点,计算顶点到相机的距离; - 添加
Remap节点,将距离值映射到[0…1]范围(例如:0-5米对应0,5-10米对应1),把Remap的输出作为Lerp的T值。
5. 测试与调试
- 将Shader挂载到目标3D对象上,在Inspector面板调整参数:
FogBlendFactor=0:对象显示完整光照效果;FogBlendFactor=1:对象完全变为固定雾色;- 中间值:平滑过渡两种状态。
方案优势
- 全Shader内实现,无需后期处理、RendererFeature等复杂机制,新手易理解;
- 每个对象独立控制雾色与过渡程度,完全不受全局雾效限制,适配多相机、多图层场景;
- 逻辑简洁,性能开销低,适配大量对象的场景。
内容的提问来源于stack exchange,提问作者SpartanzNeverDie
相关产品推荐
相关产品推荐

