清除、渲染顺序和过度绘制
清除
在通用渲染管线 (Universal Render Pipeline, URP) 中,摄像机清除行为取决于摄像机的渲染类型 (Render Type)。
基础摄像机
颜色缓冲区
在渲染循环开始时,基础摄像机可以将其颜色缓冲区清除为天空盒 (Skybox),将其颜色缓冲区清除为纯色,或使用未初始化的颜色缓冲区。使用 Base Camera Inspector 中的 Background Type 属性可以设置此行为。
请注意,未初始化的颜色缓冲区的内容因平台而异。在某些平台上,未初始化的颜色缓冲区将包含来自前一帧的数据。在其他平台上,未初始化的颜色缓冲区将包含未初始化的内存。仅当摄像机绘制到颜色缓冲区中的每个像素,且不希望产生不必要清除操作的成本时,才应选择使用未初始化的颜色缓冲区。
深度缓冲区
基础摄像机总是在每个渲染循环开始时清除其深度缓冲区。
叠加摄像机
颜色缓冲区
在渲染循环开始时,叠加摄像机接收一个颜色缓冲区,该缓冲区包含来自摄像机堆叠中先前摄像机的颜色数据。颜色缓冲区的内容不会清除。
深度缓冲区
在渲染循环开始时,叠加摄像机接收一个深度缓冲区,该缓冲区包含来自摄像机堆叠中先前摄像机的深度数据。使用 Overlay Camera Inspector 中的 Clear Depth 属性可以设置此行为。
当 Clear Depth 设置为 true 时,叠加摄像机会清除深度缓冲区,并将其视图绘制到所有现有颜色数据之上的颜色缓冲区。当 Clear Depth 设置为 false 时,叠加摄像机会在将其视图绘制到颜色缓冲区之前针对深度缓冲区进行测试。
摄像机剔除和渲染顺序
如果 URP 场景包含多个摄像机,Unity 会以可预测的顺序执行摄像机的剔除和渲染操作。
Unity 每帧执行一次以下操作:
- Unity 获取场景中所有激活的基础摄像机的列表。
- Unity 将激活的基础摄像机组织成 2 组:一组摄像机将其视图渲染到渲染纹理,另一组摄像机将其视图渲染到屏幕。
- Unity 按照 Priority 顺序对渲染到渲染纹理的基础摄像机进行排序,因此具有更高 Priority 值的摄像机将最后绘制。
- 对于渲染到渲染纹理的每个基础摄像机,Unity 执行以下步骤:
- Unity 按照 Priority 顺序对渲染到屏幕的基础摄像机进行排序,因此具有更高 Priority 值的摄像机将最后绘制。
- 对于渲染到屏幕的每个基础摄像机,Unity 执行以下步骤:
- 剔除基础摄像机
- 将基础摄像机渲染到屏幕
- 对于基础摄像机的摄像机堆叠中的每个叠加摄像机,按照在摄像机堆叠中定义的顺序:
- 剔除叠加摄像机
- 将叠加摄像机渲染到屏幕
由于叠加摄像机出现在多个摄像机堆叠中,或者由于叠加摄像机多次出现在同一个摄像机堆叠中,因此 Unity 可以在一帧内多次渲染叠加摄像机的视图。发生这种情况时,Unity 不会重用剔除或渲染操作的任何元素,而是按照上面详述的顺序完全重复这些操作。
__重要注意事项:__在此版本的 URP 中,仅当使用通用渲染器 (Universal Renderer) 时才支持叠加摄像机和摄像机堆叠。如果使用 2D 渲染器,则叠加摄像机不会执行其渲染循环的任何部分。
过度绘制
URP 在摄像机内执行多项优化,包括优化渲染顺序以减少过度绘制。但是,使用摄像机堆叠时,实际上会定义这些摄像机的渲染顺序。因此,必须小心操作,确保摄像机的顺序不会导致过度绘制。
当摄像机堆叠中的多个摄像机渲染到同一个渲染目标时,Unity 会为摄像机堆叠中的每个摄像机绘制渲染目标中的每个像素。此外,如果多个基础摄像机或摄像机堆叠渲染到同一渲染目标的同一区域,则 Unity 会再次在重叠区域中绘制所有像素,渲染次数与每个基础摄像机或摄像机堆叠所需的渲染次数相同。
您可以使用 Unity 的帧调试器 (Frame Debugger) 或特定于平台的帧捕获和调试工具来了解场景中发生太多过度绘制的位置。然后,可以相应地优化摄像机堆叠。