關於渲染順序和半透明物體的渲染
首先給出結論:
在不同相機下:深度越低的相機越先渲染。
同一相機下:
RenderQueue為2500,作為渲染排序規則的分水嶺。
因為在2500以及2500以上,稱為Transparent(透明佇列),透明佇列的排序規則是完全不同的。
RenderQueue:2500以下
1。先根據Sorting Layer排序,小的後渲染。
2。同一Sorting Layer下,根據Order in layer排序,同樣小的先渲染
3。以上兩個都相同,則根據RenderQueue排序,小的先渲染
4。最後根據距離相機的遠近排序,
近
的先渲染
RenderQueue:2500以及2500以上
1。先根據Sorting Layer排序,小的後渲染。
2。同一Sorting Layer下,根據Order in layer排序,同樣小的先渲染
3。以上兩個都相同,則根據RenderQueue排序,小的先渲染
4。最後根據距離相機的遠近排序,
遠
的先渲染
Canvas:
Canvas中的UI理論上都是透明佇列裡渲染的。
但是根據Canvas的RenderMode有額外的規則。
在Canvas中:
1。不同canvas之間,根據canvas的Sort Order排序,小的先渲染
2。同一canvas下,深度越低的越先渲染。
關於對UI深度的計算和解釋:
UGUI研究院之UI的深度學習(二) | 雨松MOMO程式研究院
Optimizing Unity UI - Unity Learn
距離相機遠近對UI的渲染順序並沒有影響,而是根據每個UI的深度資訊。
Sprite和Canvas,預設使用的Shader關閉了深度寫入,但是會進行深度測試,預設 RenderQueue 都為 3000(Transparent)
問題:
Sprite也是透明佇列裡渲染的。
為什麼canvas的總是渲染在sprite的上層(也就是後渲染)
這跟我們設定Canvas的RenderMode有關
1。當為overlay模式的時候,UI永遠在最上層。
2。當為Camera模式的時候,Canvas會作為一個整體(內部還是老規則),參加世界空間的排序。
3。當為World模式時,同上,只不過沒有了螢幕自適應的功能。
當為2,3模式時,Canvas上會出現Sorting Layer和Order in layer。這時就適用了上面說的RenderQueue為透明佇列的規則。
問題
1。為什麼不透明的物體是從前往後?
因為深度關係的原因,從前往後渲染,一些在後面已經被擋住的物體,明顯是看不到的。如果繼續對他渲染那麼這次就是一次無效渲染。為了節省效能,從而我們在渲染的時候,會記錄物體的深度值到深度快取區中(這裡的深度可以簡單認為是距離相機的距離),如果後面渲染的物體深度值大於(或者小於,具體跟渲染底層機結構不同有關)現在已經渲染的物體的深度值,那麼說明他是在該物體的背後,是看不到的,就會丟棄此次渲染來節省效能。這個操作叫深度測試。先渲染前面的,再渲染後面的,當後面的物體進行深度測試時,如果不透過,說明被遮擋了,則丟棄此次渲染。
2。為什麼透明的物體是從後往前?
因為透明的物體是會看到背後的物體的,所以我們需要把該透明物體的顏色和背後物體的顏色進行混合,在Unity引擎中,可以自定義Blend操作(混合選項),因為底層固定了混合選項的計算順序(前面物體的顏色*混合因子 + 後面物體的顏色 * 混合因子),所以在渲染的時候也要固定渲染的順序,才能保證正確的混合結果。
關於半透明3D物體的渲染問題
1。半透明的多個物體之間渲染:在多個半透明物體之間相互互動插入的情況下就會出現問題,因為半透明的前後渲染順序是根據中心點來排序的,如果A物體的中心點在B物體中心的之前,但是A物體的有一部分在B物體後,我們就會用A去混合B,這樣的混合模式對於那一特殊的部分來說是錯的。
2。解決單個半透明物體之間的渲染問題:在多個物體之間,我們可以透過排序來解決先後渲染問題,但是一個3D模型之間,在光柵化階段生成許多個圖元的時候,我們並不能保證圖元渲染的前後順序,這個順序是根據mesh中的三角面順序來的,這樣就會導致可能有的背面會感覺渲染在前面的樣子。
解決辦法是用兩個Pass,第一個Pass寫入深度資訊不做渲染,第二個Pass再做渲染。
這樣還有一個問題就是隻會看到前面。不能透過前面看到背面的物體。
同樣也有解決辦法:同樣使用兩個Pass來渲染,第一個Pass先渲染背面,第二個Pass再渲染前面。
在渲染很複雜的模型時,也會出現問題。最好的解決辦法就是把模型分為不同的模型。但是會比較麻煩。
3。為什麼半透明物體需要關閉深度寫入,同時開啟深度測試?
為了保證同一個場景中半透明物體被不透明物體遮擋後該片元能被正常捨棄,要保持深度測試。
就如上面第二所說,無法保證一個模型中圖元的前後順序,會造成混合的時候混合效果混亂,這是關閉了深度寫入的情況下,如果開啟了深度寫入,那就不是混合效果錯的問題了,就會把後面的直接給丟棄而不會產生混合效果。
提供例子的文章:
深度測試(ZTest)和深度寫入(ZWrite)【二】應用在半透明物體上_qinxiao的部落格-CSDN部落格
關於半透明深度測試的優秀問題:
為什麼半透明模型的渲染要使用深度測試而關閉深度寫入?