テクスチャ2枚はりはり(ブレンド)

今回は、1枚のポリゴンに2枚のテクスチャをはるので「D3DFVF_TEX2」を設定して2枚分のUV値の設定をします。

struct D3DVERTEXTEX2 {
	float   x,y,z;
	float   u1,y1;	// 1枚目のUV値
	float   u2,y2;	// 2枚目のUV値

	enum { FVF = D3DFVF_XYZ | D3DFVF_TEX2 } ;
};

■テクスチャを2枚設定します。

	//テクスチャ登録
	pD3DDevice->SetTexture( 0, image1 );
	pD3DDevice->SetTexture( 1, image2 );

■2枚のテクスチャをどのように合成するのか、設定します。

	// ステージ0の設定
	pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
	pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
	pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
	// ステージ1の設定
	pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
	pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_TEXTURE );
	pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD );

まずは「ステージ0の設定」で
  >pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
  0で設定したテクスチャ「pD3DDevice->SetTexture( 0, image1 );」
  >pD3DDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
  ポリゴンのデフューズカラー(この場合は0xffffffff)
  >pD3DDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
  「D3DTOP_MODULATE」で合成
次は「ステージ1の設定」
  >pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
  ステージ1で合成したテクスチャと
  >pD3DDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_TEXTURE );
  1で設定したテクスチャを「pD3DDevice->SetTexture( 1, image2 );」
  >pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD );
  「D3DTOP_ADD 」で合成
となります。
■面白いので、いろんな合成をして見ましょう
・pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );

・pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SELECTARG2 );

・pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE );
multiply args together

・pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
multiply and 1 bit

・pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE4X );
multiply and 2 bits

・pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADD );
add arguments together

・pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADDSIGNED );
add with -0.5 bias

・pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_D3DTOP_ADDSIGNED2X );
as above but left 1 bit

・pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_SUBTRACT );
Arg1 - Arg2, with no saturation

・pD3DDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_ADDSMOOTH );
add 2 args, subtract product Arg1 + Arg2 - Arg1*Arg2 = Arg1 + (1-Arg1)*Arg2

まだ、合成にはいろんな種類がありますが、今回はこれくらいにしておきます。