带 alpha 的混合模式

问题描述

我正在尝试复制混合模式。目前我重新创建了一个屏幕混合模式,但它似乎不适用于透明图像。

我有两个纹理

图像 1(前景)

enter image description here

图片 2(背景)

enter image description here

我得到的结果是这样的

enter image description here

计算着色器代码

#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);
    }
    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 值的简单最大值。我不知道什么会更好看。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...