テクスチャ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
まだ、合成にはいろんな種類がありますが、今回はこれくらいにしておきます。