本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本篇为Unity官方文档的摘抄集合,为方便后续翻看。
包含有关在内置渲染管线中使用 CommandBuffer 的信息。有关在渲染管线中基于可编程渲染管线使用 CommandBuffer 的信息,请参阅在可编程渲染管线中调度和执行渲染命令。
1、CommandBuffer 基础知识
CommandBuffer保存渲染命令列表(例如设置渲染目标或绘制给定网格)。可以指示 Unity 在内置渲染管线中的各个点安排和执行这些命令,因此,您可以自定义和扩展 Unity 的渲染功能。
可以使用Graphics.ExecuteCommandBufferAPI 立即执行 CommandBuffer,也可以进行安排,让它们在渲染管线中的给定点执行。要安排它们,请使用Camera.AddCommandBufferAPI 与CameraEvent 枚举,以及Light.AddCommandBufferAPI 与LightEvent 枚举。要查看 Unity 何时执行以这种方式安排的 CommandBuffer,请参阅 CameraEvent 和 LightEvent 的执行顺序。
有关可以使用 CommandBuffer 执行的命令的完整列表,请参阅 CommandBuffer API 文档。请注意,一些命令仅在某些硬件上受支持。例如,与光线追踪有关的命令仅在 DX12 中受支持。
2、Command Buffer 示例
Unity 博客文章扩展 Unity 5 渲染管线:CommandBuffer 介绍了内置渲染管线中的 CommandBuffer,并包含示例项目和示例代码。它介绍如何使用 CommandBuffer 来实现几种不同的效果,并包含一个示例项目和示例代码。项目是为 Unity 的旧版本创建的,但原理相同。
3、CameraEvent 事件的执行顺序
CameraEvents 执行顺序取决于项目使用的渲染路径。
3.1 延迟渲染路径
-
Unity 渲染不透明几何体
-
Unity 解析深度。
-
Unity 渲染默认反射和反射探针反射。
-
Unity 将反射复制到 G 缓冲区的 Emissive 通道。
-
Unity 渲染阴影。请参阅 LightEvent 执行顺序。
-
Unity 对最终通道进行处理。
-
BeforeForwardOpaque(仅当存在无法以延迟方式渲染的不透明几何体时调用)
-
Unity 渲染无法以延迟方式渲染的不透明几何体。
-
AfterForwardOpaque(仅当存在无法以延迟方式渲染的不透明几何体时调用)
-
Unity 渲染天空盒。
-
Unity 渲染光环。
-
Unity 应用仅不透明的后期处理效果。
-
Unity 渲染透明几何体以及具有 Screen Space - Camera 渲染模式的 UI 画布。
-
Unity 渲染镜头光晕。
-
Unity 应用后期处理效果。
-
Unity 对渲染模式不是 Screen Space - Camera 的 UI 画布进行渲染。
3.2 前向渲染路径
-
Unity 渲染不透明几何体的深度。
-
Unity 渲染不透明几何体的深度法线。
-
Unity 渲染阴影。请参阅 LightEvent 执行顺序。
-
Unity 渲染不透明几何体。
-
Unity 渲染天空盒。
-
Unity 渲染光环。
-
Unity 应用仅不透明的后期处理效果。
-
Unity 渲染透明几何体以及具有 Screen Space - Camera 渲染模式的 UI 画布。
-
Unity 渲染镜头光晕。
-
Unity 应用后期处理效果。
-
Unity 对渲染模式不是 Screen Space - Camera 的 UI 画布进行渲染。
4、LightEvent 执行顺序
在上面的“渲染阴影”阶段,对于每个投射阴影的光源,Unity 执行以下步骤:
-
Unity 渲染当前通道的所有阴影投射器
-
Unity 对每个通道重复最后三个步骤
-
Unity 将阴影贴图收集到屏幕空间缓冲区中并执行过滤 *AfterScreenSpaceMask