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

Graphics 如何在手册中处理alpha“;“覆盖”;混合操作?,graphics,image-processing,blend,rgba,premultiplied-alpha,Graphics,Image Processing,Blend,Rgba,Premultiplied Alpha,我正在玩一些手动(漫游像素)图像处理,我正在重新创建标准的“叠加”混合。我在这里查看“Photoshop数学”宏: (用于更可读的叠加版本) 两个源图像都是相当标准的RGBA(每个8位)格式,目标图像也是如此。当两个图像都完全不透明(alpha为1.0)时,结果将按预期正确混合: 但是,如果我的“混合”层(顶部图像)中有透明度,我有点困惑于如何正确地将alpha因子纳入混合方程中。我希望它的工作方式是,混合层中的透明像素对结果没有影响,混合层中的不透明像素像正常情况一样进行叠加混合,半透明混合

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

(用于更可读的叠加版本)

两个源图像都是相当标准的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??

只是猜测,但我会试试

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

我一直在试验这个问题,直到我发现最好的方法是让基础层和混合层都使用直alpha,然后只使用基础alpha对结果进行预乘。

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

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

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

好的,这是什么原理?谢谢。@quixoto好吧,我想把这两者相乘,使它们都在等式中,在组合透明层时不会过早达到不透明度(添加透明层时会出现这种情况)。但是简单的相乘会使它接近于零,其中一个接近于零。因此,我将整个过程颠倒过来,对于测试值(如0,0.5,1),它“感觉良好”