2015-08-15 183 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通道进行混合时就可以进行绘图...