当前位置:   article > 正文

可编程渲染管线(SRP)_学习笔记_unity 关闭 urp

unity 关闭 urp

Unity 的可编程渲染管线 (Scriptable Render Pipeline, SRP) 是一项可以通过 C# 脚本来控制渲染的功能。SRP 技术可以强化通用渲染管线 (URP) 和高清渲染管线 (HDRP)。

> 通用渲染管线(URP)

通用渲染管线 (Universal Render Pipeline, URP) 是由 Unity 制作的预构建可编程渲染管线(Scriptable Render Pipeline)。URP 提供了对美术师友好的工作流程,可让您在移动平台、高端游戏主机和 PC 等各种平台上快速轻松地创建优化的图形。

有关最新版 URP 的更多信息,请参阅 URP 包文档微型网站 

> 高清渲染管线(HDRP)

高清渲染管线 (HDRP) 是由 Unity 预先构建的可编程渲染管线。借助 HDRP 可以为高端平台创建出色的高保真图形。

HDRP 可以用于 AAA 级高品质游戏、汽车演示、建筑应用以及任何需要高保真图形的应用。HDRP 使用基于物理的光照和材质,并且支持前向渲染和延迟渲染。HDRP 使用计算着色器技术,因此需要兼容的 GPU 硬件。

有关最新版 HDRP 的更多信息,请参阅 HDRP 包文档微型网站

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

可编程渲染管线简介

1.渲染管线资源和渲染管线实例

在SRP中编写C#渲染代码时,必须创建和自定义两个关键元素:

> 渲染管线资源是Unity项目中的资源,用于存储有关SRP的配置数据。您可以通过创建一个继承自Rendering.RenderPipelineAsset的脚本来定义渲染管线资源,然后在项目中创建和配置渲染管线资源的实例。

> 渲染管线实例是具有Render()方法的类,该方法是SRP的入口点。若要定义渲染管线实例,请创建一个继承自RenderPipeline的脚本。

有关创建这些元素的信息,请参见创建渲染管线资源和渲染管线实例。

2.Scriptable Render Context

Scriptable Render Context是一个类,用作C#SRP代码和Unity的低级图形代码之间的接口。您可以使用ScriptableRenderContext API计划和执行渲染命令。

有关使用Scriptable Render Context的信息,请参阅在Scriptable Render Pipeline中计划和执行渲染命令。

3.入口点和回调

在SRP中,您可以编写C#渲染代码,Unity在特定时间调用。

> 渲染管线实例的Render()方法是SRP的入口点。 Unity对当前正在渲染的每个CameraType每帧调用一次此方法。自定义此方法以自定义您的SRP。

> RenderPipelineManager类具有四个事件:beginFrameRendering,beginCameraRendering,endCameraRendering和endFrameRendering。您可以订阅这些事件以在渲染管线中的特定点执行代码。请注意,如果要编写自己的自定义SRP,则必须确保SRP在适当的时间引发这些事件。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

创建自定义的可编程渲染管线

Unity 提供两种预构建的可编程渲染管线 (SRP):高清渲染管线 (HDRP) 和通用渲染管线 (URP)。HDRP 和 URP 提供广泛的自定义选项。但是,如果还想在更大程度上控制渲染管线,可以创建自定义 SRP。

1.创建新项目并安装自定义 SRP 所需的包

以下说明信息展示了如何使用 SRP Core 包来创建自定义 SRP。SRP Core 是 Unity 创建的包,其中包含可复用代码来帮助您创建自己的 SRP,包括用于与平台特定的图形 API 结合使用的样板代码、用于常见渲染操作的实用函数以及供 URP 和 HDRP 使用的着色器库。有关 SRP Core 的更多信息,请参阅 SRP Core 包文档

> 创建新的 Unity 项目。

> 使用 Git 来创建 SRP 源代码仓库的克隆体。可以将 SRP 源代码放在磁盘中的任何位置,只要不在任何保留的项目子文件夹内即可。

> 使用 Git 将 SRP 源代码的副本更新到与 Unity Editor 版本兼容的分支。请阅读 SRP 代码仓库文档中的使用最新版本 (Using the latest version) 部分以了解有关分支和版本的信息。

