glBlendFunc和alpha混合

时间:2011-09-06 16:35:34

标签: opengl alphablending glblendfunc

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

最后,所有通行证应合并为一个单一输出。要结合我考虑使用glblendfunc的所有传球,但我没有得到我想要的结果。

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

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

我该怎么办?还有什么东西然后是alphablending吗?

编辑:我的目标是合并一个或多个通行证。我想混合颜色(最有可能将它们加在一起),我们在每个路径中的颜色通过以下不同层的混合函数计算: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);

2 个答案:

答案 0 :(得分:1)

由于您的评论,您可以使用所需的混合函数将每个传递单独渲染到纹理中(最好使用FBOs)。然后你可以在一次通过中将不同的通道混合在一起,只需绘制一个屏幕大小的四边形,并在片段着色器中将所有通道的纹理平均在一起。

编辑:根据您的评论。您可以将这些传递单独直接渲染到纹理(绑定为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));
}

编辑:或者你可以使用一个简单的1纹理片段着色器(只是从单个纹理中查找颜色并将其放出)并使用Tobias的混合配置绘制多个纹理四边形。如果通过次数不是先验的,那么这也可以更好地扩展。

答案 1 :(得分:0)

我认为您不希望将纹理的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是一种与顺序相关的操作。