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