アルファブレンド

αブレンド（アルファブレンド、英: alpha blend）とは、2つの画像を係数（α値）により合成すること。特に映像表現やコンピュータゲームの開発などに必須の技術で、例えば別々に描かれた背景とキャラクターとを合成するのに使われる。文字などのアンチエイリアスにも使われている。 合成にはマスク画像と呼ばれる、透過したい部分を定義した画像を用意し、それを基に、透過したい画像の透過を行う。画素にその情報を持たせて行うこともあり、その情報のことをアルファチャンネルという。マスク画像を別に用意せず、透過したい画像の任意の1色を透過色とすることもある。 マスク画像は、白黒2値のみで構成される画像を始め、256階調までのモノクロ画像が使われる。このとき、白を透過色とするか黒を透過色とするかは画像の形式やプログラムによってまちまち。灰色の部分は半透明になる。さらに、灰色の明るさで透明度が変化する。画像の縁の部分は半透明にすることでジャギーを目立たないようにアンチエイリアス処理できる。 透過する際に画像で使用されている任意の1色を透過色として合成を行うこともある。この場合、アルファチャンネルが扱える画像やプログラムがなくても済むだけでなく、マスク画像を用意する必要もないため手間は掛からない。そのかわり、透過色が使用されている部分が透過されるため、その色を使うことができないという欠点がある。解決方法としては、その色にきわめて近い色に置き換えるか他の色を透過色にする以外に方法はない。 めったに使われることのない色の代表として、「赤100%、緑0%、青100%」の色（マゼンタ/■）や、「赤0%、緑100%、青0%」の色（ライム/■）が有名。この色（蛍光色）は自然界で目にすることはなく、見た目にも悪く、光が強烈で目が疲れやすくなるためほとんど使われない。そのため、この手法での透過色として使用するには最適である。 この手法では半透明を表現することもできない。そのため、アンチエイリアスのかかった画像ではエッジ（縁）が背景と馴染まず、ジャギーが目立つ。半透明にしたい部分に、透過色と半透明にしたい色とを交互に置くことで擬似的に実現する方法がある。GIFの透過にはこの手法が用いられている。 画像の任意の点におけるアルファブレンドの結果の画素値は以下のようになる： { o u t A = s r c A + d s t A ( 1 − s r c A ) o u t R G B = ( s r c R G B s r c A + d s t R G B d s t A ( 1 − s r c A ) ) ÷ o u t A o u t A = 0 ⇒ o u t R G B = 0 {\displaystyle \left\{{\begin{array}{l}out_{A}=src_{A}+dst_{A}(1-src_{A})\\out_{RGB}={\bigl (}src_{RGB}src_{A}+dst_{RGB}dst_{A}\left(1-src_{A}\right){\bigr )}\div out_{A}\\out_{A}=0\Rightarrow out_{RGB}=0\end{array}}\right.} なお、背景が不透明な場合、つまり、 d s t A = 1 {\displaystyle dst_{A}=1} の場合は上記に代入すると以下の通りになる： { o u t A = 1 o u t R G B = s r c R G B s r c A + d s t R G B ( 1 − s r c A ) {\displaystyle \left\{{\begin{array}{l}out_{A}=1\\out_{RGB}=src_{RGB}src_{A}+dst_{RGB}(1-src_{A})\end{array}}\right.} dstが背景で、srcが前景である。Aはα値と呼ばれる [0, 1] の範囲の値を取る係数であり、どれくらい透過させるかを表す値である。Aが1のとき完全な不透過であり、0のとき完全な透明となる。このAがアルファチャンネルまたはマスク画像に相当する。 この演算は Thomas Porter および Tom Duff の論文における A over B の演算に相当する。 また、画像のRGB値として、実際のRGB値にα値を事前に乗算したものを格納しておく場合がある。これを乗算済みアルファ (premultiplied alpha) と呼ぶ。乗算済みアルファによるブレンド計算式は以下。 { o u t R G B ′ = o u t R G B × o u t A s r c R G B ′ = s r c R G B × s r c A d s t R G B ′ = d s t R G B × d s t A {\displaystyle \left\{{\begin{array}{l}out'_{RGB}=out_{RGB}\times out_{A}\\src'_{RGB}=src_{RGB}\times src_{A}\\dst'_{RGB}=dst_{RGB}\times dst_{A}\end{array}}\right.} { o u t A = s r c A + d s t A ( 1 − s r c A ) o u t R G B ′ = s r c R G B ′ + d s t R G B ′ ( 1 − s r c A ) {\displaystyle \left\{{\begin{array}{l}out_{A}=src_{A}+dst_{A}(1-src_{A})\\out'_{RGB}=src'_{RGB}+dst'_{RGB}(1-src_{A})\end{array}}\right.} 乗算済みアルファ方式を使用すると、アルファブレンドにおいてα値を乗算する処理を省略することができ、またα値のピクセル補間に起因する問題を回避することができるが、RGB値を8ビットで保持している場合、α値が1より小さいと最終的な計算結果におけるRGB値の精度が低下する等の欠点がある。乗算済みアルファの s r c A {\displaystyle src_{A}} は、通例オーサリングソフトなどによって透過画像を生成・保存する際に適用されることが多い。 Direct3D、OpenGLなどのグラフィックスライブラリでは、srcは頂点カラー、マテリアルおよびテクスチャなどに相当し、dstはレンダーターゲット（バックバッファあるいはフレームバッファ）に相当する。また、これらのグラフィックスライブラリを使用したアプリケーションソフトウェアにおいて、乗算済みアルファではなく以下のような補間アルファ (interpolated alpha) によるブレンド計算式が使われることもある。 { o u t A = s r c A + d s t A ( 1 − s r c A ) o u t R G B = s r c R G B s r c A + d s t R G B ( 1 − s r c A ) {\displaystyle \left\{{\begin{array}{l}out_{A}=src_{A}+dst_{A}(1-src_{A})\\out_{RGB}=src_{RGB}src_{A}+dst_{RGB}(1-src_{A})\end{array}}\right.} 補間アルファでは実行時に s r c A {\displaystyle src_{A}} を反映する。ただし、α値のピクセル補間に起因する問題が発生することがある。また、簡略化・高速化のため、RGB値には d s t A {\displaystyle dst_{A}} が反映されない。 補間アルファはストレートアルファ (straight alpha) と呼ばれることもある。 ^ Compositing Digital Images ^ a b D3DTEXTUREOP enumeration (D3D9Types.h) - Win32 apps | Microsoft Docs ^ a b D3DTEXTUREOP | Microsoft Docs ^ 乗算済みアルファとは？ その１:補間アルファの問題点 - ひにけにGD - Site Home - MSDN Blogs, Internet Archive ^ 乗算済みアルファとは？ その１:補間アルファの問題点 | Microsoft Docs ^ 乗算済みアルファ | 3ds Max 2021 | Autodesk Knowledge Network ^ 方法: 前乗算されたアルファを持つテクスチャをエクスポートする - Visual Studio (Windows) | Microsoft Docs ^ D2D1_COLOR_INTERPOLATION_MODE (d2d1_1.h) - Win32 apps | Microsoft Docs コンピュータグラフィックス アルファチャンネル クロマキー 表示 編集