快速連結

2021年5月15日

渲染順序 Rendering order

最近有同事在研究NGUI與UGUI的渲染順序關係(假如用同一個camera下),不過今天不是想講這個議題,而是來講講渲染順序。
當然也是有參考一些網路上的文章,本文主要是我看完後吸收到的結論。

以下圖片是實作渲染順序,如果看不懂…請再跟我說。(以下皆使用2017.4.3f1)


Camera

相機Depth值愈大,渲染時間愈後面。


透明物件與不透明物件

在同一相機之下:
RenderQueue 2500以下(不含)是不透明物件,渲染時間較早。
RenderQueue 2500以上是透明物件,渲染時間較晚。
不透明物件,可以在Material選擇RenderQueue.Geometry;而透明物件則是用RenderQueue.Transparent。
列舉詳細可見:RenderQueue 列舉

Sorting Layer

排序圖層名稱,在有用到Renderer (SpriteRenderer 、Canvas、Particle等等)會看到它。
可以在Tags and Layers找到,並且進行設置,排序愈下面,渲染時間愈晚。
順帶一提,如果有需要是可以順序亂調的,除了Default。
調整後:
而且這個可以使用程式碼去改變Sorting Layer Name:

  Renderer renderer = GetComponent();
  renderer.sortingLayerName = "Third";


Order in Layer

渲染器在排序圖層類型內的順序,值愈大,渲染順序愈後面。
一樣,可以使用程式碼去改變order!

Render Queue

值愈大,物件的渲染時間就愈晚。
可以嘗試創建出一個Material,並shader改一下,找到RenderQueue並將其改變,然後拉入物件內,就可以看見該物件的渲染順序的改變。


深度排序

這部分就無關UI,畢竟透明物件會關閉深度(ZWrite Off),不過還是照本宣科一下:
基本上就是與Camera的距離,愈近就渲染得愈晚,愈遠就渲染得愈早。
深度太相近,就會看見補位(也就是看見A方塊有時候會比B方塊晚渲染、有時候卻早渲染) 因為本身沒有研究這部分,詳細說明參考此篇:思元的開發筆記 - Unity rendering order 整理筆記

結論

渲染順序上來說:
  1. Camera深度
  2. 同個Camera狀況下,看透明或不透明物件
  3. 如果都是透明物件,看Sorting Layer
  4. 如果同個Sorting Layer,看Order in Layer
  5. (僅2D UI)如果同個Sorting Layer,也同個Order in Layer,看Hierarchy排序
  6. 如果同個Sorting Layer,也同個Order in Layer,看Renderer Queue
  7. (不含透明物件)如果以上都相同,看深度排序
NGUI的狀況則是Sorting Layer是預設 Default,Order in Layer是0,Render Queue為3000起跳。

沒有留言:

張貼留言

歡迎大家留言提問,我會答的都會盡力回答!
如果太久沒出現回應就是我又忘記回來看留言了TAT