UnityShader:深度測試&深度寫入

對于兩個(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,小于等于。即表示如果像素的深度小于等于深度緩沖的深度,則通過了深度測試。
    那么他們的情況就有如下幾種:
  1. 當(dāng)ZWrite為On時(shí),ZTest通過時(shí),該像素的深度才能成功寫入深度緩存,同時(shí)因?yàn)閆Test通過了,該像素的顏色值也會寫入顏色緩存。
  2. 當(dāng)ZWrite為On時(shí),ZTest不通過時(shí),該像素的深度不能成功寫入深度緩存,同時(shí)因?yàn)閆Test不通過,該像素的顏色值不會寫入顏色緩存。
  3. 當(dāng)ZWrite為Off時(shí),ZTest通過時(shí),該像素的深度不能成功寫入深度緩存,同時(shí)因?yàn)閆Test通過了,該像素的顏色值會寫入顏色緩存。
  4. 當(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ù)深度寫入來決定是否覆蓋掉深度緩沖中的深度值。


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

相關(guān)閱讀更多精彩內(nèi)容

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