渲染順序

一個不透明或半透明物體的顯示狀態(tài)應(yīng)該怎樣確定?

一般在畫畫的時候:
首先將場景的多邊形根據(jù)深度進行排序,然后按照順序進行繪制
但是如果有半透明的東西呢?他們之間相互混合,也十分復(fù)雜

為了解決這些問題,計算機咋整呢?

深度緩沖區(qū)(Depth Buffer)
記錄像素的深度信息,存儲像素到攝像機的深度
每一幀開始前,深度緩沖區(qū)都會被清空。
當(dāng)需要渲染新的像素時,像素的深度會預(yù)先被計算出來,比較這個像素的深度值與緩沖區(qū)中的值
通過算法判斷是否要通過該像素,或需要在深度緩沖區(qū)中寫入該像素的深度

在場景沒有透明物體的情況下,我們可以按照緩沖區(qū)比較,無需對場景中的物體進行排序,也避免了重復(fù)繪制
既能解決重疊的問題,又可以帶來性能的提升


但是有透明物體咋整呢?
如果透明物體A在不透明物體B前面,A離攝像機距離一定B更近
如果A寫入了深度值,B就不會被繪制,自然也看不到半透明效果

引進了渲染隊列的概念。
啥玩意是渲染隊列?
也是按深度緩沖,但將不透明與半透明的物體分開
先渲染不透明的物體,對比起深度值,并將其深度值寫入緩沖
然后再渲染半透明物體,只對比深度值,不寫入緩沖(半透明物體之間使用深度值)


Unity中的預(yù)定義渲染隊列(隊列索引號越小,越早被渲染)

渲染隊列-----------------渲染隊列索引
Background------------------1000 (skybox已經(jīng)不在這里了)
Geometry---------------------2000
AlphaTest---------------------2450
Transparent------------------3000
Overlay------------------------4000

Shader "my/test"
{
  SubShader
  {
    Tags { "Queue" = "Geometry"}
  }
}

使用渲染隊列后也會有一些問題
如果相互穿插,就沒有辦法得到正確的排序,進而得到錯誤的顏色值

解決方法:
1.拆分或優(yōu)化模型的形狀,降低穿插
2.調(diào)整混合參數(shù),看起來不那么明顯
3.預(yù)先深度Pass(Pre Depth Pass)方法(有額外drawcall)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容