Alpha混合如何在数学上逐像素地工作?

时间:2012-05-26 18:38:52

标签: math colors shader pixel alphablending

似乎它不像RGB1 * A1 + RGB2 * A2那么简单...如何修剪值?加权?等

这是一个依赖于上下文的问题吗?有不同的算法会产生不同的结果吗?还是一个标准实施?

我对特定于OpenGL的答案特别感兴趣,但其他环境的上下文也很有用。

2 个答案:

答案 0 :(得分:3)

我不知道OpenGL,但不透明度A的一个像素通常是在另一个像素上绘制的,如下所示:

result.r = background.r * (1 - A) + foreground.r * A
result.g = background.g * (1 - A) + foreground.g * A
result.b = background.b * (1 - A) + foreground.b * A

对多个像素重复此操作。

答案 1 :(得分:3)

如果图像不是预乘alpha,则上述答案有效。但是,如果您将此类型的混合与预乘的Alpha图像一起使用,则会出现黑色边框。

预乘Alpha:

创建图像时,颜色值乘以Alpha通道。看一下这个像素的例子:

Pixel: r = 1, g = 0, b = 0, a = 0.5

当它被保存时,rgb值将乘以给出的alpha值:

Pixel: r = 0.5, g = 0, b = 0, a = 0.5

要混合此类图像,您需要使用以下公式:

result.r = background.r * (1 - A) + foreground.r
result.g = background.g * (1 - A) + foreground.g
result.b = background.b * (1 - A) + foreground.b

非预乘Alpha

在此示例中,Alpha通道与颜色通道完全分开。

Pixel: r = 1, g = 0, b = 0, a = 0.5

保存时:

Pixel: r = 1, g = 0, b = 0, a = 0.5

它是一样的。在这种情况下,minitech提供的答案是正确的。

可在此处找到更多详细信息:Premultiplied alpha