RGB1 * A1 + RGB2 * A2ほど単純ではないようです...値はどのようにクリップされますか?加重?等。
そして、これはコンテキスト依存の質問ですか?異なる結果を生み出す異なるアルゴリズムはありますか?または1つの標準実装?
私はOpenGL固有の回答に特に興味がありますが、他の環境からのコンテキストも役立ちます。
RGB1 * A1 + RGB2 * A2ほど単純ではないようです...値はどのようにクリップされますか?加重?等。
そして、これはコンテキスト依存の質問ですか?異なる結果を生み出す異なるアルゴリズムはありますか?または1つの標準実装?
私はOpenGL固有の回答に特に興味がありますが、他の環境からのコンテキストも役立ちます。
OpenGL についてはわかりませんが、不透明度 A の 1 つのピクセルは通常、次のように別のピクセルに描画されます。
result.r = background.r * (1 - A) + foreground.r * A
result.g = background.g * (1 - A) + foreground.g * A
result.b = background.b * (1 - A) + foreground.b * A
この操作を複数のピクセルに対して繰り返します。
上記の答えは、画像が事前乗算されたアルファでない場合に機能します。ただし、事前に乗算されたアルファ イメージでそのタイプのブレンドを使用すると、黒い境界線が表示されます。
乗算済みアルファ:
イメージが作成されると、カラー値にアルファ チャネルが乗算されます。この 1 ピクセルの例を見てください。
Pixel: r = 1, g = 0, b = 0, a = 0.5
保存すると、rgb 値にアルファ値が乗算され、次のようになります。
Pixel: r = 0.5, g = 0, b = 0, a = 0.5
この種の画像をブレンドするには、次の式を使用する必要があります。
result.r = background.r * (1 - A) + foreground.r
result.g = background.g * (1 - A) + foreground.g
result.b = background.b * (1 - A) + foreground.b
あらかじめ乗算されていないアルファ
この例では、アルファ チャネルはカラー チャネルから完全に分離されています。
Pixel: r = 1, g = 0, b = 0, a = 0.5
保存すると:
Pixel: r = 1, g = 0, b = 0, a = 0.5
それは同じだ。この場合、ミニテックが提供する答えは正しいです。
詳細については、こちらを参照してください: Premultiplied alpha