在可编程渲染管线 (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 文档。
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.