Unity3D :可编程渲染管线批处理器

Unity3D :可编程渲染管线批处理器
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

可编程渲染管线批处理器

可编程渲染管线 (SRP) 批处理器是一种绘制调用优化,可显著提高使用 SRP 的应用程序的性能。SRP 批处理器减少了 Unity 为使用相同着色器变体的材质准备和调度绘制调用所需的 CPU 时间。

可编程渲染管线 (SRP) 批处理器减少了 Unity 使用许多使用相同着色器变体的材质渲染场景所需的 CPU 时间。
可编程渲染管线 (SRP) 批处理器减少了 Unity 使用许多使用相同着色器变体的材质渲染场景所需的 CPU 时间。

要求和兼容性

本部分包含有关 SRP 批处理器的渲染管线兼容性的信息。

渲染管线兼容性

功能内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义可编程渲染管线 (SRP)
SRP 配料机

游戏对象兼容性

在任何给定的场景中,有些游戏对象与 SRP 批处理器兼容,有些则不兼容。兼容的游戏对象使用 SRP 批处理器代码路径,不兼容的游戏对象使用标准 SRP 代码路径。有关详细信息,请参阅 SRP 批处理器的工作原理。

游戏对象必须满足以下要求才能与 SRP 批处理器代码路径兼容:

  • 游戏对象必须包含网格或蒙皮网格。它不可能是粒子。
  • 游戏对象不得使用 MaterialPropertyBlocks。
  • 游戏对象使用的着色器必须与 SRP 批处理器兼容。有关详细信息,请参阅着色器兼容性。

着色器兼容性

高清渲染管线 (HDRP) 和通用渲染管线 (URP) 中的所有光照和不光照着色器都符合此要求(这些着色器的粒子版本除外)。

要使自定义着色器与 SRP 批处理器兼容,它必须满足以下要求:

  • 着色器必须在名为 的单个常量缓冲区中声明所有内置引擎属性。例如,或 。UnityPerDrawunity_ObjectToWorldunity_SHAr
  • 着色器必须在名为 的单个常量缓冲区中声明所有材质属性。UnityPerMaterial

您可以在“检查器”面板中检查着色器的兼容性状态。

您可以在特定着色器的“检查器”面板中检查着色器的兼容性。
您可以在特定着色器的“检查器”面板中检查着色器的兼容性。

使用 SRP Batcher

本节包含有关如何在 Unity 预构建的可编程渲染管线中使用 SRP 批处理器的信息。

在 URP 中使用 SRP 批处理器

要在 URP 中激活 SRP Batcher,请执行以下操作:

  1. 在“项目”窗口中,选择 URP 资源。
  2. 在 URP 资产的检查器中,启用 SRP 批处理器。如果此选项不可见,请按照以下有关如何显示 URP 资产的其他属性的说明进行操作。

如何显示 URP 资产的其他属性

默认情况下,Unity 不会在 URP 资源中显示某些高级属性。要查看所有可用属性,请执行以下操作:

在 URP 资产的任意部分中,单击垂直省略号图标 (⋮),然后选择显示其他属性

显示其他属性
显示其他属性

Unity 在当前部分中显示所有可用属性。

要在所有部分中显示所有其他属性,请执行以下操作:

  1. 单击垂直省略号图标,然后选择显示所有其他属性。Unity 在“首选项”窗口中打开“核心渲染管线”部分。

在“可见性>附加属性”属性中,选择“全部可见”。

其他属性>可见性>全部可见
其他属性>可见性>全部可见

在 HDRP 中使用 SRP 批处理器

使用 HDRP 时,Unity 默认启用 SRP 批处理器。不建议禁用 SRP 批处理器。但是,您可以暂时禁用 SRP 批处理器以进行调试。

要在构建时使用编辑器启用和禁用 SRP 批处理器,请执行以下操作:

  1. 在 Project 窗口中选择 HDRP 资源。
  2. 在资产的检查器中,进入调试模式。在调试模式下,您可以看到 HDRP 资源的属性,包括 SRP 批处理器属性。
  3. 选择启用 SRP 批处理器以启用或禁用 SRP 批处理器。

若要在运行时启用或禁用 SRP 批处理器,请在 C# 代码中切换以下全局变量:

GraphicsSettings.useScriptableRenderPipelineBatching = true;

SRP Batcher 的工作原理

优化绘制调用的传统方法是减少绘制调用的数量。相反,SRP 批处理器减少了绘制调用之间的渲染状态更改。为此,SRP 批处理器结合了一系列 GPU 命令。每个命令序列称为 SRP 批处理。binddraw

绑定和绘制命令的批处理减少了绘制调用之间的 GPU 设置。
绑定和绘制命令的批处理减少了绘制调用之间的 GPU 设置。

为了达到渲染的最佳性能,每个 SRP 批处理应包含尽可能多的命令。为此,请使用尽可能少的着色器变体。您仍然可以根据需要通过相同的着色器使用任意数量的不同材质。binddraw

