首页 文章

glBlendFunc和alpha混合

提问于
浏览
1

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

最后,所有通道应合并为一个输出 . 要结合我考虑使用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)

EDIT: 你好!我正在解决这个问题,但我遇到了困难 . 我不明白我如何在任何着色器中正确设置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 回答

  • 1

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

    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的混合配置绘制多个纹理四边形 . 如果通过次数不是先验的,则这也可以更好地扩展 .

  • 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是一种依赖于顺序的操作 .

相关问题