2015-08-15 197 views
1

好吧,所以這裏的交易:延期渲染opengl混合

我剛剛得到我的手與延遲照明髒。我不會詳細討論,但我一直在使用FBO,並且遇到了問題。

在我的整個渲染過程中我使用glBlend:

GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA

得到我想要的結果。如果我將場景渲染到「真實」幀緩衝區(後臺緩衝區?),我會得到適當的結果。問題是,如果我首先向FBO渲染某些東西,然後將該FBO渲染爲「真實」幀緩衝區,則會出現透明度問題。

這很難解釋,但我會試一試。假設我將一個具有RGBA(0.5,0.7,0.4,1.0)的像素渲染到FBO,然後在其上渲染一個像素(0.0,1.0,0.0,0.5)。該像素的結果alpha應爲1.0,但猜猜看!結果是0.5。爲什麼是這樣?最終的顏色混合正確,但alpha不是1.0。如何,通過blendfunc或其他方法,我可以得到1.0的結果?我試過用不同的顏色,不同的彎曲功能等來清理緩衝區,但無濟於事。

+0

聽起來像這可能是相同的問題http://stackoverflow.com/questions/24346585/opengl-render-to-質地與 - 局部transparancy-半透明和 - 然後 - 仁德。 –

回答

2

如果要強制FBO中的alpha始終爲1.0,請使用glBlendFuncSeparate()而不是glBlendFunc()。

像這樣:

glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ZERO,GL_ONE);

當然,確保您清除FBO的alpha = 1.0的顏色。

另一種解決方案是簡單地使用一個沒有alpha的FBO,就像使用R8G8B8而不是R8G8B8A8像素格式一樣。 一個FBO不需要一個alpha通道進行混合時就可以進行繪圖...