Unity3D:着色器中的条件

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

着色器中的条件

有时,您希望同一着色器在不同情况下执行不同的操作。例如,您可能希望为不同的材质配置不同的设置,为不同的硬件定义功能,或在运行时动态更改着色器的行为。您可能还希望避免在不需要时执行计算成本高昂的代码,例如纹理读取、顶点输入、插值器或循环。

您可以使用条件来定义 GPU 仅在特定条件下执行的行为。

不同类型的条件

若要在着色器中使用条件,可以使用以下方法:

  • 静态分支:着色器编译器在编译时计算条件代码。
  • 动态分支:GPU 在运行时评估条件代码。
  • 着色器变体:Unity 使用静态分支将着色器源代码编译为多个着色器程序。然后,Unity 使用在运行时与条件匹配的着色器程序。

何时使用哪种类型的条件

着色器中的条件没有“一刀切”的方法,您应该考虑给定项目中给定着色器的每种方法的优缺点。

请记住以下信息:

  • 如果您在编译时知道条件(例如,如果您知道您正在为给定硬件构建),那么静态分支可能是最佳选择。静态分支代码易于编写和维护,并且不会对生成时间、文件大小或运行时性能产生负面影响。但是,不能使用它在运行时针对不同的条件执行代码。
  • 如果需要在运行时针对不同的条件执行代码,应考虑以下选项:
  • 着色器变体不会对 GPU 性能造成任何影响。但是,项目中的大量着色器变体可能会导致重大问题:增加构建时间、文件大小、运行时内存使用量和加载时间。着色器变体在手动预加载(“预热”)着色器时还会引入额外的代码复杂性。
  • 动态分支会导致 GPU 性能损失,根据着色器代码和硬件的不同,性能损失可能很小或很大。但是,它允许您在运行时使用条件,而无需增加项目中着色器变体的数量。
  • 可以创作着色器代码,以避免分支或变体,而是使用返回 0 或 1 的数学运算来执行条件代码。这可能会导致难以维护的复杂代码。根据具体情况,与动态分支相比,它可能只会导致非常小的性能改进,或者根本没有优势。

通常,最好的方法是分析应用程序的性能,并逐个案例仔细考虑决策。例如,如果您能够承受略微增加的 GPU 成本,则最好使用动态分支来实现“足够好”的 GPU 性能并降低引入更多变体的风险。但是,如果 GPU 性能是此着色器的主要关注点,并且您已经考虑了其他变体的成本,则可以选择使用变体。

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

上一篇:Unity3D:异步着色器编译 (mvrlink.com)

下一篇:Unity3D:着色器中的分支 (mvrlink.com)

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