Unity3D :GPU 实例化

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

GPU 实例化

GPU 实例化是一种绘制调用优化方法,可在单个绘制调用中渲染具有相同材质的网格的多个副本。网格的每个副本称为一个实例。这对于绘制场景中多次出现的事物(例如树木或灌木丛)非常有用。

GPU 实例化在同一绘制调用中渲染相同的网格。若要添加变化并减少重复的外观,每个实例可以具有不同的属性,例如“颜色”或“缩放”。呈现多个实例的绘制调用在帧调试器中显示为绘制网格(实例化)。

要求和兼容性

本部分包含有关 GPU 实例化的平台、渲染管线和 SRP 批处理器兼容性的信息。

平台兼容性

GPU 实例化在除 WebGL 1.0 之外的每个平台上都可用。

渲染管线兼容性

功能内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义可编程渲染管线 (SRP)
GPU 实例化是 (1)是 (1)是 (1)

注意

  1. 仅当着色器与 SRP 批处理器不兼容时。

SRP 配料机

GPU 实例化与 SRP 批处理器不兼容。SRP 批处理器优先于 GPU 实例化。如果游戏对象与 SRP 批处理器兼容,Unity 将使用 SRP 批处理器对其进行渲染,而不是 GPU 实例化。有关优化方法优先级的详细信息,请参阅优化优先级。

如果您的项目使用 SRP 批处理器,并且您希望对游戏对象使用 GPU 实例化,则可以执行以下操作之一:

  • 使用 Graphics.DrawMeshInstanced。此 API 绕过游戏对象的使用,并使用指定的参数直接在屏幕上绘制网格。
  • 手动删除 SRP 批处理器兼容性。有关如何执行此操作的信息,请参阅有意删除兼容性。

使用 GPU 实例化

Unity 对共享相同网格和材质的游戏对象使用 GPU 实例化。要实例化网格和材质:

  • 材质的着色器必须支持 GPU 实例化。Unity 的标准着色器支持 GPU 实例化,所有表面着色器也是如此。要将 GPU 实例化支持添加到任何其他着色器,请参阅创建支持 GPU 实例化的着色器。
  • 网格必须来自以下源之一,按行为分组:
  • MeshRenderer 组件或 Graphics.RenderMesh 调用。
    行为:Unity 将这些网格添加到列表中,然后检查可以实例化哪些网格。
    Unity 不支持附加到与 SRP Batcher 兼容的游戏对象的皮肤网格渲染器或网格渲染器组件的 GPU 实例化。有关更多信息,请参阅 SRP 批处理器兼容性。
  • Graphics.RenderMeshInstanced 或 Graphics.RenderMeshIndirect 调用。这些方法使用相同的着色器多次渲染相同的网格。对这些方法的每次调用都会发出单独的绘制调用。Unity 不会合并这些绘制调用。

要将 GPU 实例化用于材质,请在检查器中选择启用 GPU 实例化选项。

“启用 GPU 实例化”选项,该选项显示在材质检查器中。
“启用 GPU 实例化”选项,该选项显示在材质检查器中。

照明

GPU 实例化支持 Unity 的烘焙全局光照系统。默认情况下,Unity 标准着色器和表面着色器支持 GPU 实例化和 Unity 的烘焙全局光照系统。

每个 GPU 实例都支持来自以下源之一的全局照明:

  • 任意数量的光照探针。
  • 一个光照贴图。
    注意:一个实例可以在光照贴图中使用多个图集区域。
  • 一个光探针代理卷 (LPPV) 组件。
    注意:您必须烘焙包含所有实例的空间卷的 LPPV。

GPU 实例化自动适用于:

  • 受光照探针影响的动态网格渲染器。
  • 静态网格体渲染器,可烘焙到相同的光照贴图纹理。在这种情况下,如果网格渲染器在其静态编辑器标志中包含贡献 GI,则该渲染器是静态的。

要启用 的光照探针渲染,请将 光源探测用法参数设置为自定义提供,并提供包含探测数据的材质属性块。有关详细信息和代码示例,请参阅 LightProbes.CalculateInterpolatedLightAndOcclusionProbes。Graphics.DrawMeshInstanced

或者,您可以将 LPPV 组件引用和 LightProbeUsage.UseProxyVolume 传递给 。执行此操作时,所有实例都会对光照探针数据的 L0 和 L1 波段的体积进行采样。如果要补充 L2 数据和遮挡数据,请使用 .有关详细信息,请参阅光照探针:技术信息。Graphics.DrawMeshInstancedMaterialPropertyBlock

性能影响

顶点数较少的网格无法使用 GPU 实例化高效处理,因为 GPU 无法以充分利用 GPU 资源的方式分配工作。这种处理效率低下可能会对性能产生不利影响。效率低下的阈值开始取决于 GPU,但作为一般规则,不要对顶点少于 256 的网格使用 GPU 实例化。

如果要多次渲染顶点数较少的网格,最佳做法是创建一个包含所有网格信息的缓冲区,并使用它来绘制网格。

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

上一篇:Unity3D :优化绘制调用 (mvrlink.com)

下一篇:Unity3D :创建支持 GPU 实例化的着色器 (mvrlink.com)

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