一個不透明或半透明物體的顯示狀態(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)