OpenGL繪製半透明物體

2021-06-16 08:58:53 字數 1456 閱讀 7778

一、使用混合來實現半透明效果

混合是什麼呢?混合就是把兩種顏色混在一起。具體一點,就是把某一畫素位置原來的顏色和將要畫上去的顏色,通過某種方式混在一起,從而實現特殊的效果。

假設我們需要繪製這樣乙個場景:透過紅色的玻璃去看綠色的物體,那麼可以先繪製綠色的物體,再繪製紅色玻璃。在繪製紅色玻璃的時候,利用「混合」功能,把將要繪製上去的紅色和原來的綠色進行混合,於是得到一種新的顏色,看上去就好像玻璃是半透明的。

要使用opengl的混合功能,只需要呼叫:glenable(gl_blend);即可。

要關閉opengl的混合功能,只需要呼叫:gldisable(gl_blend);即可。

注意:只有在rgba模式下,才可以使用混合功能,顏色索引模式下是無法使用混合功能的。

源因子和目標因子是可以通過glblendfunc函式來進行設定的。

二、二維圖形混合

三、三維混合

深度緩衝是這樣一段資料,它記錄了每乙個畫素距離觀察者有多近。在啟用深度緩衝測試的情況下,如果將要繪製的畫素比原來的畫素更近,則畫素將被繪製。否則,畫素就會被忽略掉,不進行繪製。這在繪製不透明的物體時非常有用——不管是先繪製近的物體再繪製遠的物體,還是先繪製遠的物體再繪製近的物體,或者乾脆以混亂的順序進行繪製,最後的顯示結果總是近的物體遮住遠的物體。

然而在你需要實現半透明效果時,發現一切都不是那麼美好了。如果你繪製了乙個近距離的半透明物體,則它在深度緩衝區內保留了一些資訊,使得遠處的物體將無法再被繪製出來。雖然半透明的物體仍然半透明,但透過它看到的卻不是正確的內容了。

要解決以上問題,需要在繪製半透明物體時將深度緩衝區設定為唯讀,這樣一來,雖然半透明物體被繪製上去了,深度緩衝區還保持在原來的狀態。如果再有乙個物體出現在半透明物體之後,在不透明物體之前,則它也可以被繪製(因為此時深度緩衝區中記錄的是那個不透明物體的深度)。以後再要繪製不透明物體時,只需要再將深度緩衝區設定為可讀可寫的形式即可。嗯?你問我怎麼繪製乙個一部分半透明一部分不透明的物體?這個好辦,只需要把物體分為兩個部分,一部分全是半透明的,一部分全是不透明的,分別繪製就可以了。

即使使用了以上技巧,我們仍然不能隨心所欲的按照混亂順序來進行繪製。必須是先繪製不透明的物體,然後繪製透明的物體。

總結起來,繪製順序就是:首先繪製所有不透明的物體。如果兩個物體都是不透明的,則誰先誰後都沒有關係。然後,將深度緩衝區設定為唯讀。接下來,繪製所有半透明的物體。如果兩個物體都是半透明的,則誰先誰後只需要根據自己的意願(注意了,先繪製的將成為「目標顏色」,後繪製的將成為「源顏色」,所以繪製的順序將會對結果造成一些影響)。最後,將深度緩衝區設定為可讀可寫形式。

呼叫gldepthmask(gl_false);可將深度緩衝區設定為唯讀形式。呼叫gldepthmask(gl_true);可將深度緩衝區設定為可讀可寫形式。

當先繪製半透明物體a時,如果不透明物體b在a的前面,這樣將造成b、a同時繪製的錯誤。

OpenGL繪製半透明物體技巧

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

WebGL半透明物體的繪製

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

vc 繪製半透明矩形

要繪製透明矩形,要用到 blendfunction 這個結構體 和alphablend這個函式 方法如下 cbitmap tempbitmap 用於繪製矩形的臨時位圖 cdc tempdc crect rect 0,0,100,100 矩形大小 blendfunction blend memset ...