DDS でαブレンディングする

DDS ファイルの画像とマスクを使って、αブレンディングして描画します。
DirectX の SetRenderState でαブレンディングの設定を行います。
DDS(DDSURFACEDESC) の説明は DDS 形式の画像ファイルを作成する を参照して下さい。

前田稔(Maeda Minoru)の超初心者のプログラム入門

透明色の設定

  1. 最初に背景を透明にするマスク画像を使って描画してみましょう。
    画面左端の画像と画面中央の画像を使って kishi.dds を作成して下さい。
    詳細は DDS 形式の画像ファイルを作成する を参照して下さい。
  2. DDS 形式の画像ファイルが作成出来れば、プログラムは 透明色を設定したテクスチャを貼り付ける と同じです。
    テクスチャを読み込み込むソースコード(画像ファイルの名前)を次のように修正して下さい。
        // テクスチャ読み込み
        if (FAILED(D3DXCreateTextureFromFile(g_pDEV,"kishi.dds",&g_pTexture)))
        {   ERMSG("Texture Load Error");  return E_FAIL;  }
        
    これだけで背景を透明にした騎士の画像が表示されます。
  3. 次に dxtex.exe を起動して、画面左端の画像と画面右側の画像を使って kishi2.dds を作成して下さい。
    テクスチャを読み込み込むソースコードを次のように修正して下さい。
        // テクスチャ読み込み
        if (FAILED(D3DXCreateTextureFromFile(g_pDEV,"kishi2.dds",&g_pTexture)))
        {   ERMSG("Texture Load Error");  return E_FAIL;  }
        
  4. 騎士の画像の中央の円の部分だけが描画されるでしょう。
    透明色の閾値を大きくしてみましょう。
    円の大きさが変わることを確認して下さい。
        //カラーキー用アルファテスト
        g_pDEV->SetRenderState(D3DRS_ALPHATESTENABLE,TRUE);
        g_pDEV->SetRenderState(D3DRS_ALPHAREF,0xC0);
        g_pDEV->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL);
        

αブレンディング

  1. それでは次に kishi2.dds を使って αブレンディング してみましょう。
    テクスチャの設定と RenderState を次のように修正して下さい。
        //テクスチャ設定
        g_pDEV->SetTexture(0,g_pTexture);
        g_pDEV->SetTextureStageState(0,D3DTSS_COLOROP,  D3DTOP_MODULATE);
        g_pDEV->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
        g_pDEV->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
        //アルファ画像によるブレンド
        g_pDEV->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
        g_pDEV->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
        g_pDEV->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
        
  2. 背景の色も画像に合わせて設定してみました。
    うまく描画できたでしょうか?。
        g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(20,40,30),1.0,0);
        

【説明】

D3DRS_SRCBLEND で送り側の、 D3DRS_DESTBLEND で受け取り側のブレンディングの仕方を設定します。
設定説明
D3DBLEND_ZERO 0を乗算
D3DBLEND_ONE 1を乗算
D3DBLEND_SRCCOLOR 転送元の色を乗算
D3DBLEND_INVSRCCOLOR 転送元の色を反転したものを乗算
D3DBLEND_SRCALPHA 転送元のαを乗算
D3DBLEND_INVSRCALPHA 転送元のαを反転したものを乗算
D3DBLEND_DESTALPHA 転送先のαを乗算
D3DBLEND_INVDESTALPHA転送先のαを反転したものを乗算
D3DBLEND_DESTCOLOR 転送先の色を乗算
D3DBLEND_INVDESTCOLOR転送先の色を反転したものを乗算
D3DBLEND_SRCALPHASAT 転送元のαと転送先のαを反転したものの小さい方を乗算

【演習】

上記の方法を組み合わせて、色々なブレンディング方法を試して下さい。
一般的にαブレンディングの公式は次のようになります。
(転送元)× α +(転送先)× (1-α)
//アルファ画像によるブレンド
g_pDEV->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
g_pDEV->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
g_pDEV->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(DirectX9 game program)

超初心者のプログラム入門(DirectX10 game program)