渲染隊列仅乓、ZWrite和ZTest

<轉(zhuǎn)>我也忘了轉(zhuǎn)自哪里,抱歉,感謝原作者

(1)什么是深度现斋?

?深度其實就是該像素點在3d世界中距離攝像機的距離转唉。離攝像機越遠(yuǎn)劝堪,則深度值(Z值)越大贬墩。


(2)什么是深度緩存呀闻?

深度緩存中存儲著準(zhǔn)備要繪制在屏幕上的像素點的深度值精肃。如果啟用了深度緩沖區(qū)秤涩,在繪制每個像素之前,OpenGL會把該像素的深度值和深度緩存的深度值進行比較司抱。如果新像素深度值<深度緩存深度值筐眷,則新像素值會取代原先的;反之习柠,新像素值被遮擋匀谣,其顏色值和深度將被丟棄。(深度主要起的是比較的作用)


(3)什么是深度測試资溃?

在深度測試中武翎,默認(rèn)情況是將要繪制的新像素的z值與深度緩沖區(qū)中對應(yīng)位置的z值進行比較,如果比深度緩存中的值小溶锭,那么用新像素的顏色值更新深度緩存中對應(yīng)像素的顏色值宝恶。


(4)為什么需要深度?

在不使用深度測試的時候趴捅,如果我們先繪制一個距離較近的物體垫毙,再繪制距離較遠(yuǎn)的物體,則距離遠(yuǎn)的物體因為后繪制拱绑,會把距離近的物體覆蓋掉露久,這樣的效果并不是我們所希望的。而有了深度緩沖以后欺栗,繪制物體的順序就不那么重要了毫痕,都能按照遠(yuǎn)近(Z值)正常顯示征峦,這很關(guān)鍵。



那么消请,在unity中栏笆,如果知道了渲染隊列,ZWrite臊泰,ZTest蛉加,如何確定哪個物體先顯示呢?

首先缸逃,unity先將渲染隊列中較前的進行渲染针饥,然后再執(zhí)行ZWrite,ZTest

ZWrite可以取的值為:On/Off需频,默認(rèn)值為On丁眼,代表是否要將像素的深度寫入深度緩存中(同時還要看ZTest是否通過)。

ZTest可以取的值為:Greater/GEqual/Less/LEqual/Equal/NotEqual/Always/Never/Off昭殉,默認(rèn)值為LEqual苞七,代表通過比較深度來更改顏色緩存的值。例如當(dāng)取默認(rèn)值的情況下挪丢,如果將要繪制的新像素的z值小于等于深度緩存中的值蹂风,則將用新像素的顏色值更新深度緩存中對應(yīng)像素的顏色值。需要注意的是乾蓬,當(dāng)ZTest取值為Off時惠啄,表示的是關(guān)閉深度測試,等價于取值為Always任内,而不是Never礁阁!Always指的是直接將當(dāng)前像素顏色(不是深度)寫進顏色緩沖區(qū)中;而Never指的是不要將當(dāng)前像素顏色寫進顏色緩沖區(qū)中族奢,相當(dāng)于消失。



///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

那么丹鸿,重點來了:

1.當(dāng)ZWrite為On時越走,ZTest通過時,該像素的深度才能成功寫入深度緩存靠欢,同時因為ZTest通過了廊敌,該像素的顏色值也會寫入顏色緩存。

2.當(dāng)ZWrite為On時门怪,ZTest不通過時骡澈,該像素的深度不能成功寫入深度緩存,同時因為ZTest不通過掷空,該像素的顏色值不會寫入顏色緩存肋殴。

3.當(dāng)ZWrite為Off時囤锉,ZTest通過時,該像素的深度不能成功寫入深度緩存护锤,同時因為ZTest通過了官地,該像素的顏色值會寫入顏色緩存。

4.當(dāng)ZWrite為Off時烙懦,ZTest不通過時驱入,該像素的深度不能成功寫入深度緩存,同時因為ZTest不通過氯析,該像素的顏色值不會寫入顏色緩存亏较。


可以看到,像素的深度能否成功寫入深度緩存掩缓,條件是ZWrite為On雪情,ZTest通過;

