對于兩個(gè)不透明的物體A和B,它們處于同一個(gè)渲染隊(duì)列中。假如它們一前一后地?cái)[放著,當(dāng)先渲染A再渲染B,那么B顯示在前面;當(dāng)先渲染B再渲染A,那么A顯示在前面。因此,單靠渲染隊(duì)列還是無法很好解決物體間的遮擋關(guān)系,這時(shí)就需要利用深度這個(gè)東西了。
深度
- 指該像素距離攝像機(jī)的距離。離攝像機(jī)越遠(yuǎn),深度越大。
深度緩沖 & 顏色緩沖
- 深度緩沖中存儲著每個(gè)像素對應(yīng)的深度值。
- 顏色緩沖中存儲著每個(gè)像素對應(yīng)的顏色值。
深度測試
- 將像素的深度與深度緩沖的深度進(jìn)行比較。如果通過了深度測試,就有機(jī)會去改寫深度緩沖的對應(yīng)值;否則該像素會被舍棄。
語法如下:
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always
默認(rèn)值為LEqual,小于等于。即表示如果像素的深度小于等于深度緩沖的深度,則通過了深度測試。
那么他們的情況就有如下幾種:
- 當(dāng)ZWrite為On時(shí),ZTest通過時(shí),該像素的深度才能成功寫入深度緩存,同時(shí)因?yàn)閆Test通過了,該像素的顏色值也會寫入顏色緩存。
- 當(dāng)ZWrite為On時(shí),ZTest不通過時(shí),該像素的深度不能成功寫入深度緩存,同時(shí)因?yàn)閆Test不通過,該像素的顏色值不會寫入顏色緩存。
- 當(dāng)ZWrite為Off時(shí),ZTest通過時(shí),該像素的深度不能成功寫入深度緩存,同時(shí)因?yàn)閆Test通過了,該像素的顏色值會寫入顏色緩存。
- 當(dāng)ZWrite為Off時(shí),ZTest不通過時(shí),該像素的深度不能成功寫入深度緩存,同時(shí)因?yàn)閆Test不通過,該像素的顏色值不會寫入顏色緩存。
Shader "Custom/Depth Test" {
Properties {
//定義一個(gè)貼圖
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader
{
Pass
{
zwrite on //打開深度緩存
ztest greater //打開深度測試,顏色通過
}
Pass
{
SetTexture [_MainTex]
{
Combine texture * primary //正面賦予貼圖
}
}
}
FallBa
總結(jié):zwrite只是處理深度值,ztest才是決定采用誰的顏色值,zwrite只是為ztest服務(wù)的。默認(rèn)情況下unity采用的是zwrite為on,ztest為lqeual 也就是越靠近相機(jī)的顯示優(yōu)先級越高。
深度寫入
- 是否要將像素的深度寫入到深度緩沖中。前提是通過了深度測試。
語法如下:
ZWrite On / Off: 開啟深度緩沖/關(guān)閉深度緩沖(其實(shí)就是記錄Z值,把最小的Z存放在緩沖中),一般情況不透明的物體都會使用zwrite on 而 半透明的物體都會使用 zwrite off 這樣半透明的物體就直接比較ztest了。
默認(rèn)值為On,即寫入深度緩沖。
渲染隊(duì)列
前面我們說的zwrite 和 ztest 可以理解為在同一個(gè)隊(duì)列里面進(jìn)行的,我們知道在Tag 里面可以設(shè)置queue這個(gè)參數(shù)來表明物體所在的隊(duì)列。也許你看到的不透明不同越靠近相機(jī),半透明物體遠(yuǎn)離相機(jī),但是由于他們的queue不同也就是基礎(chǔ)深度不同,所以他們渲染的渲染順序也是不同的。
總結(jié)
a.根據(jù)這兩個(gè)默認(rèn)值,可以知道,離攝像機(jī)近的會遮擋住離攝像機(jī)遠(yuǎn)的,因此也就解決了最開始說的兩個(gè)物體的遮擋問題:假如A在前B在后,當(dāng)先渲染A再渲染B,在渲染B時(shí)B不能通過深度測試從而被舍棄;當(dāng)先渲染B再渲染A,在渲染A時(shí)A通過深度測試從而覆蓋了B。因此對于不透明物體間的遮擋,通過這兩個(gè)默認(rèn)值就可以得到很好的處理。
b.當(dāng)深度測試不通過時(shí),該像素會被舍棄,深度緩沖和顏色緩沖無變化;否則,該像素的顏色值會覆蓋掉顏色緩沖的顏色值,然后根據(jù)深度寫入來決定是否覆蓋掉深度緩沖中的深度值。
