Opengl 在非预乘Alpha混合方程中,输出RGB是否应除以输出Alpha?

Opengl 在非预乘Alpha混合方程中,输出RGB是否应除以输出Alpha?,opengl,shader,alpha,alphablending,blending,Opengl,Shader,Alpha,Alphablending,Blending,在中,我看到混合方程如下(无预乘): 但在中,方程式如下: 在第一个等式中,outRGB除以outAlpha。 这是什么意思?哪一个是正确的方程式?第一个带除法的公式是正确的。第二种方法要么是错误的,要么是为了采用非预乘颜色并产生预乘颜色 不管怎么说,从预乘公式推导出非预乘公式非常简单,而且非常直观: blended = front + back * (1.0 - front.a); 直觉是:我们取前面的颜色,加上一点后面的颜色,也就是说,我们可以通过前面的颜色看到多少 然后,非预乘版本将

在中,我看到混合方程如下(无预乘):

但在中,方程式如下:

在第一个等式中,
outRGB
除以
outAlpha

这是什么意思?哪一个是正确的方程式?

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

不管怎么说,从预乘公式推导出非预乘公式非常简单,而且非常直观:

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\u ADD,gl.FUNC\u ADD);gl.blendFuncSeparate(gl.SRC_ALPHA,gl.ONE减去SRC_ALPHA,gl.ONE,gl.ONE减去SRC_ALPHA)
所以它是
blended.rgb=front.rgb*front.a+back.rgb*(1-front.a)
。这与你提到的上述等式不同。为什么?这个公式只适用于完全不透明的背景,即back.a==1。OpenGL的混合机制根本无法处理非预乘颜色的一般“半透明A超过半透明B”情况。