寫入深度緩存的作用就是為ZTest的比較做準(zhǔn)備拾因。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


因為ZWrite默認(rèn)值為On旺罢,ZTest默認(rèn)值為LEqual,所以這很好地解釋了為什么在unity中绢记,距離相機近的東西會阻擋住距離相機遠(yuǎn)的東西扁达。如果我們先繪制一個距離較近的物體,再繪制距離較遠(yuǎn)的物體蠢熄,則距離遠(yuǎn)的物體因為后繪制跪解,會把距離近的物體覆蓋掉,這時我們可以通過修改ZWrite和ZTest來改變物體的遮擋關(guān)系签孔!


測試環(huán)境(藍(lán)色方塊距離相機較近叉讥,注意這個不是Game視圖):



測試的Shader代碼(兩個方塊的shader代碼起始都是一樣的,測試時修改的是測試區(qū)里的代碼):

Shader?"Custom/ZTest"?{??

????Properties?{??

????????_MainTex?("Base?(RGB)",?2D)?=?"white"?{}??

????}??

????SubShader?{??

????????Tags?{?"RenderType"="Opaque"?}??

????????LOD?200??

/////////////////////////////////////////測試區(qū)??

????????Tags{?"Queue"?=?"Geometry"?}??

????????//ZWrite?Off??

????????//ZTest?Off??

/////////////////////////////////////////測試區(qū)??

????????CGPROGRAM??

????????#pragma?surface?surf?Lambert??


????????sampler2D?_MainTex;??


????????struct?Input?{??

????????????float2?uv_MainTex;??

????????};??


????????void?surf?(Input?IN,?inout?SurfaceOutput?o)?{??

????????????half4?c?=?tex2D?(_MainTex,?IN.uv_MainTex);??

????????????o.Albedo?=?c.rgb;??

????????????o.Alpha?=?c.a;??

????????}??

????????ENDCG??

????}???

????FallBack?"Diffuse"??

}??



渲染順序:先藍(lán)色方塊再白色方塊(以下簡稱藍(lán)饥追,白)

注意ZWrite默認(rèn)值為On图仓,ZTest默認(rèn)值為LEqual,沒有渲染物體時但绕,深度緩存中的深度可以理解為無限大

1.

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??

????????Tags{?"Queue"?=?"Geometry+200"?}??

????????ZWrite?Off??

????????//ZTest?Off??

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??


/////////////////////////////////////////白色方塊測試區(qū)??

????????Tags{?"Queue"?=?"Geometry+300"?}??

????????//ZWrite?Off??

????????//ZTest?Off??

/////////////////////////////////////////白色方塊測試區(qū)??


結(jié)果:白在前面

分析:藍(lán)沒有將像素寫進深度緩存中救崔,ZTest通過了,顏色緩存中存放了藍(lán)的顏色值

白將像素寫進深度緩存中捏顺,ZTest通過了六孵,顏色緩存的值變?yōu)榘椎模燥@示白


2.

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??

????????Tags{?"Queue"?=?"Geometry+200"?}??

????????//ZWrite?Off??

????????//ZTest?Off??

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??


/////////////////////////////////////////白色方塊測試區(qū)??

????????Tags{?"Queue"?=?"Geometry+300"?}??

????????//ZWrite?Off??

????????//ZTest?Off??

/////////////////////////////////////////白色方塊測試區(qū)??


結(jié)果:藍(lán)在前面

分析:藍(lán)將像素寫進深度緩存中幅骄,ZTest通過了劫窒,顏色緩存中存放了藍(lán)的顏色值

而白的像素深度大于藍(lán)的,既沒有成功將像素寫進深度緩存拆座,同時ZTest不通過主巍,像素被舍棄冠息,所以顯示藍(lán)


3.

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??

????????Tags{?"Queue"?=?"Geometry+200"?}??

????????ZWrite?Off??

????????ZTest?Off??

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??


/////////////////////////////////////////白色方塊測試區(qū)??

????????Tags{?"Queue"?=?"Geometry+300"?}??

????????//ZWrite?Off??

????????//ZTest?Off??

/////////////////////////////////////////白色方塊測試區(qū)??


結(jié)果:白在前面

