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

Ben*_*tto 5 graphics blend image-processing rgba premultiplied-alpha

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

http://www.nathanm.com/photoshop-blending-math/另请参阅此处了解更易读的 Overlay 版本)

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

但是,如果我的“混合”层(顶部图像)具有透明度,那么我对如何将该 alpha正确分解到混合方程中感到有些困惑。我希望它能够工作,使得混合层中的透明像素对结果没有影响,混合层中的不透明像素正常进行叠加混合,而半透明混合层像素对结果有一些缩放效果。

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

奖励积分,如果你能帮助我做到这一点使得产生的图像已经正确地预乘alpha(只进场对于不是不透明的两个层中的像素,我想。)

谢谢!

// 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??
Run Code Online (Sandbox Code Playgroud)

Rag*_*ari 5

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

vec4 baseColor = ...;
vec4 blendColor = ...;
vec4 blendedColor = blend(baseColor, blendColor);
vec4 fragmentColor = (1.0 - blendColor.a) * baseColor + blendColor.a * blendedColor;
Run Code Online (Sandbox Code Playgroud)

我使用它来“叠加”混合不透明的基色和具有大量(半)透明像素的混合纹理。


Tim*_*mbo 1

只是猜测,但我会尝试

resultA = 1 - (1-baseAlpha) * (1-blendAlpha)
Run Code Online (Sandbox Code Playgroud)