【发布时间】:2017-07-12 23:33:57
【问题描述】:
在alpha compositing wiki,我看到混合方程是这样的(没有预乘):
但在this slides,等式是这样的:
在第一个等式中,outRGB 除以outAlpha。
这是什么意思?哪一个是正确的方程式?
【问题讨论】:
标签: opengl shader alpha alphablending blending
在alpha compositing wiki,我看到混合方程是这样的(没有预乘):
但在this slides,等式是这样的:
在第一个等式中,outRGB 除以outAlpha。
这是什么意思?哪一个是正确的方程式?
【问题讨论】:
标签: opengl shader alpha alphablending blending
第一个除法公式是正确的。第二个要么是错误的,要么是设计为采用非预乘颜色并产生预乘颜色。
不管怎样,从预乘公式中推导出非预乘公式很容易,而且非常简单直观:
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] 的范围内。
【讨论】:
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)。它与您提到的上述等式不同。为什么?