透明物體的渲染

2021-08-08 18:16:09 字數 1142 閱讀 3295

一般來說,我們使用alpha test(透明度測試)或者alpha blend(透明度混合)來實現透明效果,其中alpha blend(之後簡稱)blend可以實現真正的半透明效果。

無論哪種實現方式,我們都需要關閉透明物體的深度寫入(禁止zwrite)。

為什麼要關閉透明物體的深度寫入?

設想一種情況,假設半透明物體a在不透明物體b的前面。

如果開啟了深度寫入,那麼由於a在b的前面,zbuffer中儲存的肯定是a的z值,那麼b就無法通過ztest,導致a的顏色會覆蓋掉b的顏色。這樣最終呈現的效果就是半透明物體a擋住了不透明物體b,這顯然不是我們需要的結果。

所以,我們必須關閉透明物體的深度寫入,不過這樣做實際上破壞了深度緩衝的工作機制,這帶來了很大的***,為了讓深度緩衝機制正常工作,我們就必須嚴格的控制物體的渲染順序。

假設半透明物體a和不透明物體b,a仍然在b的前面。

先渲染不透明物體b再渲染透明物體a

結論是,如果半透明物體和不透明物體共存,那麼首先開啟zwrire,渲染不透明物體。再關閉zwrite,渲染半透明物體。

假設半透明物體a和半透明物體b, a在b的前面。

先渲染b再渲染a :

結論是,多個透明物體,要按照由遠到近的順序渲染。

ps : blend公式ds

tcol

or(n

ew)=

srca

lpha

∗src

colo

r+(1

−src

alph

a)∗d

stco

lor(

old)

其中dstcolor是顏色緩衝中的顏色值,srccolor是(紋理取樣+光照計算)後的的顏色,srcalpha是紋理取樣的alpha通道。

關閉zwrite並依靠排序的方法來搞定渲染順序,有時候也會出錯(因為某個model很可能是多個不在乙個平面上的不規則模型),這裡有一種開啟zwrite的渲染方法。

核心思想就是渲染兩次:

這樣的方法是比較消耗效能的,之前的blend效果就比較可以,一般不使用這種方式。

ps : 這種方法僅適用於渲染半透明物體,對不透明物體不需要這麼做。

核心思想也是渲染兩次 :

這兩次渲染隱含了半透明物體共存時,渲染順序必須是由遠到近的順序渲染。

WebGL半透明物體的繪製

webgl 中當透明和半透明物體共存時,相關設定不正確的話,物體表面會出現破碎雜亂的斷面,非常影響效果,我們接著就來解決這個問題。完成的展示demo請看 半透明物體和透明物體共存 讓物體實現半透明效果需要用到顏色的 分量。該功能被稱為a混合 alpha blending 或 混合 blending,...

OpenGL繪製半透明物體

一 使用混合來實現半透明效果 混合是什麼呢?混合就是把兩種顏色混在一起。具體一點,就是把某一畫素位置原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。假設我們需要繪製這樣乙個場景 透過紅色的玻璃去看綠色的物體,那麼可以先繪製綠色的物體,再繪製紅色玻璃。在繪製紅色玻璃的時候,利用...

OpenGL繪製半透明物體技巧

一 使用混合來實現半透明效果 混合是什麼呢?混合就是把兩種顏色混在一起。具體一點,就是把某一畫素位置原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。假設我們需要繪製這樣乙個場景 透過紅色的玻璃去看綠色的物體,那麼可以先繪製綠色的物體,再繪製紅色玻璃。在繪製紅色玻璃的時候,利用...