因為無法控制乙個物體每個片元的渲染順序,所以對於自交叉的半透明物體,
如果只用1個pass,關閉深度寫入,因為渲染順序不固定,有可能先渲染前面片元,後渲染後面片元,前面片元混合後面片元的效果變成了後面片元混合前面片元的效果。
如果只用1個pass,開啟深度寫入,因為渲染順序不固定,有的地方先渲染前面片元,導致後面片元無法通過深度測試而不渲染,有的先渲染後面片元,就有正確的半透明效果,整體效果不統一。
所以使用兩個pass,第1個pass只進行深度寫入,第2個pass根據深度值寫入顏色值,此效果無法顯示物體內部的透明度混合,適用於整體的淡入淡出。
當半透明物體之間不存在相互遮擋的情況,並且按照距離攝像機從遠到近的順序進行渲染,開啟或關閉深度寫入,渲染結果都是正確的。
當半透明物體之間存在相互遮擋的情況,開啟或關閉深度寫入都會造成顯示錯誤,以下比較開啟或關閉深度寫入的區別:
開啟深度寫入,如下圖,cubea有一部分在cubeb後面,cubeb先渲染,cubea後渲染,cubea在cubeb後面的那一部分無法通過深度測試,因而不渲染。
關閉深度寫入,如下圖,cubea有一部分在cubeb後面,cubeb先渲染,cubea後渲染,cubea在cubeb後面的那一部分, 應該是cubeb混合cubea的效果,變成cubea混合cubeb的效果。
比較之下,開啟深度寫入錯誤更明顯,所以關閉深度寫入,如果要完全正確顯示就是要使用別的解決方案,比如順序無關透明(order independent transparency, oit)技術。
當內部互相遮擋的物體之間也相互遮擋擺放時,深度寫入設定存在衝突,根據需求的效果,選擇解決方案。
OpenGL繪製半透明物體
一 使用混合來實現半透明效果 混合是什麼呢?混合就是把兩種顏色混在一起。具體一點,就是把某一畫素位置原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。假設我們需要繪製這樣乙個場景 透過紅色的玻璃去看綠色的物體,那麼可以先繪製綠色的物體,再繪製紅色玻璃。在繪製紅色玻璃的時候,利用...
開啟深度寫入的半透明效果 Shader
思路 第乙個pass開啟深度寫入,但不輸出顏色,它的目的僅僅是為了把該模型的深度值寫入深度緩衝中 第二個pass進行正常的透明度混合,由於上乙個pass已經得到了逐畫素的正確的深度資訊,該pass就可以按照畫素級別的深度排序結果進行透明渲染。shader chapter8 alphablendzwr...
OpenGL繪製半透明物體技巧
一 使用混合來實現半透明效果 混合是什麼呢?混合就是把兩種顏色混在一起。具體一點,就是把某一畫素位置原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。假設我們需要繪製這樣乙個場景 透過紅色的玻璃去看綠色的物體,那麼可以先繪製綠色的物體,再繪製紅色玻璃。在繪製紅色玻璃的時候,利用...