【问题标题】:Should the Output RGB be Divided by Output Alpha in the Non-premultiplied Alpha Blending Equation?在非预乘 Alpha 混合方程中,输出 RGB 是否应该除以输出 Alpha?
【发布时间】:2017-07-12 23:33:57
【问题描述】:

alpha compositing wiki,我看到混合方程是这样的(没有预乘):

但在this slides,等式是这样的:

在第一个等式中,outRGB 除以outAlpha。 这是什么意思?哪一个是正确的方程式?

【问题讨论】:

    标签: opengl shader alpha alphablending blending


    【解决方案1】:

    第一个除法公式是正确的。第二个要么是错误的,要么是设计为采用非预乘颜色并产生预乘颜色。

    不管怎样,从预乘公式中推导出非预乘公式很容易,而且非常简单直观:

    blended = front + back * (1.0 - front.a);
    

    直觉是:我们取前面的颜色,加上一点后面的颜色,也就是我们能透过前面的颜色看到多少。

    非预乘的版本将是:

    blended.a = front.a + back.a * (1.0 - front.a);
    blended.rgb = (front.rgb * front.a + back.rgb * back.a * (1.0 - front.a)) / blended.a;
    

    请注意,这个公式以及您提供的公式都假设 alpha 在 [0, 1] 而不是 [0, 255] 的范围内。

    【讨论】:

    • 但是在OpenGL/WebGL中,非预乘函数是这样的:gl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD ); gl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );所以是blended.rgb = front.rgb * front.a + back.rgb * (1 - front.a)。它与您提到的上述等式不同。为什么?
    • 该公式仅适用于完全不透明的背景,即 back.a == 1。OpenGL 的混合机制根本无法处理非预乘颜色的一般“半透明 A 超过半透明 B”的情况.
    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2017-08-28
    相关资源
    最近更新 更多