
本文總結(jié) Unity 中物體的渲染順序邏輯。
1. 以攝像機(jī)為第一維度
Unity 中的渲染順序,第一維度是由攝像機(jī)確定的,換句話說(shuō) Unity 是以攝像機(jī)為單元進(jìn)行渲染,最后再根據(jù)設(shè)置的規(guī)則將多個(gè)攝像機(jī)渲染的畫(huà)面合起來(lái)。
2. 劃分渲染隊(duì)列
在同一個(gè)攝像機(jī)下,Unity 以物體材質(zhì)上的 RenderQueue 數(shù)值進(jìn)行了劃分,將所有物體分為兩個(gè)隊(duì)列
- RenderQueue < 2500,Opaque 隊(duì)列,通常是不透明物體
- RenderQueue > 2500,Transparent 隊(duì)列,通常是透明物體
同一個(gè)攝像機(jī)下,Unity 會(huì)先渲染 Opaque 隊(duì)列中的不透明物體,然后渲染 Transparent 隊(duì)列中的透明物體。
3. 不透明物體的渲染
在 Opaque 隊(duì)列中的物體,根據(jù)包圍盒中心距離攝像機(jī)的距離,由近到遠(yuǎn)排序,進(jìn)行渲染,Opaque 隊(duì)列中物體都是不透明物體,通常開(kāi)啟了 ZWrite,由近到遠(yuǎn)渲染可以做遮擋剔除,減少 OverDraw,Opaque 隊(duì)列中的物體,可以設(shè)置 SortingLayer, SortingOrder, Shader 的 RenderQueue 等值,但不會(huì)起作用
4. 透明物體的渲染
透明物體的 Shader 通常關(guān)閉了 ZWrite,SortingLayer, SortingOrder, RenderQueue 這些值的設(shè)置會(huì)影響顯示的順序,所以透明物體的渲染順序遵循的規(guī)則是
- 根據(jù) SortingLayer 層的順序進(jìn)行渲染
SortingLayer 可以在 Edit->ProjectSettings->Tags&Layer 中進(jìn)行設(shè)置,在代碼中可以通過(guò)
render.sortingLayer = "Effect";這樣的代碼進(jìn)行設(shè)置
- SortingLayer 相同的情況下根據(jù) SortingOrder 的順序進(jìn)行渲染
- SortingLayer 和 SortingOrder 都相同的情況下,根據(jù) RenderQueue 的順序進(jìn)行渲染
- 都相同的情況下,根據(jù)包圍盒中心距離攝像機(jī)的距離,由遠(yuǎn)到近進(jìn)行渲染
5. UGUI 元素的渲染
UGUI 元素使用的 UI Default 材質(zhì)通常 RenderQueue 為 3000,走的是透明物體的渲染,所以根據(jù) SortingLayer -> SortingOrder -> RenderQueue 的順序進(jìn)行排序,當(dāng)以上值都相同時(shí),根據(jù)元素在 Hierarchy 視圖中的順序進(jìn)行