分析:藍(lán)沒有將像素寫進深度緩存中,ZTest通過了煤禽,顏色緩存中存放了藍(lán)的顏色值

白將像素寫進深度緩存中铐达,ZTest通過了,顏色緩存中存放為白的顏色值


4.

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??

????????Tags{?"Queue"?=?"Geometry+200"?}??

????????//ZWrite?Off??

????????//ZTest?Off??

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??


/////////////////////////////////////////白色方塊測試區(qū)??

????????Tags{?"Queue"?=?"Geometry+300"?}??

????????//ZWrite?Off??

????????ZTest?Off??

/////////////////////////////////////////白色方塊測試區(qū)??


結(jié)果:白在前面

分析:藍(lán)將像素寫進了深度緩存中

白將像素寫進了深度緩存中檬果,ZTest通過了瓮孙,白將顏色緩存中的藍(lán)的像素顏色值替換了。


5.

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??

????????Tags{?"Queue"?=?"Geometry+200"?}??

????????//ZWrite?Off??

????????//ZTest?Off??

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??


/////////////////////////////////////////白色方塊測試區(qū)??

????????Tags{?"Queue"?=?"Geometry+300"?}??

????????ZWrite?Off??

????????ZTest?Off??

/////////////////////////////////////////白色方塊測試區(qū)??


結(jié)果:白在前面

分析:藍(lán)將像素寫進了深度緩存中

