アルファブレンド
■アルファブレンド
アルファブレンドとは画像のα値を使用して合成することです。
アルファブレンドを使用することで画像やポリゴンに使用されている
アルファ値が有効になり画像が透過します。
アルファブレンドを有効にした状態で画像の上にアルファ値を持った半透明な画像を重ねると
二つの画像の重なり部分が分かる描画になります。
以下の図はアルファブレンドの使用の有無による描画の差異を表しています。
●DirectXでのアルファブレンド実行の流れ
DirectXではSetRenderStateを使用することでアルファブレンドの設定ができます。
以下はDirectXでアルファブレンドを行う際の流れになります。
※DirectXでは画像のアルファ値を反映する描画を行いたい場合も
SetRenderStateでアルファブレンドの設定を行う必要があります。
①.SetRenderStateでアルファブレンドをONにする
SetRenderStateでアルファブレンドの設定をONにします。
・SetRenderState仕様:
DirecXの描画設定を決めるための関数
第一引数:
描画設定の内容
第二引数:
第一引数に設定した描画設定の新しい設定値
・アルファブレンド設定例:
// アルファブレンドの設定を有効にする
SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
②.SRCとDESTでアルファ値のブレンディング係数を決める
アルファブレンドを有効にしたらアルファ値のブレンディング係数を決めます。
係数は画面上に既に表示されている色情報(DEST)と上から新しく描画する色情報(SRC)の
両方で設定する必要があります。
・SRCの設定
SetRenderState(D3DRS_SRCBLEND, ブレンディング係数の種類);
・DESTの設定
SetRenderState(D3DRS_DESTBLEND, ブレンディング係数の種類);
・計算例:
合成結果 = SRC * ブレンディング係数 + DEST * ブレンディング係数
2-1.透過なし
透過なし設定:
SRC => D3DBLEND_ONE
DEST => D3DBLEND_ZERO
上の図のように透過なしはアルファ値が反映されず画像の色情報が
そのまま表示されます。
SetRenderState設定のD3DBLEND_ONEは色情報に対して1を
D3DBLEND_ZEROは色情報に対して0をかけます。
計算式:
SRC = (赤 * 1, 緑 * 1, 青 * 1)
DEST = (赤 * 0, 緑 * 0, 青 * 0)
合成結果 = SRC + DEST
透過なしの場合はSRCに1をDESTに0をかけることで、
色の合成を行わずSRCの色情報をそのまま使用するにしています。
2-2.透過有り
透過有りの設定:
SRC => D3DBLEND_SRCALPHA
DEST => D3DBLEND_INVSRCALPHA
上の図のように通常透過はアルファ値が反映され、画像が重なっている部分は
SRCのアルファ値に応じた色の合成が行われます。
SetRenderState設定のD3DBLEND_SRCALPHAは色情報に対してSRCのアルファ値を
D3DBLEND_INVSRCALPHAは色情報に対して(1 - SRCのアルファ値)をかけます。
計算式:
SRC = 赤 * SRCのアルファ値
緑 * SRCのアルファ値
青 * SRCのアルファ値
DEST = 赤 * (1 - SRCのアルファ値)
緑 * (1 - SRCのアルファ値)
青 * (1 - SRCのアルファ値)
合成結果 = SRC + DEST
通常の透過ではSRCのアルファ値を色情報の合成の比重に使用しています。
SRCのアルファ値を使用しているのは上から書き込まれる画像の色情報を
優先しているからです。
2-3.加算合成
加算合成設定:
SRC => D3DBLEND_ONE
DEST => D3DBLEND_ONE
上の図のように加算合成は二つの色情報の合計値が画像が
重なり合っている部分に使用されます。
計算式:
SRC = (赤 * 1, 緑 * 1, 青 * 1)
DEST = (赤 * 1, 緑 * 1, 青 * 1)
合成結果 = SRC + DEST
加算合成はアルファ値は使用せず、色情報がそのまま使用されるので
透過は行われません。
また、色情報の加算は明るい色同士の加算の場合、
すぐに白色になってしまうのでこちらも注意して下さい。
2-4.加算合成(透過版)
2-3の加算合成はアルファ値の内容を考慮せずに行われますが、
アルファ値を合成結果に反映させる設定もあります。
加算合成(透過版)設定:
SRC => D3DBLEND_SRCALPHA
DEST => D3DBLEND_ONE
上の図のようにこの設定では透過させつつ、重なっている部分が
通常の透過設定よりも強調されます。
計算式:
SRC = 赤 * SRCのアルファ値
緑 * SRCのアルファ値
青 * SRCのアルファ値
DEST = (赤 * 1, 緑 * 1, 青 * 1)
合成結果 = SRC + DEST
上の計算式でわかるようにSRCでアルファ値を計算に入れていますので、
合成結果の色情報に透過の内容が反映されます。
③描画
②でアルファブレンドの設定が完了したら
描画関数を呼び出して画像の描画を行います。
これでアルファブレンドが実行された画像の描画が行われます。
※SetRenderStateで行った設定は再度変更が行われるまで変わりません。
設定を変更した際は注意して下さい。