1. 程式人生 > 其它 >Unity 2D 渲染排序

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有不一致的排序優先順序。