Unity 2D 渲染排序

翻译自Unity - Manual: 2D Sorting (unity3d.com)

为什么翻译这篇文章?自己想搞明白Unity渲染物体的顺序,遂去搜索相关资料,发现较好的一篇博客也只是把其中几个因素(Render Queue,Sorting Order等)罗列出来,至于Unity具体怎么使用它们以及它们之间的优先级没有讲清楚,故而想把清楚解释这个问题的官方手册翻译下。

2D 排序

概览

Unity根据优先级排序渲染,优先级是基于它们的类型和用法。你可以通过Render Queue指定渲染顺序。一般,有两个主要队列,不透明队列Opaque queue和半透明队列Transparent queue。2D渲染主要是在Transparent queue,其中包含Sprite Renderer,Tilemap Renderer,和Sprite Shape Renderer这些类型。

半透明队列排序的优先级

Transparent Queue里的2D Renderers一般遵循以下优先级:

  1. Sorting Layer和Order in Layer
  2. 指定Render Queue
  3. 到相机的距离
    • 透视/正交
    • 自定义轴排序
    • 精灵排序参照点
  4. Sorting Group
  5. 材质/着色器
  6. 当多个Renderer有相同的排序优先级时,Tiebreaker出现

有其它能够引起sorting order不同于有规律优先级顺序的因素。这些因素因工程不同而不同。

Sorting Layer and Order in Layer

对于2D Renderers,通过Inspector窗口或Unity API修改Sorting Layer和Order in Layer(在Renderer的属性设置里)是有效的。设置Renderer到一个存在的Sorting Layer或者创建一个决定它的在渲染队列里的优先级。在相同Sorting Layer里,修改Order in Layering的值设置Renderer和其它Renderer的优先级。

指定渲染队列

你可以在材质球设置或者材质球着色器设置里指定Renderer的渲染队列。对于组织和排序使用不同材质球的Renderers,这是有用的。详细内容可以参照文档https://docs.unity3d.com/Manual/SL-SubShaderTags.html

到相机的距离

相机组件基于投影设置排序Renderer,两个选项分别是透视和正交。

透视

在这个模式,Renderer排序距离是Renderer到相机位置的直线距离。

正交

Render排序距离是相机沿着相机观察方向到Renderer的距离。对于默认2D设置,是沿(0,0,1)轴向。

当你设置相机组件为透视或正交时,Unity自动设置相机TransparencySortMode以匹配相机已选择模式。你可以两种方式手动设置Transparency Sort Mode:

 

  • 打开Project Settings并前往Graphics,然后Camera Settings下面是用Transparency Sort Mode
  • 通过脚本API设置相机TransparencySortMode

一个额外的通过Project Settings和通过脚本API可以设置的是自定义轴向排序模式。

自定义轴向排序模式

选择这个模式排序Renderer是基于沿着你在Projecting Settings里设置的自定义轴向的距离(主菜单:Edit > Project Settings > Graphics > Transparency Sort Axis)。常用在包含IsoMetric Tilemaps的工程,用于在Tile Map上正确排序绘制Tile Sprites。详细参考Creating an Isometric Tilemap

Sprite排序点

默认,Sprite的排序点设置在中心位置,Unity测量相机变换位置和Sprite中心位置的距离,然后在排序中决定它们的渲染顺序。一个可供替代的选项是,在世界空间里设置Sprite的Pivot为排序点。在Sprite的Sprite Renderer属性设置选择Pivot选项,并且在Sprite编辑器里编辑Sprite的Pivot位置。

Sorting Group

Sorting Group是为了排序把共享一个通用根的Renderer组织起来的组件。在同一个Sorting Group的所有Renderer共享同样的Sorting Layer,Order in Layer,和到相机的距离。设置的更多细节参考Sorting Group组件的文档。

Tiebreaker

当多个Renderer有一致的排序优先级时,tiebreaker是按照Unity放置Renderer到渲染队列的顺序。因为这是你无法控制的内部处理,你应该使用排序选项(比如Sorting Layers和Sorting Groups)保证所有Renderer有不一致的排序优先级。

Unity 2D 渲染排序

上一篇:树状数组区间加法区间查


下一篇:CloudStack服务引擎配置(cloud-engine-service模块)