2012/12/26 今回は、エフェクトってほどのものではありませんが加算合成をやります 加算合成はすでに書かれている色に対して 今回使うファイルは次のようになってます。どぞー(-ω-)つ旦 zipでほしい人はこちら 爆発などの表現に使われます DirectX講座16回でやったSetRenderState関数をdirect3d.hに持っていきます #pragma once // Direct3Dクラスは同じなので略 // レンダーステートの設定 enum RENDERSTATE { RENDER_DEFAULT, // デフォルト(不透明) RENDER_ALPHATEST, // αテスト RENDER_HALFADD, // 半加算合成 RENDER_ADD // 加算合成 }; // レンダーステートの変更 void SetRenderState(IDirect3DDevice9* pD3DDevice,RENDERSTATE RenderState); direct3d.cppでSetRenderState関数を拡張します #include "direct3d.h" // Direct3Dクラスのメンバ関数は同じなので略 // レンダーステートの変更 void SetRenderState(IDirect3DDevice9* pD3DDevice,RENDERSTATE RenderState) { switch(RenderState) { case RENDER_DEFAULT: { // 不透明オブジェクト pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); //アルファテストの無効化 pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); //アルファブレンディングの無効化 } break; case RENDER_ALPHATEST: { // αテストによる透明領域の切り抜き pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); //アルファテストの有効化 pD3DDevice->SetRenderState(D3DRS_ALPHAREF, 0x80); //アルファ参照値 pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL); //アルファテスト合格基準 pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); //アルファブレンディングの無効化 } break; case RENDER_HALFADD: { pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); //アルファテストの無効化 pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE); //アルファブレンディングの有効化 pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE ); //Zバッファへの書き込みを無効にする。 //pD3DDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE ); //Zテストを行わない //pD3DDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); //ライティングしない pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD ); //ブレンディングオプション加算 pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); //SRCの設定 pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE); //DESTの設定 } break; case RENDER_ADD: { // 全加算合成 pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE); //アルファブレンディングの有効化 pD3DDevice->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD ); //ブレンディングオプション加算 pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE); //SRCの設定 pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_ONE); //DESTの設定 pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); //アルファテストの無効化 } break; } } effect.cppでSetRenderState関数を使います /////////////////////////////////////////////////////////////////////////////////////////////// // 描画開始 if(SUCCEEDED(direct3d.pDevice3D->BeginScene())) { DWORD ClearColor = 0xff808080; // 背景クリア色 // 背景クリア direct3d.pDevice3D->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, ClearColor, 1.0f, 0 ); // 加算合成 SetRenderState(direct3d.pDevice3D,RENDER_ADD); // コマセット sprite.SetUVNum(anim[frame % 16].numU,anim[frame % 16].numV); // スプライト描画 sprite.Draw(direct3d.pDevice3D,bombtex.pTexture); // 描画終了 direct3d.pDevice3D->EndScene(); } // 描画反映 direct3d.pDevice3D->Present( NULL, NULL, NULL, NULL ); // フレーム更新 frame++; /////////////////////////////////////////////////////////////////////////////////////////////// 今回の実行結果は次のようになります 説明は省きますがSetRenderState関数の引数をRENDER_HALFADDに変更すると半加算合成をします
|