带 alpha 的混合模式

Blend mode with alpha

我正在尝试复制混合模式。目前我已经重新创建了一个屏幕混合模式,但它似乎不能很好地处理透明图像。

我有两个纹理

图片 1(前景)

图片 2(背景)

我得到的结果是这样的

计算着色器代码

#pragma kernel Blend

RWTexture2D<float4> Result;

Texture2D<float4> TopLayer;
Texture2D<float4> BottomLayer;

[numthreads(8, 8, 1)]
void Blend(uint3 id : SV_DispatchThreadID)
{
    if (TopLayer[id.xy].w == 0 && BottomLayer[id.xy].w > 0)
    {
        Result[id.xy] = BottomLayer[id.xy];
    }
    else if (BottomLayer[id.xy].w == 0 && TopLayer[id.xy].w > 0)
    {
        Result[id.xy] = TopLayer[id.xy];
    }
    else if (BottomLayer[id.xy].w == 0 && TopLayer[id.xy].w == 0)
    {
        Result[id.xy] = float4(0, 0, 0, 0);
    }
    else
    {
        float alpha_final = BottomLayer[id.xy].w + TopLayer[id.xy].w - BottomLayer[id.xy].w * TopLayer[id.xy].w;

        float4 tex = 1 - (1 - TopLayer[id.xy]) * (1 - BottomLayer[id.xy]);

        Result[id.xy] = float4(tex.x, tex.y, tex.z, alpha_final);
    }
}

如何正确混合具有不同 alpha 的图像?

与 alpha 通道混合需要使用 alpha 值进行加权。

我之前没有想过如何在屏幕混合情况下适当加权,这是一个乘法合成。我认为像 weighted geometric mean: https://en.m.wikipedia.org/wiki/Weighted_geometric_mean 那样做是有意义的:将被乘数乘以相应权重(alpha 值)的幂,然后将结果乘以权重和的倒数的幂。因为我们想要复制两个 alpha 均为 1 的标准情况:

1 - (1-a) (1-b)

其中没有平方根,我们将 alpha 值的总和除以 2:

1 - [ (1-a)wa (1-b)wb ] 2/(wa +wb)

输出 alpha 通道本身可以用相同的方式计算,或者可以是两个 alpha 值的简单最大值。不知道哪个好看