当 Unity 在渲染循环期间检测到新材质时,CPU 会收集所有属性并将其绑定到常量缓冲区中的 GPU。GPU 缓冲区的数量取决于着色器声明其常量缓冲区的方式。

SRP 批处理器是一个低级渲染循环,它使材质数据保留在 GPU 内存中。如果材质内容未更改,则 SRP 批处理器不会进行任何渲染状态更改。相反,SRP 批处理器使用专用代码路径来更新大型 GPU 缓冲区中的 Unity 引擎属性,如下所示:

SRP 批处理器渲染工作流。SRP 批处理器使用专用代码路径来更新大型 GPU 缓冲区中的 Unity 引擎属性。
SRP 批处理器渲染工作流。SRP 批处理器使用专用代码路径来更新大型 GPU 缓冲区中的 Unity 引擎属性。

在这里,CPU 仅处理 Unity 引擎属性,在上图中标记为“每个对象”大缓冲区。所有材质在 GPU 内存中都有持久常量缓冲区,随时可用。这加快了渲染速度,因为:

  • 现在,所有材质内容都保留在 GPU 内存中。
  • 专用代码管理所有每个对象属性的大型每对象 GPU 常量缓冲区。

有意删除游戏对象的 SRP 批处理器兼容性

在极少数情况下,您可能希望有意使特定游戏对象与 SRP 批处理器不兼容。例如,如果要使用 GPU 实例化,这与 SRP 批处理器不兼容。如果要使用完全相同的材质渲染许多相同的网格,GPU 实例化可能比 SRP 批处理器更有效。要使用 GPU 实例化,您必须:

  • 使用 Graphics.DrawMeshInstanced。
  • 手动删除 SRP 批处理器兼容性并为材料启用 GPU 实例化。

有两种方法可以从游戏对象中删除与 SRP 批处理器的兼容性:

  • 使着色器不兼容。
  • 使渲染器不兼容。

提示:如果使用 GPU 实例化而不是 SRP 批处理器,请使用性能分析器确保 GPU 实例化对于您的应用程序比 SRP 批处理器更有效。

删除着色器兼容性

您可以使手写着色器和着色器图着色器与 SRP 批处理器不兼容。但是,对于着色器图着色器,如果您经常更改并重新编译着色器图,则使渲染器不兼容会更简单。

要使 Unity 着色器与 SRP 批处理器不兼容,您需要对着色器源文件进行更改:

  1. 对于手写着色器,请打开着色器源文件。对于着色器图着色器,请将着色器图的编译着色器源代码复制到新的着色器源文件中。在应用程序中使用新的着色器源文件,而不是着色器图。
  2. 将新的材质属性声明添加到着色器的块中。不要在常量缓冲区中声明新材料属性。PropertiesUnityPerMaterial

材料属性不需要执行任何操作;仅具有常量缓冲区中不存在的材质属性,就会使着色器与 SRP 批处理器不兼容。UnityPerMaterial

警告:如果使用着色器图,请注意,每次编辑和重新编译着色器图时,都必须重复此过程。

删除渲染器兼容性

您可以使单个渲染器与 SRP 批处理器不兼容。为此,请向渲染器添加 a。MaterialPropertyBlock

在 Unity 帧调试器中分析 SRP 批处理器

您可以在帧调试器窗口中检查 SRP 批处理的状态。每个 SRP 批处理显示 Unity 使用了多少个绘制调用、Unity 附加到着色器的关键字,以及 Unity 未将该绘制调用与前一个绘制调用批处理的原因。

要检查 SRP Batcher 批次的状态,请执行以下操作:

  1. 在编辑器中,打开帧调试器(菜单:“>分析窗口”>“帧调试器”)。
  2. 在帧调试器中,转到渲染相机>渲染不透明
  3. 展开 RenderLoopNewBatcher.Draw 列表。
  4. 选择要检查的 SRP 批次

在下面的示例中,原因是:节点具有不同的着色器。这意味着该 SRP 批处理的着色器与上一个 SRP 批处理中的着色器不同。由于 SRP 批处理器使用不同的着色器,因此 SRP 批处理器创建了一个新批处理。如果多个 SRP 批处理的绘制调用数量较少,这通常意味着项目使用了太多着色器变体。

在“帧调试器”窗口中,您可以找到有关单个 SRP 批处理的详细信息,包括 SRP 批处理器创建新的 SRP 批处理而不是继续现有批处理的原因。
在“帧调试器”窗口中,您可以找到有关单个 SRP 批处理的详细信息,包括 SRP 批处理器创建新的 SRP 批处理而不是继续现有批处理的原因。

如果您编写自己的可编程渲染管线,而不是使用通用渲染管线或高清渲染管线,请尝试使用最少数量的关键字编写通用多用途着色器。这是最佳的,因为您可以使用任意数量的材料属性。


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

上一篇:Unity3D :手动组合网格 (mvrlink.com)

下一篇:Unity3D :“渲染统计数据”窗口 (mvrlink.com)

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