上一篇關(guān)于不透明物體,這一篇我們來探究半透明物體。
如果要想得到一個正常的渲染效果:先渲染不透明物體,順序(相對于渲染攝像機的距離)是從近到遠(yuǎn);再渲染透明物體,順序是從遠(yuǎn)到近。
在渲染透明物體時:
ZWrite (深度寫入) Off(關(guān)閉)
ZTest? (深度測試)LEqual(開啟)
————————————————————————
第一個提問:為什么要先渲染不透明物體?
答:如果我們先渲染透明物體,無論透明物體是否開啟了深度寫入,是否處于最前方都將被不透明物體覆蓋(根據(jù)第上一節(jié)的內(nèi)容自己想一下。)
第二個提問:為什么渲染不透明物體是由近往遠(yuǎn)的順序,難道有什么優(yōu)勢嗎?
答:是的,首先我們知道ZTest??默認(rèn)狀態(tài)為LEqual(小于),需要渲染物體的深度值如果小于深度緩存中的數(shù)值才會被渲染,假設(shè)攝像機正前方有10個物體,他們距離攝像機的距離以此遞增,編號也是遞增,如果我們先渲染最遠(yuǎn)的10號物體,寫入緩存,然后在用9號物體LEqual滿足,在寫入緩存,在8號物體LEqual寫入緩存……這樣將消耗很多無用的計算,但是如果先渲染1號物體就不需要了,自己想想看。
第三個問題 為什么透明的物體是由遠(yuǎn)往近的順序,難道也第二個問題一樣存在效率優(yōu)勢問題嗎?
答:不是的,如果是由近往遠(yuǎn)將會出現(xiàn)顯示問題。
如果有兩個半透明物體,如果近距離的為1號,距離遠(yuǎn)的為2號。
先渲染1號再渲染2號 :兩者都關(guān)閉深度寫入,一開始深度緩存皆為空,所有都通過測試,那么1號開始計算(下面的公式以后會提到的,這里先提一嘴,想查的朋友可以搜素unity shader Blend);
算式1:(1號的顏色*1號的透明度)+(顏色緩存上的顏色*(1-1號的透明度)) = 最終顏色(取代掉這里顏色緩存上的顏色)。
算式2:(2號的顏色*2號透明度)+(顏色緩存上的顏色*((1-2號的透明度))) = 最終顏色;
下面就是小學(xué)生都會的帶入公式,將算式1的最終顏色 帶入算式2的顏色緩存上的顏色的顏色,你會發(fā)現(xiàn),1號的顏色被稀釋了,這就造成一種1號雖然離我們近,但是看著卻離我們遠(yuǎn)的感覺,這樣的感覺不是我們需要的,所以這樣是錯的。必須由遠(yuǎn)往近才行,你們可以自己驗算一下。
第四個問題:在渲染透明物體的時候為什么要深度寫入關(guān)閉?
答:如果開啟,在正常情況下,透明物體的渲染隊列大于不透明物體的時候沒什么(反正是不透明的先渲染,不透明渲染的時候還沒有透明物體什么屌事。),但是如果出現(xiàn)一種渲染隊列超過了透明隊列(這里設(shè)為2號),無論2號是透明的也好,不透明的也罷,只要2號的距離攝像機的距離比他遠(yuǎn),那么他的顏色將永遠(yuǎn)也無法顯示出來……
想不明白看這里下面
假設(shè)1號為透明物體距離攝像機近,2號為任意物體距離攝像機遠(yuǎn),一號的渲染隊列低于二號所以,我們先渲染一號。
一號渲染,一號的深度寫入深度緩存。
二號渲染,二號的深度測試不達(dá)標(biāo)(使用默認(rèn)LEqual),跳過……不顯示顏色。