【问题标题】:Trouble with pre-multiplied alpha blending预乘 alpha 混合的问题
【发布时间】:2019-06-11 11:18:00
【问题描述】:

我创建了一个复合渲染器,它简单地将两个纹理混合在一起,一个在另一个之上。混合只是无法正常工作。

这里是渲染器的代码,只是渲染背景:

RenderFunction layer_render = [&]() {
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glUseProgram(layer_shader_.get_program_id());
        // ----- Fetch shader uniform locations
        layer_shader_.SetUniform("tex", 0);
        layer_shader_.SetUniform("create_alpha_mask", false);

        glEnable(GL_BLEND);
        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        glBlendEquation(GL_FUNC_ADD);

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, background_texture_id_);
        layer_shader_.SetUniform("model", background_model_);
        background_mesh_.Bind();
        glDrawElements(GL_TRIANGLES, background_mesh_.GetIndicesCount(), GL_UNSIGNED_INT, (void*)0);
        background_mesh_.Unbind();
    };

    layer_framebuffer_.RenderToTexture(layer_render);

我传递的背景纹理是一个完整的 rgba -> {1.0, 0.0, 0.0, 0.5}。结果是 -> {0.5, 0.0, 0.0, 0.5}。由于某种我看不到的原因,在计算混合时,alpha 混合没有正确考虑源 alpha。

我所期待的一些伪代码:

source_alpha = 0.5
dest_alpha = 0.0 * (1.0 - source_alpha) = 0.0
output_alpha = source_alpha + dest_alpha = 0.5

out_r = (source_r * source_alpha + dest_r * dest_alpha) / output_alpha = (1.0 * 0.5 + 0.0 * 0.0) / 0.5 = 1.0
out_g = (source_g * source_alpha + dest_g * dest_alpha) / output_alpha = (0.0 * 0.5 + 0.0 * 0.0) / 0.5 = 0.0
out_b = (source_b * source_alpha + dest_b * dest_alpha) / output_alpha = (0.0 * 0.5 + 0.0 * 0.0) / 0.5 = 0.0
out_a = output_alpha  = 0.5

【问题讨论】:

    标签: opengl alphablending


    【解决方案1】:

    我不知道你从哪里得到的伪代码,但它不是这样工作的。为什么要除以 (source_alpha + dest_alpha)?

    如果您想使用预乘 alpha,您可以将混合函数设置为:

    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
    

    所以它不会将 source 与 alpha 相乘,然后在最后的片段着色器中将 rgb 与 alpha 相乘,这意味着:

    color.rgb *= color.a;
    

    就是这样。

    【讨论】:

    • 是的,如果不使用着色器来合成图像,我无法得到我想要的东西。我现在将使用一个 2 步过程,其中我用转换组合一个四边形并将该 fbo 纹理输入到复合渲染器中。谢谢!
    猜你喜欢
    • 2018-12-24
    • 2013-09-14
    • 2011-06-19
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    相关资源
    最近更新 更多