本页介绍如何通过使用 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 文档。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.