http://bbs.pfan.cn/post-224877.htmlhtml
http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html
函數
1、使用混合來實現半透明效果
post
混合是什麼呢?混合就是把兩種顏色混在一塊兒。具體一點,就是把某一像素位置原來的顏色和將要畫上去的顏色,經過某種方式混在一塊兒,從而實現特殊的效果。
假設咱們須要繪製這樣一個場景:透過紅色的玻璃去看綠色的物體,那麼能夠先繪製綠色的物體,再繪製紅色玻璃。在繪製紅色玻璃的時候,利用「混合」功能,把將要繪製上去的紅色和原來的綠色進行混合,因而獲得一種新的顏色,看上去就好像玻璃是半透明的。
要使用OpenGL的混合功能,只須要調用:glEnable(GL_BLEND);便可。
要關閉OpenGL的混合功能,只須要調用:glDisable(GL_BLEND);便可。
注意:只有在RGBA模式下,纔可使用混合功能,顏色索引模式下是沒法使用混合功能的。
測試
源因子和目標因子是能夠經過glBlendFunc函數來進行設置的。
spa
2、二維圖形混合orm
3、三維混合htm
深度緩衝是這樣一段數據,它記錄了每個像素距離觀察者有多近。在啓用深度緩衝測試的狀況下,若是將要繪製的像素比原來的像素更近,則像素將被繪製。不然,像素就會被忽略掉,不進行繪製。這在繪製不透明的物體時很是有用——無論是先繪製近的物體再繪製遠的物體,仍是先繪製遠的物體再繪製近的物體,或者乾脆以混亂的順序進行繪製,最後的顯示結果老是近的物體遮住遠的物體。
然而在你須要實現半透明效果時,發現一切都不是那麼美好了。若是你繪製了一個近距離的半透明物體,則它在深度緩衝區內保留了一些信息,使得遠處的物體將沒法再被繪製出來。雖然半透明的物體仍然半透明,但透過它看到的卻不是正確的內容了。
要解決以上問題,須要在繪製半透明物體時將深度緩衝區設置爲只讀,這樣一來,雖然半透明物體被繪製上去了,深度緩衝區還保持在原來的狀態。若是再有一個物體出如今半透明物體以後,在不透明物體以前,則它也能夠被繪製(由於此時深度緩衝區中記錄的是那個不透明物體的深度)。之後再要繪製不透明物體時,只須要再將深度緩衝區設置爲可讀可寫的形式便可。嗯?你問我怎麼繪製一個一部分半透明一部分不透明的物體?這個好辦,只須要把物體分爲兩個部分,一部分全是半透明的,一部分全是不透明的,分別繪製就能夠了。
即便使用了以上技巧,咱們仍然不能爲所欲爲的按照混亂順序來進行繪製。必須是先繪製不透明的物體,而後繪製透明的物體。
總結起來,繪製順序就是:首先繪製全部不透明的物體。若是兩個物體都是不透明的,則誰先誰後都沒有關係。而後,將深度緩衝區設置爲只讀。接下來,繪製全部半透明的物體。若是兩個物體都是半透明的,則誰先誰後只須要根據本身的意願(注意了,先繪製的將成爲「目標顏色」,後繪製的將成爲「源顏色」,因此繪製的順序將會對結果形成一些影響)。最後,將深度緩衝區設置爲可讀可寫形式。
調用glDepthMask(GL_FALSE);可將深度緩衝區設置爲只讀形式。調用glDepthMask(GL_TRUE);可將深度緩衝區設置爲可讀可寫形式。
blog
當先繪製半透明物體A時,若是不透明物體B在A的前面,這樣將形成B、A同時繪製的錯誤。索引