SuperAPI AI 工具集

shader-graph-best-practices

编程与开发

查看项目

更新于 10-15 11:25

技能介绍

本技能面向使用 Unity Shader Graph(基于节点的可视化着色器编辑器)进行 URP 或 HDRP 项目开发,尤其是移动端目标的场景。当用户涉及 Shader Graph、基于节点的着色器、子图、Custom Function 节点、移动端着色器优化、自定义光照、精度控制等主题时适用。

【触发条件】 涉及 Unity Shader Graph 的视觉着色器编写工作流,或引用 Ben Cloward、Cyanilux、Daniel Ilett 等人的 Shader Graph 教程时触发。

【核心规则】

  • 移动端目标建议节点数保持在 100 以下:每个节点都会编译为着色器指令,超过约 100 个节点后移动 GPU 会触及指令缓存上限,性能急剧下降。
  • 移动端应将图形级精度设为 Half:在 Graph Inspector 中将 Precision 改为 Half,仅对位置和 UV 等个别节点覆盖为 Float。
  • 子图用于组织而非优化:子图提升可读性,但会内联编译,不减少指令数量;其价值在于跨图形复用,降低项目整体维护成本。
  • Custom Function 节点是逃生通道:当着色器图无法高效表达某操作、或简单操作需要过多节点时,用 HLSL 编写 Custom Function 节点,尤其适用于光照访问、复杂数学和平台相关分支。
  • Shader Graph 会自动生成所需各 Pass(ForwardLit、ShadowCaster、DepthOnly、DepthNormals、Meta),无需像 HLSL 那样处理多 Pass,但也无法单独优化各个 Pass。

【在 Shader Graph 中实现自定义光照】 默认 Lit 目标使用 PBR,移动端常需要更简单的光照。可借助 Cyanilux 的自定义光照子图:安装 Cyanilux/URP_ShaderGraphCustomLighting 包后,会向 Shader Graph 添加 MainLight(方向、颜色、阴影衰减)、AdditionalLights(遍历额外光源,移动端慎用)、AmbientSH(球谐环境光)、MainLightShadows(阴影采样)、Cel/Toon Shading(阶梯式光照)等子图节点。 使用模式:将图目标设为 Unlit(关闭 Unity 的 PBR 光照);加入 Cyanilux 的 MainLight 子图获取光方向与颜色;自行计算漫反射 saturate(dot(Normal, LightDirection)) * LightColor;从 AmbientSH 子图加入环境光;乘以反照率贴图;输出到 Unlit 图的 Color 输出。这样可完全控制光照复杂度,对移动端尤为重要,因为 PBR 的多纹理 GGX/Smith BRDF 通常开销过高。

【节点效率技巧】

  • 合并操作:例如将 Multiply → Add → Multiply → Saturate(4 个节点)改为一个 Custom Function 节点 saturate(a * b + c) * d(1 个节点)。
  • 使用 Shader Graph 变量:ShaderGraphVariables 包提供 Register Variable 与 Get Variable 节点,避免在复杂图中重复计算同一数值,相当于代码中的局部变量。
  • 纹理采样效率:使用单个 Sample Texture 2D 节点并拆分通道,而非多次采样同一纹理;法线贴图使用 Type 设为 Normal 的 Sample Texture 2D 节点,会自动处理解包;将遮罩打包进单张纹理的 RGBA 通道。
  • 移动端应避免的高成本节点及其替代方案:Fresnel Effect(中)可手动实现 1 - saturate(dot(ViewDir, Normal)) 后再 Power;Voronoi(高)改为预烘焙到纹理;Gradient Noise(高)改用 Simple Noise 或预烘焙;Triplanar(高,3 次纹理采样)仅用于特定网格,不用于地形;Normal From Height(高)改用真实法线贴图;Custom Render Texture(高)尽可能预烘焙。

【全屏 Shader Graph(Unity 6+)】 Unity 6 引入 Full Screen Shader Graph 用于后处理效果,配合 URP 的 Full Screen Pass Renderer Feature 使用:新建目标为 Full Screen 的 Shader Graph;图接收 URP 的相机颜色与深度作为输入;应用后处理效果(暗角、色彩校正等);在 URP Renderer 上添加 Full Screen Pass Renderer Feature;指定该 Full Screen Shader Graph 材质。移动端注意:每次 Full Screen 通道都是一次全屏 blit,应尽可能将多个效果合并到单个 Full Screen 图中。

【移动端检查清单】 图形级精度设为 Half;在需要处将位置与 UV 节点覆盖为 Float;节点总数 < 100;不使用 Voronoi 或 Gradient Noise 节点(改为预烘焙);若光照简单,使用 Unlit 目标加自定义光照而非 Lit 目标;纹理采样 ≤ 4;不在大面积表面使用 Triplanar;使用子图进行组织与复用;可切换特性使用 shader_feature(而非 multi_compile)关键字;在目标分辨率下于 Shader Graph 预览中测试。

【参考资源】 仓库:Cyanilux Custom Lighting Sub-Graphs(https://github.com/Cyanilux/URP_ShaderGraphCustomLighting)、Cyanilux Shader Graph Variables(https://github.com/Cyanilux/ShaderGraphVariables)、Unity Shader Graph Example Library(https://github.com/UnityTechnologies/ShaderGraph_ExampleLibrary)、Unity Production Ready Shader Graph Samples(https://docs.unity3d.com/Packages/com.unity.shadergraph@17.4/manual/Shader-Graph-Sample-Production-Ready-Detail.html)。 教程:Cyanilux Intro to Shader Graph(2025 年 3 月,https://www.cyanilux.com/tutorials/intro-to-shader-graph/)、Daniel Ilett 10+ 部分 Shader Graph Basics(https://danielilett.com/)、Ben Cloward 每周 Shader Graph 教程(YouTube 与 https://www.bencloward.com)、MinionsArt 约 200 篇 Shader Graph 教程(https://minionsart.github.io/tutorials/)。 关键人物:Ben Cloward(前 Unity Shader Graph 团队,现就职于 ILM,每周发布 Unreal 与 Unity Shader Graph 教程)、Cyanilux(维护最活跃的 URP Shader Graph 仓库,涉及自定义光照、代码模板、变量)、Daniel Ilett(Shader Graph Basics 系列作者,著有《Building Quality Shaders for Unity》)、MinionsArt(Joyce,基于 GIF 的快速着色器技巧,200 篇教程)、Gabriel Aguiar(VFX Graph 与 Shader Graph 教程,涉及传送门、水、龙卷风)。 其他来源:Cyanilux Shader Graph Tutorials(https://www.cyanilux.com/)、Daniel Ilett Shader Graph Basics(https://danielilett.com/)、Shader Graph: Precision Modes(https://docs.unity3d.com/Packages/com.unity.shadergraph@6.9/manual/Precision-Modes.html)、Quick Unity Tips: Under 100 Nodes for Mobile(https://quickunitytips.blogspot.com/2025/11/unity-shader-optimization-guide-2025.html)、80.lv: URP Render Graph in Unity 6(https://80.lv/articles/introduction-to-urp-s-render-graph-in-unity-6)。

【限制】 资料未提供具体的收费、价格或平台支持信息;部分性能建议为经验性阈值,实际表现可能依项目与设备而异。