openGL中的FBO的一個問題

來源:互聯網
上載者:User

標籤:

前幾天公司扔給我一個剛跳走的“大牛”的代碼,看的實在讓我捉急。邏輯非常混亂,代碼模組化做的不到位,讓人懷疑是否知道什麼是物件導向。(應該是所有程式員看別人代碼都這樣的通病吧,自己的修為尚淺,也許別人看我的也是一頭包,哈哈)

 

正題:

//——————————————————————————————————————————

在使用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的一個問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.