> 在 Unity 中打开您的项目,然后按以下顺序从磁盘上的 SRP 源代码文件夹安装以下包。有关从磁盘安装包的信息,请参阅安装本地包。 * com.unity.render-pipelines.core。 * 可选:_com.unity.render-pipelines.shadergraph。作为自定义 SRP 的一部分,如果要使用 Shader Graph 或修改 Shader Graph 源代码,请安装此包。 * 可选:_com.unity.render-pipelines.visualeffectgraph。作为自定义 SRP 的一部分,如果要使用 Visual Effect Graph 或修改 Visual Effect Graph 源代码,请安装此包。

现在,您可以调试和修改 SRP 源代码副本中的脚本,并在 Unity 项目中查看更改的结果。

2.创建自定义版本的 URP 或 HDRP

通用渲染管线 (URP) 和高清渲染管线 (HDRP) 提供广泛的自定义选项,可帮助您获得所需的图形和性能。但是,如果您希望获得更多控制权,可为这些渲染管线之一创建自定义版本,并修改源代码。

遵循以上部分(创建新项目并安装自定义 SRP 所需的包)中的第 1–3 步。到达第 4 步时,请按顺序安装以下包:

URP:

> com.unity.render-pipelines.core

> com.unity.render-pipelines.shadergraph

> com.unity.render-pipelines.universal

HDRP:

> com.unity.render-pipelines.core

> com.unity.render-pipelines.shadergraph

> com.unity.render-pipelines.high-defintion

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

创建渲染管线资源和渲染管线实例

如果您要创建自己的可编程渲染管线 (SRP),您的项目必须包含:

> 一个继承自 RenderPipelineAsset 并重写其 CreatePipeline() 方法的脚本。此脚本用于定义渲染管线资源。

> 一个继承自 RenderPipeline 并重写其 Render() 方法的脚本。此脚本用于定义渲染管线实例。

> 一个从 RenderPipelineAsset 脚本创建的渲染管线资源。此资源充当渲染管线实例的工厂类。

因为这些元素非常紧密相关,所以应该同时创建它们。

1.创建基本渲染管线资源和渲染管线实例

以下示例显示了如何为实例化渲染管线实例的基本自定义渲染管线资源创建脚本、如何创建可定义渲染管线实例的脚本以及如何创建渲染管线资源本身。

> 创建一个名为 ExampleRenderPipelineAsset.cs 的 C# 脚本,将以下代码复制并粘贴到新脚本中:

  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. // CreateAssetMenu 属性让您可以在 Unity Editor 中创建此类的实例。
  4. [CreateAssetMenu(menuName = "Rendering/ExampleRenderPipelineAsset")]
  5. public class ExampleRenderPipelineAsset : RenderPipelineAsset
  6. {
  7. // Unity 在渲染第一帧之前调用此方法。
  8. // 如果渲染管线资源上的设置改变,Unity 将销毁当前的渲染管线实例,并在渲染下一帧之前再次调用此方法。
  9. protected override RenderPipeline CreatePipeline()
  10. {
  11. // 实例化此自定义 SRP 用于渲染的渲染管线。
  12. return new ExampleRenderPipelineInstance();
  13. }
  14. }

> 创建一个名为 ExampleRenderPipelineInstance.cs 的 C# 脚本,.将以下代码复制并粘贴到新脚本中:

  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. public class ExampleRenderPipelineInstance : RenderPipeline
  4. {
  5. public ExampleRenderPipelineInstance()
  6. {
  7. }
  8. // 对于当前正在渲染的每个 CameraType,Unity 每帧调用一次此方法。
  9. protected override void Render (ScriptableRenderContext context, Camera[] cameras)
  10. {
  11. // 可以在此处编写自定义渲染代码。通过自定义此方法可以自定义 SRP。
  12. }
  13. }

> 在 Project 视图中,单击添加 (+) 按钮,或者打开上下文菜单并导航至 Create,然后选择 Rendering > Example Render Pipeline Asset。Unity 在 Project 视图中创建新的渲染管线资源。

2.创建可配置的渲染管线资源和渲染管线实例

默认情况下,渲染管线资源存储有关用于渲染的渲染管线实例以及 Editor 中使用的默认材质和着色器的信息。在 RenderPipelineAsset 脚本中,您可以扩展渲染管线资源以存储更多数据,并且可以在项目中拥有多个具有不同配置的不同渲染管线资源。例如,可使用渲染管线资源来保存每个不同硬件层的配置数据。高清渲染管线 (HDRP) 和通用渲染管线 (URP) 包含这方面的示例。

