2017-03-23 216 views
2

我一直在opengl工作一段時間比較順利,但最近我已經注意到,當我使用透明紋理渲染基本到我的fbo紋理(自定義幀緩衝區)時,它使得fbo紋理在像素處透明,圖元的紋理是透明的。問題是這個原始背後有一些東西(純色)已經在透明之前渲染過了。所以fbo紋理在這些像素處不應該是透明的 - 混合透明色的純色應該會產生純色,不是嗎?將透明紋理渲染到glTexture

所以基本上,opengl爲我的fbo紋理增加了透明度,只是因爲繪製的最後一個原始圖像具有透明像素,即使背後已經有純色,已經繪製到了fbo紋理中。不應該opengl將透明紋理與fbo的現有像素混合在一起,並且如果在渲染透明圖元之前fbo紋理已經用純色填充,則會產生純色?

當我將fbo紋理渲染到默認幀緩衝區時,會發生什麼情況:透明顏色是否會流過其中的一部分 - 最後繪製的紋理透明。但是當我將相同的場景直接渲染到默認的opengl幀緩衝區時,場景看起來很好,並且透明顏色不會滲透到透明紋理中。

更有意思的是,glClearColor - 顏色只在圖元的紋理的alpha具有漸變時可見 - 清晰的顏色對紋理alpha爲1.0或0.0的位置沒有影響...這是一個錯誤嗎?它似乎影響最原始的像素與0.5 alpha的紋理。然後再往上或往下降低glClearColor影響。

我知道這是一個有點複雜的問題/情況,老實說,我盡我所能解釋

我使用:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

繪製兩個部分透明的原始入fbo-質地,然後將FBO紋理默認幀緩衝區

這是被拉入默認的OpenGL FBO的FBO紋理看起來像:

glClearColor設置爲紅色。

+0

在將fbo的紋理繪製到屏幕之前,是否記得重新設置混合?此外,任何代碼或它發生的截圖都會很好。 – Vallentin

+0

您是否驗證過GL_BLEND已啓用? –

+0

截圖添加:)我不想重置混合,因爲我確實想要透明fbo紋理,問題在於fbo紋理透明的地方不應該是透明的,混合使用默認的透明顏色幀緩衝區 – HelloWorldCpp

回答

1

混合固體&透明色應該會產生一個純色,應該不是嗎?

只有您的混合模式告訴它。它不:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

這適用相同的混合操作的顏色的四個組成部分。這會導致最終的alpha是源自身乘以自身並將其添加到目標alpha時間1-src alpha的結果。現在

,你可以使用不同的混合功能的顏色和阿爾法:

glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE); 

最後兩個參數指定勾兌只是α,而前兩個指定RGB顏色的混合。所以這保留了阿爾法。 GL 3.x及更高版本提供單獨的混合功能,但也可作爲舊硬件的擴展。

但在我看來,你可能根本不想改變阿爾法。所以,簡單地mask alpha writes渲染到紋理時:

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); 

當你想再次寫入不要忘記撤銷阿爾法遮掩。

+0

解決! glColorMask訣竅:)非常感謝你! – HelloWorldCpp

+0

嘿,對不起,現在,當我完成渲染到第一個fbo-texture之後,將所有蒙版的組件重置爲「true」,然後嘗試渲染另一個圖層(第二個fbo紋理),在第一個fbo-紋理,從第1 fbo紋理的透明四紋理只有在該fbo已經有純色的地方纔可見..儘管如此,它仍然適用於1 fbo紋理!任何想法如何我可以正確地渲染多個fbo紋理?預先感謝您 – HelloWorldCpp

+0

如果我不重置glColorMask,那麼底層完全沒有繪製 – HelloWorldCpp