渲染器和材质优先级
渲染管线必须在渲染对象之前对其进行排序,以确保它们以正确的顺序出现在屏幕上。渲染管线必须首先绘制远离摄像机的对象,以便稍后可以在其基础之上绘制更近的对象。如果顺序不正确,远离摄像机的对象可能会出现在较近对象的前面。
内置的 Unity 渲染管线根据游戏对象的渲染模式 (Rendering Mode) 和 renderQueue 对游戏对象进行排序。HDRP 使用渲染队列的方式不同,因为 HDRP 材质不直接显示渲染队列。相反,HDRP 引入了两种控制方法。按材质排序和按渲染器排序。
HDRP 一起使用这两种排序方法来控制渲染队列。为了计算渲染队列的顺序,HDRP 执行以下操作:
- 将网格划分为共享材质的组
- 使用每个材质 Priority 属性来计算这些材质组的渲染顺序
- 使用每个网格渲染器 (Mesh Renderer) 的 Priority 属性对材质组进行排序。
生成的队列是游戏对象列表,其中的游戏对象首先按照材质的 Priority 排序,然后按照各自的网格渲染器的 Priority 排序。
按材质排序
具有 Transparent Surface Type 的材质具有 Sorting Priority 属性,您可以使用该属性对使用不同材质的网格组进行排序。此属性是一个介于 -100 和 100 之间的整数值。
HDRP 支持负值,因此可以轻松地将新材质指定为最低优先级。如果希望将新材质指定为最低优先级,但最低优先级已用于另一个材质,这将非常有用。在这种情况下,可以将新材质的优先级指定为负值,而不必为了配合新材质而将每个其他材质的排序优先级加一。
HDRP 使用 Sorting Priority 对场景中使用不同材质的游戏对象进行排序。HDRP 首先渲染具有较小 Sorting Priority 值的材质。这意味着,材质 Sorting Priority 值较高的网格会显示在材质 Sorting Priority 值较低的网格的前面,即便使用第一个材质的网格距离摄像机更远也是如此。
例如,以下场景包括两个使用两种不同材质的球体(Sphere 1 和 Sphere 2)。如图所示,Sphere 1 比 Sphere 2 更靠近 Camera。
当每种材质的 Sort Priority 相同时,HDRP 会以相同的重要性对待它们,并使渲染顺序基于材质与摄像机之间的距离。在此示例中,两种材质的 Sort Priority 都设置为 0,因此 HDRP 按照它们与摄像机的距离所决定的顺序渲染它们,这意味着 Sphere 1 显示在 Sphere 2 前面。
当不同材质的 Sort Priority 属性不相同时,HDRP 会将材质优先级较高的网格显示在材质优先级较低的网格前面。为了实现这一目的,HDRP 首先使用优先级较低的材质绘制网格,然后使用优先级较高的材质在已经绘制的网格基础之上绘制网格。在此示例中,将 Sphere 2 的 Sort Priority 设置为 1 意味着 HDRP 先渲染 Sphere 1,然后渲染 Sphere 2(在 Sphere 1 基础之上绘制)。这使得 Sphere 2 出现在 Sphere 1 的前面(尽管 Sphere 1 更接近 Camera)。
⚠ 请注意,为材质启用 Depth Write 后,将忽略 Sort Priority。这是因为在着色器中执行的深度测试 (Depth Test) 会覆盖材质的 Sort Priority 设置。
按渲染器排序
网格渲染器具有 Priority 属性,因此可以对场景中使用相同材质的渲染器进行排序。
如果要修改使用相同材质的游戏对象的渲染顺序,请使用网格渲染器 Inspector 中的 Priority属性。Priority 是每个渲染器的属性,可用于影响场景中渲染器的渲染顺序。
HDRP 将 Priority 值较高的渲染器显示在 Priority 值较低的渲染器前面。
还可以在脚本中通过设置 rendererPriority 值来编辑网格渲染器的 Renderer Priority。
用法示例
以下场景包括两个使用相同材质的球体(Sphere 1 和 Sphere 2)。如图所示,Sphere 1 比 Sphere 2 更靠近 Camera。
当每个网格渲染器的 Renderer Priority 相同时,HDRP 会以相同的重要性对待它们,并使渲染顺序基于每个网格渲染器与摄像机之间的距离。在此示例中,两个网格渲染器的 Renderer Priority 都设置为 0,因此 HDRP 按照它们与摄像机的距离所决定的顺序渲染它们,这意味着 Sphere 1 显示在 Sphere 2 前面。
当不同网格渲染器的 Renderer Priority 属性不相同时,HDRP 会将优先级较高的网格渲染器显示在优先级较低的网格渲染器前面。为了实现这一目的,HDRP 首先绘制优先级较低的网格,然后在已经绘制的网格基础之上绘制优先级较高的网格。在此示例中,将 Sphere 2 的 Renderer Priority 设置为 1 意味着 HDRP 先渲染 Sphere 1,然后渲染 Sphere 2(在 Sphere 1 基础之上绘制)。这使得 Sphere 2 出现在 Sphere 1 的前面(尽管 Sphere 1 更接近 Camera)。