Math 从数学上讲,alpha混合是如何逐像素工作的?

Math 从数学上讲,alpha混合是如何逐像素工作的?,math,colors,shader,pixel,alphablending,Math,Colors,Shader,Pixel,Alphablending,看起来不像RGB1*A1+RGB2*A2那么简单……值是如何剪裁的?加权?等等 这是一个上下文相关的问题吗?是否有不同的算法产生不同的结果?还是一个标准实现 我对OpenGL特定的答案特别感兴趣,但其他环境的上下文也很有用。我不知道OpenGL,但不透明度A的一个像素通常绘制在另一个像素上,如下所示: result.r = background.r * (1 - A) + foreground.r * A result.g = background.g * (1 - A) + foregroun

看起来不像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

对多个像素重复此操作。

我不知道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值将乘以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,则上述答案有效。但是,如果将该类型的混合与预乘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提供的答案是正确的

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