アルファブレンド

■アルファブレンド

アルファブレンドとは画像のα値を使用して合成することです。
アルファブレンドを使用することで画像やポリゴンに使用されている
アルファ値が有効になり画像が透過します。
アルファブレンドを有効にした状態で画像の上にアルファ値を持った半透明な画像を重ねると
二つの画像の重なり部分が分かる描画になります。
以下の図はアルファブレンドの使用の有無による描画の差異を表しています。
gmpg_0074

●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
			
			gmpg_0075
			
			上の図のように透過なしはアルファ値が反映されず画像の色情報が
			そのまま表示されます。
			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
			
			gmpg_0076
			
			上の図のように通常透過はアルファ値が反映され、画像が重なっている部分は
			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
		
			gmpg_0077
			
			上の図のように加算合成は二つの色情報の合計値が画像が
			重なり合っている部分に使用されます。

			計算式:
				SRC = (赤 * 1 + 緑 * 1 + 青 * 1)
				DEST = (赤 * 1 + 緑 * 1 + 青 * 1)
				合成結果 = SRC + DEST 

			加算合成はアルファ値は使用せず、色情報がそのまま使用されるので
			透過は行われません。
			また、色情報の加算は明るい色同士の加算の場合、
			すぐに白色になってしまうのでこちらも注意して下さい。

		2-4.加算合成(透過版)
			2-3の加算合成はアルファ値の内容を考慮せずに行われますが、
			アルファ値を合成結果に反映させる設定もあります。

			加算合成(透過版)設定:
				SRC => D3DBLEND_SRCALPHA
				DEST => D3DBLEND_ONE
		
			gmpg_0078
		
			上の図のようにこの設定では透過させつつ、重なっている部分が
			通常の透過設定よりも強調されます。

			計算式:
				SRC = 赤 * SRCのアルファ値 + 
				   緑 * SRCのアルファ値 + 
				   青 * SRCのアルファ値
			
				DEST = (赤 * 1 + 緑 * 1 + 青 * 1)
		
				合成結果 = SRC + DEST 

			上の計算式でわかるようにSRCでアルファ値を計算に入れていますので、
			合成結果の色情報に透過の内容が反映されます。
		
	③描画
		②でアルファブレンドの設定が完了したら
		描画関数を呼び出して画像の描画を行います。
		これでアルファブレンドが実行された画像の描画が行われます。
		※SetRenderStateで行った設定は再度変更が行われるまで変わりません。
		 設定を変更した際は注意して下さい。

■テクスチャブレンディング

●アルファブレンドの合成方法
	アルファブレンドによるアルファ値の合成は
	「画面に出力する色情報が確定している画像(テクセル)のアルファ値(SRC)」「画面に描画するためにレンダリングターゲット(バッファ)に
	書き込まれた色情報のアルファ値(DEST)」で行われています。

●テクスチャブレンディング
	テクスチャブレンディングとはアルファブレンドで使用する
	「画面に出力する色情報が確定している画像(テクセル)のアルファ値(SRC)」の
	アルファ値を決めるために頂点のアルファ値と画像のアルファ値を合成する方法のことです。
	テクスチャブレンドはテクスチャマッピングの際に行われており、
	アルファブレンドとは別ものなので気をつけてください。

	レンダリングターゲット:
		レンダリングターゲットとは画像などのピクセル情報が
		書き込まれるバッファのことです。
		DirectXの規定のレンダリングターゲットはバックバッファーと呼ばれています。

	gmpg_0080

●アルファブレンドとテクスチャブレンディングの処理の順番
	アルファブレンドとテクスチャブレンディングは両方とも
	ピクセルシェーダーで処理が行われています。
	ですが、処理の順番でいうとテクスチャブレンディングが最初、
	アルファブレンディングが最後に行われます。
		
	gmpg_0079

●設定方法
	テクスチャブレンディングの設定はSetTextureStageStateで行います。
	SetTextureStageStateは通常の色成分方法と変わらず、
	合成の情報2つとその合成情報をどのように計算するかの設定をします。

	アルファ値を合成する設定例(頂点カラーと画像のアルファ値を乗算する):
		SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
		SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
		SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE );

●テクスチャマッピングとアルファブレンドの流れ

gmpg_0081