以下示例显示了如何创建 RenderPipelineAsset 脚本(该脚本使用公共数据来定义渲染管线资源,而公共数据则可以通过 Inspector 针对每个实例加以设置)和渲染管线实例(该实例在其构造函数中接收渲染管线资源,并使用此渲染管线资源的数据)。

> 创建一个名为 ExampleRenderPipelineAsset.cs 的 C# 脚本,将以下代码复制并粘贴到新脚本中:

  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. // CreateAssetMenu 属性让您可以在 Unity Editor 中创建此类的实例。
  4. [CreateAssetMenu(menuName = "Rendering/ExampleRenderPipelineAsset")]
  5. public class ExampleRenderPipelineAsset : RenderPipelineAsset
  6. {
  7. // 可以在 Inspector 中为每个渲染管线资源定义此数据
  8. public Color exampleColor;
  9. public string exampleString;
  10. // Unity 在渲染第一帧之前调用此方法。
  11. // 如果渲染管线资源上的设置改变,Unity 将销毁当前的渲染管线实例,并在渲染下一帧之前再次调用此方法。
  12. protected override RenderPipeline CreatePipeline()
  13. {
  14. // 实例化此自定义 SRP 用于渲染的渲染管线,然后传递对此渲染管线资源的引用。
  15. // 然后,渲染管线实例可以访问上方定义的配置数据。
  16. return new ExampleRenderPipelineInstance(this);
  17. }
  18. }

> 创建一个名为 ExampleRenderPipelineInstance.cs 的 C# 脚本,将以下代码复制并粘贴到新脚本中:

  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. public class ExampleRenderPipelineInstance : RenderPipeline
  4. {
  5. // 使用此变量来引用传递给构造函数的渲染管线资源
  6. private ExampleRenderPipelineAsset renderPipelineAsset;
  7. // 构造函数将 ExampleRenderPipelineAsset 类的实例作为其参数。
  8. public ExampleRenderPipelineInstance(ExampleRenderPipelineAsset asset)
  9. {
  10. renderPipelineAsset = asset;
  11. }
  12. // 对于当前正在渲染的每个 CameraType,Unity 每帧调用一次此方法。
  13. protected override void Render(ScriptableRenderContext context, Camera[] cameras)
  14. {
  15. //这是使用渲染管线资源数据的示例。
  16. Debug.Log(renderPipelineAsset.exampleString);
  17. // 可以在此处编写自定义渲染代码。通过自定义此方法可以自定义 SRP。
  18. }
  19. }

> 在 Project 视图中,单击添加 (+) 按钮,或者打开上下文菜单并导航至 Create,然后选择 Rendering > Example Render Pipeline Asset。Unity 在 Project 视图中创建新的渲染管线资源。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

设置激活的渲染管线资源

在可编程渲染管线 (SRP) 中,项目必须具有激活的渲染管线资源

1.兼容性和性能

因为 SRP 的可配置性很强,所以更改激活的渲染管线资源可能导致的变化很小(例如使用具有不同质量层的同一渲染管线实例)或者变化很大(例如从通用渲染管线 (URP) 切换到高清渲染管线 (HDRP))。

如果将激活的渲染管线资源更改为一种使用其他渲染管线实例的渲染管线资源,必须确保项目中的资源和代码兼容新的渲染管线实例。否则,可能会遇到错误或意外的视觉效果。

还要注意,切换到新的渲染管线资源会使 Unity 销毁当前的渲染管线实例,并调用新渲染管线资源的 CreatePipeline() 方法。根据 SRP 中的代码,此操作可能在计算上是资源密集型操作。

2.在 Unity Editor 中设置渲染管线资源

必须在 Unity Editor 中设置渲染管线资源,以便在编辑项目时可以使用 SRP。在 Editor 中设置的渲染管线资源是 Unity 默认在构建的播放器中使用的渲染管线资源。

Graphics Settings 窗口中,设置项目的渲染管线资源。

> 导航到 Edit > Project Settings > Graphics,从而打开 Graphics Settings 窗口。

> 在 Project 文件夹中,找到要使用的渲染管线资源。

> 将渲染管线资源拖入 Scriptable Render Pipeline Setting 字段。Unity 立即开始使用渲染管线资源中定义的配置来通过 SRP 进行渲染。这包括 Game 视图、Scene 视图,以及 Project 面板和 Inspector 中显示的材质预览。

