glBlendFunc and alpha blending



我正在编写一个应用程序,允许用户在不同的着色器之间切换,以及它们的组合。因此,我想多次绘制完全相同的场景。

最后,所有的通道应该合并成一个输出。为了结合所有的传递,我想使用glblendfunc,但我没有得到我想要的结果。

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//use first shader
draw();
if (secondShaderWished) {
    //use second shader
    draw()
}

在每个绘制调用中,我绘制一个具有alpha值的纹理,例如透明区域。我得到的最终结果是,我主要看到的是最后一个渲染通道的效果,但在边界(alpha值稍微下降的地方),我确实看到了第一个着色器效果。我所认为的是,我应该使用第二个glBlendFunc,它允许混合两个通道,但我想不出一种不触及任何alpha值的方法,这会破坏希望的效果。

我该怎么办?除了字母混合还有别的吗?

编辑:我的目标是组合一个或多个通行证。我想混合颜色(很可能是把它们加在一起),然而每个路径的颜色是通过以下混合函数在不同的图层中计算的:glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)

编辑:

嗨了!我正在解决这个问题,但是我卡住了。我不明白如何在任何着色器中正确设置sampler2d…我做错了什么?

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, _FBO)
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _Tex);
glViewport(0, 0, viewportSize.x(), viewportSize.y());
draw();
GLuint texLocation = glGetUniformLocation(_shader->getProgramID(),"pass0");
glUniform1i(texLocation, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);

根据您的评论,您可以使用所需的混合功能,将每个通道单独渲染为纹理(最好使用fbo完成)。然后你可以通过绘制屏幕大小的四边形并在片段着色器中平均所有通道的纹理来将不同的通道混合在一起。

EDIT:根据您的评论。您可以将这些通道分别直接渲染到纹理中(作为FBO附件绑定)。然后你使用一个片段着色器,像这样一个屏幕大小的四边形,假设你有三个通道:

uniform sampler2D pass0;
uniform sampler2D pass1;
uniform sampler2D pass3;
uniform vec2 screenSize;
void main()
{
    vec2 texCoord = gl_FragCoord.xy / screenSize;
    gl_FragColor = (1.0/3.0) * (texture2d(pass0, texCoord) + 
                                texture2d(pass1, texCoord) + 
                                texture2d(pass2, texCoord));
}

EDIT:或者您可以使用简单的1-纹理片段着色器(只是从单个纹理查找颜色并将其放出来)并使用Tobias的混合配置绘制多个纹理四边形。如果先验地不知道传递的次数,这也可以更好地伸缩。

我认为你不想使用纹理的alpha值作为混合因子,而是一个恒定的因子,给你一个1:1的混合。

你必须在所有纹理层上分配混合因子。所以所有纹理上的白色像素加起来正好是1。

float factor = 1.0f / numTextures;
glBlendColor(factor, factor, factor, factor);
glBlendFunc(GL_CONSTANT_COLOR, GL_ONE);

对于3层,它将变成:

             source        dest
1st pass: (tex1 * 1/3) + (0 * 1)
2nd pass: (tex2 * 1/3) + (tex1 * 1/3 * 1)
3rd pass: (tex3 * 1/3) + ((tex2 * 1/3 + tex1 * 1/3) * 1)

还要记住alpha-blending是一个依赖于顺序的操作。

最新更新