unity 渲染层级关系
由于某些需求需要使用 Unity 渲染,但对 Unity 渲染层级关系不太清楚,于是在网上进行了一番搜索,并对相关内容进行了总结,在此分享给大家。
Unity 渲染顺序的分层
Unity 中的渲染顺序自上而下大致分为三层,下面将详细介绍每一层的作用和设置方法。
1. Camera 层
Camera 层处于最高层级。可以在 Camera 的 depth 属性处进行设置。设置之后,图形的渲染顺序是先绘制 depth 值低的相机下的物体,再绘制 depth 值高的相机下的物体。这意味着 depth 值高的相机会覆盖 depth 值低的相机。相机之间具体的覆盖关系有 don't clear、solid color 等几种情况。
2. Sorting Layer 层
Sorting Layer 层的层级低于 Camera 层。要查看当前所有的 Sorting Layer 并更改其顺序,可以随便找一个可以设置 Sorting Layer 的地方,选择 Sorting Layer 后点击添加按钮。排位靠后的 Sorting Layer 会覆盖排位靠前的 Sorting Layer。
在设置好 Sorting Layer 的相互关系之后,就可以给任何一个继承于 Renderer 类,或者有 Renderer 的子类作为字段的对象设置 Sorting Layer。需要注意的是,这些 Sorting Layer 的遮挡关系是在同一个相机的层级下的。不同相机下的 Renderer 渲染顺序以相机的 depth 为准。
有些组件的 Sorting Layer 可以直接在 Unity Editor 里设置,例如 Sprite Renderer;而有些则需要通过代码来设置,比如设置 Particle System 的 Sorting Layer,就需要在代码中获取 ParticleSystem.Renderer.SortingLayer 进行设置。
3. Sorting Order
Sorting Order 处于比 Sorting Layer 更低的一层。这个数字代表在同一个 Sorting Layer 下的渲染顺序,其用法较为直观,在此不再赘述。
容易混淆的概念区分
需要注意的是,不要混淆 GameObject 的 Layer 和 Renderer 的 Sorting Layer。个人理解,GameObject 的 Layer 是一种逻辑上的分层,主要用于相机的 culling mask 等操作;而 Renderer 的 Sorting Layer 则用于渲染。只有继承于 Renderer 或者有 Renderer 作为字段的组件才需要设置 Sorting Layer。
NGUI 的 Widget Depth
另外需要指出的是,常用的 NGUI 的 widget depth 本质上也是一个 Sorting Layer 下的 Sorting Order。NGUI 似乎使用了一个名为 “UI” 的 Sorting Layer。因此,如果有需要,开发者也可以自行修改 NGUI 的代码,将 NGUI 的 Sorting Layer 暴露出来进行定制。
总结
综上所述,决定 Unity 渲染关系的层级顺序为:
- Camera
- Sorting Layer
- Sorting Order