Unity3D:着色器中的分支

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

着色器中的分支

分支是将条件行为引入着色器代码的一种方法。

本页包含有关以下技术的信息:

  • 静态分支
  • 动态分支

有关着色器代码中的条件以及何时使用哪种技术的一般概述,请参阅着色器代码中的条件。

静态分支

当着色器程序包括在编译时计算的条件时,它使用静态分支。编译器从未使用的分支中排除代码,因此它不会出现在编译的着色器程序中。

在内部,Unity 在创建着色器变体时使用静态分支;但是,静态分支本身没有任何着色器变体的性能缺点。

静态分支的优缺点

静态分支的主要优点是它不会对运行时性能产生负面影响。静态分支的主要缺点是只能在编译时使用它。

静态分支意味着编译器从着色器程序中排除不需要的代码。它会产生仅包含必要代码的小型专用着色器程序。静态分支没有运行时性能成本;事实上,较小的程序可能会导致更快的加载时间和更低的运行时内存使用量。

若要使用静态分支,条件在编译时必须是常量。这意味着您不能使用它在运行时针对不同的条件执行代码。

如何使用静态分支

可以通过以下方式在着色器中使用静态分支:

  • 在手动编码的着色器中:
  • 使用   #if#elif#else和#endif预处理器指令,或#ifdef#ifndef预处理器指令来创建静态分支。
  • 使用计算编译时常量值的 if 语句。尽管语句也可用于动态分支,但编译器会检测编译时常量值并改为创建静态分支。if
  • Unity 为某些编译时常量提供了内置宏,您可以将这些宏与静态分支一起使用。

注意:静态分支仅在手动编码的着色器中可用。不能在着色器图中创建静态分支。

动态分支

当着色器程序包括在运行时计算的条件时,它使用动态分支。

有两种类型的动态分支:基于统一变量的动态分支和基于任何其他运行时值的动态分支。基于统一的分支通常更有效,因为整个绘制调用的统一值是恒定的。

动态分支的优缺点

动态分支的主要优点是,它允许您在运行时使用条件,而无需增加项目中着色器变体的数量。动态分支的主要缺点是会影响 GPU 性能。

GPU 性能影响因硬件和着色器代码而异。原因是:

  • 基于非均匀变量的分支意味着 GPU 必须同时执行不同的操作(从而破坏并行性),或者“扁平化分支”并通过对两个分支执行操作然后丢弃一个结果来保持并行性。基于统一变量的分支意味着 GPU 必须展平分支。这两种方法都会导致 GPU 性能降低。
  • 对于任何类型的动态分支,GPU 必须在最坏的情况下分配寄存器空间。如果一个分支比另一个分支成本高得多,这意味着 GPU 会浪费寄存器空间。这可以减少并行调用着色器程序的次数,从而降低性能。

通常,如果代码在统一值上分支,并且两个分支具有大致相似的工作负载,则对 GPU 性能的影响可能很小。但是,您应该始终分析您的应用程序,并逐案考虑优点和缺点。

注意:动态分支还可能导致大型着色器程序,因为所有条件的代码都编译到同一个着色器程序中。但是,这些较大文件对加载时间和内存使用量的影响通常不如着色器变体的影响显著。

有关在着色器中使用条件的其他方法以及如何确定哪种技术适合您的用例的信息,请参阅着色器中的条件。

如何使用动态分支

可以通过以下方式在着色器中使用动态分支:

  • 在手动编码的着色器中,使用 if 语句来计算运行时状态。您可以使用属性强制 GPU 执行两个分支,或仅执行一个分支。
  • 在着色器图中,使用分支节点。这始终执行两个分支。

3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D:着色器中的条件 (mvrlink.com)

下一篇:Unity3D:着色器变体 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号