透明混合為什麼要關閉深度寫入,不關閉會怎麼樣

2021-10-07 04:33:53 字數 1818 閱讀 1818

原文:

如果半透明物體開啟了深度寫入的話,就無法看到在該fragment處後面渲染的fragment,這個主要是為了在半透明物體互相交叉、無法得到正確渲染效果時,我們折中的一種方式。

舉個例子,我們來創造乙個半透明物體互相交叉的例子:

這兩個方塊使用的shader是一樣的,但使用了兩個各自的材質。為了讓效果明顯我故意把它們材質的透明度調成不同的值,攝像機靠後的方塊透明度較低,靠前的較高。

在不採用其他方法的前提下,如果我們使用書裡這種傳統的透明混合的方式(指關閉深度寫入進行混合)會得到下面的效果:

實際上,這種效果是有問題的。錯誤的地方在於中間兩個方塊互相重疊的地方,這個混合效果有問題。我們可以在腦海裡重現這個渲染過程:首先unity會基於物體中心對兩個方塊進行排序,來實現半透明物體的從後往前渲染的目的。所以,unity會先渲染方塊b、再渲染方塊a(參見第一張圖裡面兩個方塊在攝像機空間下的位置)。然而在重疊區域,正確的渲染順序應該是先渲染方塊a,因為在這部分區域內,它被方塊b覆蓋住了,它位於後面。出現錯誤的本質原因是因為我們的排序都是基於object level的,而不是基於pixel level的排序。

如果此時我們把深度開啟,則會得到下面的效果:

你可以一眼就看出來這裡面的錯誤,那就是方塊a的重疊部分別完全剔除掉了,這部分完全沒有渲染!它被剔除掉的 原因就是因為unity會先渲染方塊b,由於方塊b進行了深度寫入,所以等到方塊a渲染的時候,重疊部分a的畫素根本無法通過depth test,會直接被剔除掉。

除了半透明物體之間的問題,儘管理論上來說,理想情況下半透明物體應該在所有不透明物體渲染完之後再渲染,但如果乙個不透明物體因為某些原因在某個半透明物體後面被渲染了,也可能會因為半透明物體開啟了深度寫入而出現非常明顯的渲染錯誤(不透明物體被半透明物體完全遮擋掉沒有渲染)。

我覺得看到這裡你應該知道我們為什麼要關閉深度寫入。總結一下的話,可以參考知乎上milo yip的回答:

對於不透明(opaque)的 fragment,最後只需要看到最接近視點的 fragment。在實時渲染一般是通過深度緩衝來取得這個最近的 fragment。

但對於半透明的 fragment,每乙個都會影響最終的結果,需要從遠至近地渲染。由於深度緩衝不能用於排序多個 fragment,所以只能用於儲存最接近視點的不透明 fragment 深度,遠於該深度的透明 fragment 不用渲染,所以仍需要深度測試(depth test)。

由於需要手動排序半透明的物體,寫入深度已沒有意義。如果能完美地手工排序不透明 fragment,寫入深度也沒有影響;但若物體在深度方向有重疊,有些 fragment 的順序會有誤,如果開啟深度寫入,會令到渲染錯誤很明顯,而關掉的話影響較小一點。

當然理想的話,應該用順序無關透明(order independent transparency, oit)技術,例如用逐畫素鍊錶儲存多個 fragment,以畫素為單位排序渲染。

簡而言之,就是因為,傳統的半透明混合總是會在物體交叉、渲染重疊的情況下,出現錯誤的混合效果。如果開啟深度寫入,會令到渲染錯誤很明顯,而關掉的話影響較小一點。回到你的圖里,由於你的兩個方塊擺放規則不存在相互重疊,所以unity對於兩個物體的排序在pixel level也是正確的排序,即每個畫素也都是滿足從後往前渲染的,所以你不會發現問題。

8 2透明度混合 關閉寫入

透明度混合 使用當前偏移的透明度作為混合因子,與已經儲存在綠色緩衝中的顏色進行混合。得到顏色。使用混合命令blend 可以得到真正的半透明效果 關閉深度寫入會造成錯誤排序的情況 本列只計算環境光和漫反射 shader unity shader book chapter 8 alphablend al...

為什麼要選擇ISP 為什麼要選擇AHD

在影象傳輸中,我們為什麼選擇nextchip?為什麼要選擇isp?為什麼要選擇ahd?為什麼選擇北京冠宇銘通?這個問題我倒著回答各位 一 北京冠宇銘通科技是nextchip目前為止唯一一家正式官方授權 車載產品廠家之一 二 ahd和其他幾種傳輸方式相比,擁有自己的專利,其他幾家有專利的沒有幾個,如果...

為什麼要分詞

這裡不討論這個問題,我要說的為什麼要分詞?分詞是什麼!有人問 分詞有什麼作用啊?某人答 搜尋引擎要用到中文分詞,所以非常重要 這完全是廢話,說了等於沒說。搜尋引擎又為什麼要分詞呢?其實一般意思上指的分詞是比較狹隘的意思,指中文的詞是怎樣劃分的。因為中文沒有空格,所以要理解一篇文 章,你首先當然要切分...