白沒能將像素寫進了深度緩存中(ZWrite為off)选脊,但ZTest通過了杭抠,此時顏色緩存的值變?yōu)榘椎模巧疃染彺娴闹凳撬{(lán)的


6.

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??

????????Tags{?"Queue"?=?"Geometry+200"?}??

????????//ZWrite?Off??

????????ZTest?Off??

/////////////////////////////////////////藍(lán)色方塊測試區(qū)??


  • /////////////////////////////////////////白色方塊測試區(qū)??
  • ????????Tags{?"Queue"?=?"Geometry+300"?}??
  • ????????//ZWrite?Off??
  • ????????ZTest?Off??
  • /////////////////////////////////////////白色方塊測試區(qū)??


  • 結(jié)果:白在前面

    分析:藍(lán)將像素寫進了深度緩存中

    白將像素寫進了深度緩存中恳啥,ZTest通過了偏灿,此時顏色緩存的值變?yōu)榘椎?/p>


    7.

  • /////////////////////////////////////////藍(lán)色方塊測試區(qū)??
  • ????????Tags{?"Queue"?=?"Geometry+200"?}??
  • ????????ZWrite?Off??
  • ????????//ZTest?Off??
  • /////////////////////////////////////////藍(lán)色方塊測試區(qū)??

  • /////////////////////////////////////////白色方塊測試區(qū)??
  • ????????Tags{?"Queue"?=?"Geometry+300"?}??
  • ????????ZWrite?Off??
  • ????????//ZTest?Off??
  • /////////////////////////////////////////白色方塊測試區(qū)??

  • 結(jié)果:白在前面

    分析:白、藍(lán)都沒有將像素寫入深度緩存中钝的,所以深度緩存中的深度值為無窮大翁垂,最后因為白中ZTest默認(rèn)值的原因,所以顯示白


    8.

  • /////////////////////////////////////////藍(lán)色方塊測試區(qū)??
  • ????????Tags{?"Queue"?=?"Geometry+200"?}??
  • ????????ZWrite?Off??
  • ????????ZTest?Off??
  • /////////////////////////////////////////藍(lán)色方塊測試區(qū)??

  • /////////////////////////////////////////白色方塊測試區(qū)??
  • ????????Tags{?"Queue"?=?"Geometry+300"?}??
  • ????????ZWrite?Off??
  • ????????ZTest?Off??
  • /////////////////////////////////////////白色方塊測試區(qū)??

  • 結(jié)果:白在前面

    分析:與7類似

    最后編輯于
    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
    • 序言:七十年代末硝桩,一起剝皮案震驚了整個濱河市沿猜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碗脊,老刑警劉巖啼肩,帶你破解...
      沈念sama閱讀 212,080評論 6 493
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衙伶,居然都是意外死亡祈坠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 90,422評論 3 385
    • 文/潘曉璐 我一進店門矢劲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赦拘,“玉大人,你說我怎么就攤上這事芬沉√赏” “怎么了?”我有些...
      開封第一講書人閱讀 157,630評論 0 348
    • 文/不壞的土叔 我叫張陵花嘶,是天一觀的道長。 經(jīng)常有香客問我蹦漠,道長椭员,這世上最難降的妖魔是什么? 我笑而不...
      開封第一講書人閱讀 56,554評論 1 284
    • 正文 為了忘掉前任笛园,我火速辦了婚禮隘击,結(jié)果婚禮上侍芝,老公的妹妹穿的比我還像新娘。我一直安慰自己埋同,他們只是感情好州叠,可當(dāng)我...
      茶點故事閱讀 65,662評論 6 386
    • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凶赁,像睡著了一般咧栗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虱肄,一...
      開封第一講書人閱讀 49,856評論 1 290
    • 那天致板,我揣著相機與錄音,去河邊找鬼咏窿。 笑死斟或,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的集嵌。 我是一名探鬼主播萝挤,決...
      沈念sama閱讀 39,014評論 3 408
    • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼根欧!你這毒婦竟也來了怜珍?” 一聲冷哼從身側(cè)響起,我...
      開封第一講書人閱讀 37,752評論 0 268
    • 序言:老撾萬榮一對情侶失蹤咽块,失蹤者是張志新(化名)和其女友劉穎绘面,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侈沪,經(jīng)...
      沈念sama閱讀 44,212評論 1 303
    • 正文 獨居荒郊野嶺守林人離奇死亡揭璃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
      茶點故事閱讀 36,541評論 2 327
    • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了亭罪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘦馍。...
      茶點故事閱讀 38,687評論 1 341
    • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖应役,靈堂內(nèi)的尸體忽然破棺而出情组,到底是詐尸還是另有隱情,我是刑警寧澤箩祥,帶...
      沈念sama閱讀 34,347評論 4 331
    • 正文 年R本政府宣布院崇,位于F島的核電站,受9級特大地震影響袍祖,放射性物質(zhì)發(fā)生泄漏底瓣。R本人自食惡果不足惜,卻給世界環(huán)境...
      茶點故事閱讀 39,973評論 3 315
    • 文/蒙蒙 一蕉陋、第九天 我趴在偏房一處隱蔽的房頂上張望捐凭。 院中可真熱鬧拨扶,春花似錦、人聲如沸茁肠。這莊子的主人今日做“春日...
      開封第一講書人閱讀 30,777評論 0 21
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽垦梆。三九已至匹颤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奶赔,已是汗流浹背惋嚎。 一陣腳步聲響...
      開封第一講書人閱讀 32,006評論 1 266
    • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留站刑,地道東北人另伍。 一個月前我還...
      沈念sama閱讀 46,406評論 2 360
    • 正文 我出身青樓,卻偏偏與公主長得像绞旅,于是被迫代替她去往敵國和親摆尝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
      茶點故事閱讀 43,576評論 2 349

    推薦閱讀更多精彩內(nèi)容

    • 本篇unity3d教程我們來看下Unity渲染隊列、ZWrite和ZTest相關(guān)介紹晃琳,首先我們來了解幾個概念(1)...
      JumboWu閱讀 5,223評論 1 8
    • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理讯检,服務(wù)發(fā)現(xiàn),斷路器卫旱,智...
      卡卡羅2017閱讀 134,633評論 18 139
    • 一.Tags(標(biāo)簽)通過使用tags來告訴渲染引擎在什么時候該如何渲染他們所期望的效果人灼。注意的是,SubShade...
      karma085閱讀 5,345評論 1 4
    • 李希貴說顾翼,“從來就沒有意義上任何培訓(xùn)投放,所謂的培訓(xùn)只是讓你遇到某個人,經(jīng)歷某件事适贸【姆迹” 春暖花開的三月,有幸跟楊校長一...
      董余蘭閱讀 577評論 0 2
    • 是五月的橙紅柳綠 喚醒早初的夏滿 每個人都在忙忙碌碌尋寶藏 我只想記得家在哪里 夜里的熏燈 院子里的燈籠微微在閃 ...
      白箋閱讀 295評論 0 2