3.在运行时设置渲染管线资源

如果要在渲染管线资源之间切换,可在运行时设置渲染管线资源。您可以在构建的播放器中或在 Editor 的运行模式下执行此操作。

在运行时,应使用 GraphicsSettings.renderPipelineAsset API 来设置渲染管线资源。

以下示例代码显示了如何在两个渲染管线资源之间切换。

  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. public class SwitchRenderPipelineAsset : MonoBehaviour
  4. {
  5. public RenderPipelineAsset exampleAssetA;
  6. public RenderPipelineAsset exampleAssetB;
  7. void Update()
  8. {
  9. if (Input.GetKeyDown(KeyCode.A))
  10. {
  11. GraphicsSettings.renderPipelineAsset = exampleAssetA;
  12. Debug.Log("Active render pipeline asset is: " + GraphicsSettings.renderPipelineAsset.name);
  13. }
  14. else if (Input.GetKeyDown(KeyCode.B))
  15. {
  16. GraphicsSettings.renderPipelineAsset = exampleAssetB;
  17. Debug.Log("Active render pipeline asset is: " + GraphicsSettings.renderPipelineAsset.name);
  18. }
  19. }
  20. }

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

在可编程渲染管线中调度和执行渲染命令

可编程渲染管线 (SRP) 中,应使用 C# 脚本来配置和调度渲染命令。然后,需要告诉 Unity 的低级图形架构执行这些命令,此过程会将指令发送到图形 API。

主要做法是使用ScriptableRenderContext,但是您也可以立即执行命令缓冲区。

1.使用ScriptableRenderContext

ScriptableRenderContext用作 C# 代码与 Unity 的低级图形代码之间的接口。在 SRP 中会使用延迟执行的方式来实现渲染;您需要使用ScriptableRenderContext来构建渲染命令列表,然后告诉 Unity 执行这些命令。Unity 的低级图形架构随后将指令发送到图形 API。

