如何在手动“覆盖”混合操作中处理alpha?

时间:2011-01-14 08:13:17

标签: graphics image-processing blend rgba premultiplied-alpha

我正在玩一些手动(步行像素)图像处理,我正在重新创建标准的“叠加”混合。我在这里看“Photoshop数学”宏:

http://www.nathanm.com/photoshop-blending-math/See also here用于更易读的Overlay版本)

两个源图像都是相当标准的RGBA(每个8位)格式,目的地也是如此。当两个图像完全不透明(alpha为1.0)时,结果会按预期正确混合:

但是如果我的“混合”图层(顶部图像)具有透明度,我对如何正确地将该alpha纳入混合等式感到有点困惑。我希望它的工作原理是混合层中的透明像素对结果没有影响,混合层中的不透明像素像往常一样进行叠加混合,而半透明混合层像素对结果有一些缩放效果。

有人可以向我解释混合方程式或背后的概念吗?

奖励积分如果你可以帮我这样做,结果图像有正确的预乘alpha(我认为只会对两层不透明的像素起作用)。 p>

谢谢!

// factor in blendLayerA, (1-blendLayerA) somehow?
resultR = ChannelBlend_Overlay(baseLayerR, blendLayerR); 
resultG = ChannelBlend_Overlay(baseLayerG, blendLayerG);
resultB = ChannelBlend_Overlay(baseLayerB, blendLayerB);
resultA = 1.0; // also, what should this be??

3 个答案:

答案 0 :(得分:3)

在混合基色和混合色之后,使用混合色的alpha混合原始基色和混合产生的颜色:

vec4 baseColor = ...;
vec4 blendColor = ...;
vec4 blendedColor = blend(baseColor, blendColor);
vec4 fragmentColor = (1.0 - blendColor.a) * baseColor + blendColor.a * blendedColor;

我用它来“叠加”混合不透明的基色和混合纹理,它有很多(半)透明像素。

答案 1 :(得分:1)

只是一个猜测,但我会尝试

resultA = 1 - (1-baseAlpha) * (1-blendAlpha)

答案 2 :(得分:0)

我正在仔细研究这个问题,直到我发现最好的方法是使基础和混合层都具有直线α,然后仅预测基本alpha的结果。