似乎它不像 RGB1*A1 + RGB2*A2 那样简单……值是如何裁剪的?加权?等等。
这是一个与上下文相关的问题吗?是否有不同的算法产生不同的结果?还是一种标准实现?
我对特定于 OpenGL 的答案特别感兴趣,但来自其他环境的上下文也很有用。
似乎它不像 RGB1*A1 + RGB2*A2 那样简单……值是如何裁剪的?加权?等等。
这是一个与上下文相关的问题吗?是否有不同的算法产生不同的结果?还是一种标准实现?
我对特定于 OpenGL 的答案特别感兴趣,但来自其他环境的上下文也很有用。
我不了解 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
对多个像素重复此操作。
如果图像不是预乘 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