本页介绍如何通过使用 CommandBuffers 或通过对 ScriptableRenderContext 进行直接 API 调用,在可编程渲染管线 (SRP) 中调度和执行渲染命令。本页面上的信息适用于通用渲染管线 (URP)、高清渲染管线 (HDRP) 和基于 SRP 的自定义渲染管线。
在 SRP 中,应使用 C# 脚本来配置和调度渲染命令。然后,需要告诉 Unity 的低级图形架构执行这些命令,此过程会将指令发送到图形 API。
主要做法是对 ScriptableRenderContext 进行 API 调用,不过也可以立即执行 CommandBuffers。
在 SRP 中,ScriptableRenderContext 类用作 C# 渲染管线代码与 Unity 的低级图形代码之间的接口。SRP 使用延迟执行的方式来实现渲染;您需要使用 ScriptableRenderContext 来构建渲染命令列表,然后告诉 Unity 执行这些命令。Unity 的低级图形架构随后将指令发送到图形 API。
要调度渲染命令,您可以:
为了告诉 Unity 执行您所调度的命令,请调用 ScriptableRenderContext.Submit。请注意,使用的是 CommandBuffer 还是通过调用 API 来调度命令,这并不重要;Unity 以相同方式在 ScriptableRenderContext 中调度所有渲染命令,并且在调用 Submit()
之前不会执行任何这些命令。
以下示例代码演示如何使用 CommandBuffer 来调度和执行命令以清除当前渲染目标。
using UnityEngine;
using UnityEngine.Rendering;
public class ExampleRenderPipeline : RenderPipeline
{
public ExampleRenderPipeline() {
}
protected override void Render(ScriptableRenderContext context, Camera[] cameras) {
// 创建并调度命令以清除当前渲染目标
var cmd = new CommandBuffer();
cmd.ClearRenderTarget(true, true, Color.red);
context.ExecuteCommandBuffer(cmd);
cmd.Release();
// 指示可编程渲染上下文告诉图形 API 执行调度的命令
context.Submit();
}
}
可通过调用 Graphics.ExecuteCommandBuffer 来立即执行 CommandBuffers,而不使用 ScriptableRenderContext。对该 API 的调用发生在渲染管线之外。
有关可以使用 CommandBuffers 来调度的命令的更多信息,请参阅 CommandBuffers API 文档。