Unity-使用命令缓冲区来扩展内置渲染管线
命令缓冲区可保存一组渲染命令。您可以指示 Unity 调度和执行这些命令。
本页包含有关在内置渲染管线中使用命令缓冲区的信息。有关在可编程渲染管线中使用命令缓冲区的信息,请参阅在可编程渲染管线中调度和执行渲染命令。
有关可以使用命令缓冲区执行的命令的完整列表,请参阅 CommandBuffer API 文档。请注意,一些命令仅在某些硬件上受支持。例如,与射线追踪有关的命令仅在 DX12 中受支持。
立即执行命令缓冲区
可以使用 Graphics.ExecuteCommandBuffer API 立即执行命令缓冲区。
调度命令缓冲区
在内置渲染管线中,可以在渲染循环中的特定时间执行命令缓冲区。为此,请将 Camera.AddCommandBuffer API 与 CameraEvent 枚举一起使用,并将 Light.AddCommandBuffer API 与 LightEvent 枚举一起使用。
例如,可以将命令缓冲区与 AfterGBuffer CameraEvent 结合使用,从而将其他游戏对象渲染到延迟管线中(在管线处理所有不透明的游戏对象之后)。
CameraEvent 执行顺序
执行顺序取决于项目使用的渲染路径。
延迟渲染路径
BeforeGBuffer Unity 渲染不透明几何体。
AfterGBuffer Unity 解析深度。
BeforeReflections Unity 渲染默认反射。Unity 渲染反射探针反射。
AfterReflections Unity 将反射复制到 G 缓冲区的 Emissive 通道。
BeforeLighting Unity 渲染阴影。请参阅 LightEvent 执行顺序。AfterLightingBeforeFinalPass Unity 对最终通道进行处理。AfterFinalPassBeforeForwardOpaque(仅当存在无法以延迟方式渲染的不透明几何体时调用)Unity 渲染无法以延迟方式渲染的不透明几何体。
AfterForwardOpaque(仅当存在无法以延迟方式渲染的不透明几何体时调用)BeforeSkyboxUnity 渲染天空盒。
AfterSkyboxUnity 渲染光环。
BeforeImageEffectsOpaque如果使用 Post-processing Stack V2 包,则 Unity 会应用仅限不透明的后期处理效果。
AfterImageEffectsOpaqueBeforeForwardAlphaUnity 会渲染透明几何体以及具有 Screen Space - Camera 渲染模式的 UI 画布。
AfterForwardAlphaBeforeHaloAndLensFlaresUnity 渲染镜头光晕。
AfterHaloAndLensFlaresBeforeImageEffects如果使用 Post-processing Stack V2 包,则 Unity 会应用后期处理效果。
AfterImageEffectsAfterEverythingUnity 对渲染模式不是 Screen Space - Camera 的 UI 画布进行渲染。
前向渲染路径
BeforeDepthTexture Unity 渲染不透明几何体的深度。
AfterDepthTextureBeforeDepthNormalsTexture Unity 渲染不透明几何体的深度法线。AfterDepthNormalsTexture Unity 渲染阴影。请参阅 LightEvent 执行顺序。
BeforeForwardOpaque Unity 渲染不透明几何体。
AfterForwardOpaqueBeforeSkybox Unity 渲染天空盒。
AfterSkybox Unity 渲染光环。
BeforeImageEffectsOpaque如果使用 Post-processing Stack V2 包,则 Unity 会应用仅限不透明的后期处理效果。
AfterImageEffectsOpaqueBeforeForwardAlphaUnity 会渲染透明几何体以及具有 Screen Space - Camera 渲染模式的 UI 画布。
AfterForwardAlphaBeforeHaloAndLensFlaresUnity 渲染镜头光晕。
AfterHaloAndLensFlaresBeforeImageEffects如果使用 Post-processing Stack V2 包,则 Unity 会应用后期处理效果。AfterImageEffectsAfterEverythingUnity 对渲染模式为 Screen Space - Camera 的 UI 画布进行渲染。
LightEvent 执行顺序
在上面的“渲染阴影”阶段,对于每个投射阴影的光源,Unity 执行以下步骤:
BeforeShadowMapBeforeShadowMapPass
Unity 渲染当前通道的所有阴影投射物
AfterShadowMapPass
对每个通道进行重复AfterShadowMapBeforeScreenSpaceMaskUnity 将阴影贴图收集到屏幕空间缓冲区中并执行过滤AfterScreenSpaceMask
其他资源
Unity 博客文章扩展 Unity 5 渲染管线:命令缓冲区 (Extending Unity 5 rendering pipeline: Command Buffers) 介绍了内置渲染管线中的命令缓冲区,并包含示例项目和示例代码。这篇文章与 Unity 的旧版本有关,但原理相同。