要调度渲染命令,您可以: * 使用 ScriptableRenderContext.ExecuteCommandBuffer(),将 CommandBuffer 传递到可编程渲染上下文 * 对可编程渲染上下文进行直接 API 调用(例如 ScriptableRenderContext.Cull()ScriptableRenderContext.DrawRenderers()

为了告诉 Unity 执行您所调度的命令,请调用 ScriptableRenderContext.Submit()。请注意,使用的是命令缓冲区还是通过调用 API 来调度命令,这并不重要;Unity 以相同方式在ScriptableRenderContext中调度所有渲染命令,并且在调用 Submit() 之前不会执行任何这些命令。

以下示例代码演示了如何使用命令缓冲区来调度和执行命令以清除当前渲染目标。

  1. using UnityEngine;
  2. using UnityEngine.Rendering;
  3. public class ExampleRenderPipelineInstance : RenderPipeline
  4. {
  5. public ExampleRenderPipelineInstance()
  6. {
  7. }
  8. protected void Render(ScriptableRenderContext context, Camera[] cameras)
  9. {
  10. // 创建并调度命令以清除当前渲染目标
  11. var cmd = new CommandBuffer();
  12. cmd.ClearRenderTarget(true, true, Color.black);
  13. context.ExecuteCommandBuffer(cmd);
  14. cmd.Release();
  15. // 指示可编程渲染上下文告诉图形 API 执行调度的命令
  16. context.Submit();
  17. }
  18. }

2.立即执行命令缓冲区

可通过调用 Graphics.ExecuteCommandBuffer() 来立即执行命令缓冲区,而不使用ScriptableRenderContext。对该 API 的调用发生在渲染管线之外。

3.其他信息

有关可以使用命令缓冲区来调度的命令的更多信息,请参阅 Command Buffer API 文档

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

可编程渲染管线 SRP Batcher

SRP Batcher 是一个渲染循环,可通过许多使用同一着色器变体的材质来加快场景中的 CPU 渲染速度。

1.使用SRP Batcher

要使用 SRP Batcher,项目必须使用可编程渲染管线。可编程渲染管线可以是:

要在URP中激活SRP Batcher:

> 在 Project 窗口中, 选择 URP Asset

> 在该资源的 Inspector 中,找到 Advanced 部分,然后选中 SRP Batcher 复选框。

注意:可以分别在资源中为URP或HDRP停用SRP Batcher,默认启用SRP Batcher。

在HDRP中,SRP Batcher默认情况下处于启用状态,您不应禁用它。但是,如果要出于调试目的暂时禁用SRP Batcher,请执行以下操作:

> 在Project窗口中,选择HDRP Asset。

> 在Inspector中,进入Debug Mode。这将更改HDRP Asset显示其属性的方式,并使SRP Batcher属性显示。

> 禁用SRP Batcher复选框。

您还可以在运行时启用或禁用SRP Batcher。为此,请在您的C#代码中切换以下全局变量:

GraphicsSettings.useScriptableRenderPipelineBatching = true;

2.支持的平台

SRP Batcher 适用于几乎所有平台。下表显示了支持的平台以及所需的最低 Unity 版本。

注意:对于 XR,只能以 SinglePassInstanced 模式来使用 SRP Batcher。

3.SRP Batcher 的工作原理

Unity 中,可以在一帧内的任何时间修改任何材质的属性。但是,这种做法有一些缺点。例如,DrawCall 使用新材质时,要执行许多工作。因此,场景中的材质越多,Unity 必须用于设置 GPU 数据的 CPU 也越多。解决此问题的传统方法是减少 DrawCall 的数量以优化 CPU 渲染成本,因为 Unity 在发出 DrawCall 之前必须进行很多设置。实际的 CPU 成本便来自该设置,而不是来自 GPU DrawCall 本身(DrawCall 只是 Unity 需要推送到 GPU 命令缓冲区的少量字节)。

SRP Batcher 通过批处理一系列 BindDraw GPU 命令来减少 DrawCall 之间的 GPU 设置。

注意:Bind 和 Draw 命令的批处理可以减少绘制调用之间的 GPU 设置。

为了获得最大渲染性能,这些批次必须尽可能大。为了实现这一点,可以使用尽可能多具有相同着色器的不同材质,但是必须使用尽可能少的着色器变体。

在内渲染循环中,当 Unity 检测到新材质时,CPU 会收集所有属性并在 GPU 内存中设置不同的常量缓冲区。GPU 缓冲区的数量取决于着色器如何声明其 CBUFFER。

为了在场景使用很多不同材质但很少使用着色器变体的一般情况下加快速度,SRP 在原生集成了范例(例如 GPU 数据持久性)。

SRP Batcher 是一个低级渲染循环,使材质数据持久保留在 GPU 内存中。如果材质内容不变,SRP Batcher 不需要设置缓冲区并将缓冲区上传到 GPU。实际上,SRP Batcher 会使用专用的代码路径来快速更新大型 GPU 缓冲区中的 Unity 引擎属性,如下所示:

这是 SRP Batcher 渲染工作流程。SRP Batcher 使用专用的代码路径来快速更新大型 GPU 缓冲区中的 Unity 引擎属性。

3.SRP Batcher 兼容性

为了使 SRP Batcher 代码路径能够渲染对象:

  • 渲染的对象必须是网格或蒙皮网格。该对象不能是粒子。
  • 着色器必须与 SRP Batcher 兼容。HDRP 和 URP 中的所有光照和无光照着色器均符合此要求(这些着色器的“粒子”版本除外)。

为了使着色器与 SRP Batcher 兼容:

  • 必须在一个名为“UnityPerDraw”的 CBUFFER 中声明所有内置引擎属性。例如:unity_ObjectToWorldunity_SHAr
  • 必须在一个名为 UnityPerMaterial 的 CBUFFER 中声明所有材质属性。

可以在 Inspector 面板中查看着色器的兼容性状态。

在任何给定场景中,有些对象与 SRP Batcher 兼容,而有些对象则不兼容。即使在使用不兼容的对象时,Unity 也会正确渲染场景。这是因为兼容对象使用 SRP Batcher 代码路径,而其他对象则使用标准 SRP 代码路径。

使用 SRP Batcher 代码路径不使用 SRP Batcher 代码路径
* 使用与 SRP Batcher 兼容的着色器的网格* 任何非网格对象(包括蒙皮网格)
* 任何使用非兼容着色器的网格
* 使用材质属性块的渲染器

4.使用 SRP Batcher 时的性能分析

为了测量使用 SRP Batcher 时场景中的增速,请将 SRPBatcherProfiler.cs C# 脚本从 SRP Batcher 模板添加到您的场景。当此脚本正在运行时: 使用 F8 键来切换覆盖显示。 也可以在运行过程中使用 F9 键来打开和关闭 SRP Batcher。

此覆盖如下所示:

在 SRP Batcher 覆盖中,可以找到有关 SRP Batcher 中发生的情况的详细信息。

时间测量值以毫秒 (ms) 为单位,并显示 CPU 在 Unity SRP 渲染循环中花费的时间。

注意:此处的时间等于在一帧内调用的所有 RenderLoop.DrawShadows.Draw 标记的累积时间(与线程所有者无关)。例如,如果看到 1.31ms SRP Batcher 代码路径,表示绘制调用可能在主线程上花费了 0.31ms,并且 1ms 分散在所有图形工作中。

覆盖信息

下表描述了在运行模式下可见的 SRP Batcher 覆盖中的每个设置:

覆盖中的名称描述
(SRP batcher ON)/(SRP batcher OFF)指示是否已启用当前的 SRP Batcher。要打开或关闭 SRP Batcher,请按 F9。
CPU Rendering time指示 SRP 循环在 CPU 中花费的总累积时间,无论使用的是哪种多线程模式(例如单个客户端/工作线程或图形工作)。在这里可以最大限度看到 SRP Batcher 的效果。要查看 SRP Batcher 的优化,请尝试将其打开和关闭来查看 CPU 使用率的差异。在上述示例中,总时间为 2.11 毫秒。
(incl RT idle):__指示 SRP 在渲染线程中花费的空闲时间。这可能意味着应用程序处于没有任何图形工作的客户端/工作模式;在渲染线程必须等待主线程上的图形命令时会发生此情况。在以上示例中,渲染线程空闲了 0.36 毫秒。SRP Batcher code path (flushes)|指示您的游戏或应用程序花费在 SRP Batcher 代码路径中的时间。此时间包括游戏渲染 All objects__(阴影通道除外)(1.18ms) 和 Shadows (0.13ms) 这两个方面。如果 Shadows 数量较大,请尝试减少场景中阴影投射光源的数量,或在渲染管线资源中选择较少数量的级联。在以上示例中,该时间为 0.31ms。
(flush) 数字表示 Unity 由于遇到新着色器变体而刷新场景的次数(在此示例中为 89)。较少的刷新次数总是更好一些,因为这意味着帧中的着色器变体数量较少。
Standard code path (flushes)指示 Unity 在渲染与 SRP Batcher 不兼容的对象(例如蒙皮网格或粒子)方面花费的时间。
在以上示例中,SRP Batcher 在 0.80 毫秒内刷新了 81 个对象:阴影通道为 0.09 毫秒,所有其他通道为 0.71 毫秒。
Global Main Loop: (FPS)指示全局主循环时间(以毫秒为单位)以及等效的每秒帧数 (FPS)。注意:FPS 并非线性,因此,如果发现 FPS 增加 20,不一定意味着已经优化场景。若要查看 SRP Batcher 是否优化了场景渲染,请开启和关闭该功能,然后比较 CPU Rendering time 下的数字。

5.Unity 帧调试器中的 SRP Batcher 数据

可以在 Frame Debugger 窗口中检查 SRP Batcher“批次”的状态。

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

> 在 Editor 中,选择 Window > Analysis > Frame Debugger > Render Camera > Render Opaques__,然后展开 RenderLoopNewBatcher.Draw__ 列表。

> 单击要检查的 SRP Batch

SRP Batch 详细信息可以显示使用了多少个绘制调用、着色器附加了哪些关键字以及该特定绘制调用未与前一个调用一起接受批处理的原因。在以下示例中,所述原因是:_Node use different shader keywords_。这意味着该批次的着色器关键字不同于前一个批次中的关键字。由于 SRP Batcher 使用了另一个不同的着色器变体,因此这一批次已破坏。如果一个 SRP 批次的绘制调用数量较少,您很可能使用了太多的着色器变体。

在 Frame Debugger 窗口中,可以找到有关各个批次的详细信息,包括 SRP Batcher 创建新批次而不是继续使用现有批次的原因。

如果您要编写自己的 SRP 而不是使用 URP 或 HDRP,请尝试使用最少的关键字来编写通用的“超级”着色器(但可以在每个材质中使用尽可能多的材质参数和材质属性)。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/102766
推荐阅读
相关标签
  

闽ICP备14008679号