あらかじめ乗算されたアルファは、順序に依存しない透明性を提供しますか?


8

事前に乗算されたアルファを使用すると、次数に依存しない透明度が得られると聞いたことがありますが、座って計算すると、機能していないようです。

それは正しくありませんか、それとも私は何か間違ったことをしていますか?

私が使用している式は次のとおりです。

outrgba=inrgba+outrgba(1ina)

ここでは乗算済みアルファです。言い換えると、RGBAで「通常の」色をとると、RGBにaを乗算します。30%の不透明な白は、(1、1、1、0.3)から始まりますが、乗算済みアルファとして(0.3、0.3、0.3、0.3)になります。in

手作業で間違った答えを受け取った後、以下のC ++プログラムを作成しても、まだ間違った結果が得られます。

実行後:

out1=(0.738,0.913,0.3,1.0)out2=(0.738,0.875,0.113,1.0)

なぜ誰かが説明できますか?

#include <array>

typedef std::array<float, 4> RGBA;

void PremultiplyAlpha (RGBA& rgba)
{
    rgba[0] *= rgba[3];
    rgba[1] *= rgba[3];
    rgba[2] *= rgba[3];
}

RGBA BlendPremultipliedAlpha (const RGBA& dest, const RGBA& src)
{
    RGBA ret;
    ret[0] = src[0] + dest[0] * (1.0f - src[3]);
    ret[1] = src[1] + dest[1] * (1.0f - src[3]);
    ret[2] = src[2] + dest[2] * (1.0f - src[3]);
    ret[3] = src[3] + dest[3] * (1.0f - src[3]);
    return ret;
}

int main(int argc, char **argv)
{
    RGBA greenGround = { 0.0f, 1.0f, 0.0f, 1.0f };
    PremultiplyAlpha(greenGround);

    RGBA red25PercentOpaque = { 1.0f, 0.0f, 0.0f, 0.25f };
    PremultiplyAlpha(red25PercentOpaque);

    RGBA white30PercentOpaque = { 1.0f, 1.0f, 1.0f, 0.3f };
    PremultiplyAlpha(white30PercentOpaque);

    RGBA yellow50PercentOpaque = { 1.0f, 1.0f, 0.0f, 0.5f };
    PremultiplyAlpha(yellow50PercentOpaque);

    // one way
    RGBA out1;
    {
        // start with the green ground and blend in 25% opaque red
        out1 = greenGround;
        out1 = BlendPremultipliedAlpha(out1, red25PercentOpaque);

        // then blend in 50% yellow
        out1 = BlendPremultipliedAlpha(out1, yellow50PercentOpaque);

        // then blend in 30% opaque white
        out1 = BlendPremultipliedAlpha(out1, white30PercentOpaque);
    }

    // other way
    RGBA out2;
    {
        // start with the green ground and blend in 30% opaque white
        out2 = greenGround;
        out2 = BlendPremultipliedAlpha(out2, white30PercentOpaque);

        // then blend in 25% red
        out2 = BlendPremultipliedAlpha(out2, red25PercentOpaque);

        // then blend in 50% yellow
        out2 = BlendPremultipliedAlpha(out2, yellow50PercentOpaque);
    }

    return 0;
}

回答:


9

乗算済みアルファ自体は、注文に依存しない透明度を提供しません。

このページでは、注文に依存しない透明性ソリューションの一部として使用する方法について説明しています。http//casual-effects.blogspot.com/2015/03/implemented-weighted-blended-order.html

乗算済みアルファのその他の利点は次のとおりです。


5

乗算済みアルファブレンディングの証明から、「演算子は連想ルールを尊重する必要がある」という仮定があります。そのため、プロセスの順序が混乱する可能性があります。

これは可換規則ではないため、blend(a、b)はblend(b、a)と同じではありません。

したがって、blend(blend(a、b)、c)は、blend(a、blend(b、c))と同じ値を返します。しかし、blend(blend(a、b)、c)は、例のようにblend(blend(b、a)、c)と同じ値を返しません。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.