標籤:
前幾天公司扔給我一個剛跳走的“大牛”的代碼,看的實在讓我捉急。邏輯非常混亂,代碼模組化做的不到位,讓人懷疑是否知道什麼是物件導向。(應該是所有程式員看別人代碼都這樣的通病吧,自己的修為尚淺,也許別人看我的也是一頭包,哈哈)
正題:
//——————————————————————————————————————————
在使用openGL中的fbo時,很容易遇到“二次混合”的問題。二次混合從本質上來講是混合順序錯誤。
如:
這是一個很讓人糾結的問題。僅通過調節混合方式是不能真正地解決的。只有適當的取近似結果、事先策劃混合順序,避免出現很嚴重的問題。
分享我遇到過的一些問題,以及解決方案:
首先是如果不採取任何措施,採用預設混合方式,會出現字型模糊的問題。
這種現象是在圖片有像素透明度不為1或0時會出現,因為多次混合的緣故導致最終顏色出現偏差。
解決辦法是在繪製FBO時,關閉混合,繪製內容結束後再恢複預設混合。
ofDisableAlphaBlending(); // 關閉混合
bookContent.draw(rtContent);
ofEnableAlphaBlending(); // 開啟混合
效果:
但是,
假如在FBO裡面出現了多張圖片疊加的情況,這種方法就不適用了。
問題如下:
這種時候,
解決辦法有兩個,一是圖片素材不要有(0, 1 )的透明度像素,適用正常混合進行混合,二是採用近似混合方式:
神代碼:
// mainFbo.begin();ofClear(0);glEnable(GL_BLEND);glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);text1.draw(x,y); glDisable(GL_BLEND); mainFbo.end();/* ... ... */// 繪製FBOglEnable(GL_BLEND);glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);mainFbo.draw(x, y);glDisable(GL_BLEND);ofEnableAlphaBlending();
這樣的混合方式算是比較折中的方式了,一般來說不會出現問題,(比如三層嵌套就會出問題,而且FBO內部的底色會失真)
FBO套FBO,層層套下來。但是這樣效率會很低很低,而且修改混合狀態會影響全域混合方式,如果有一處遺忘了恢複狀態,會影響其他內容的繪製。尤其是接手別人的項目的時候,如果他們的項目架構設計的不合理,很容易出現各種詭異的問題。。。。。。。。。內心已經在畫詛咒圈圈...
總體來說,效果還是不錯的。但是如果要做的完美,還是建議做好規劃,避免出現這種棘手的情況。
openGL中的FBO的一個問題