2

似乎它不像 RGB1*A1 + RGB2*A2 那样简单……值是如何裁剪的?加权?等等。

这是一个与上下文相关的问题吗?是否有不同的算法产生不同的结果?还是一种标准实现?

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

4

2 回答 2

7

我不了解 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

对多个像素重复此操作。

于 2012-05-26T18:41:57.170 回答
5

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

预乘阿尔法:

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

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

保存后,rgb vales 将乘以 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 提供的答案是正确的。

更多细节可以在这里找到:预乘 alpha

于 2014-04-05T15:16:17.653 回答