私は現在,c++用のゲームライブラリであるDXライブラリを用いて3Dシューティングを作っています.
作成中のプロジェクトにエフェクト作成支援ツールEffekseerの組み込み用ランタイムを導入したのですが,
DXライブラリ側の3Dモデルの表示とEffekseer側のエフェクトの表示がうまく両立できず困っています.
DXライブラリ側の3Dモデルの表示とEffekseer側のエフェクトの表示について,
どちらか一方のみ描画する場合には,それぞれの描画に成功します.
しかし,これらを同時に描画しようとすると,画面が真っ暗になったりEffekseer側のエフェクトが
表示されなかったりとうまくいきません.やっと同時に表示されたと思ったら,今度は添付画像のように
DXライブラリ側の3Dモデルの表示がめちゃくちゃになってしまいました.

DXライブラリ側とEffekseer側のレンダリングの設定が競合していることは間違いなさそうなのですが,
どう解消したらいいのかさっぱりわかりません.
疑わしい箇所として,プログラムのメインループのソースコードを以下に示します.
while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0)
{
ClearDrawScreen();
// ゲームの進行
// (エフェクトの再生,カメラの姿勢の更新処理含む)
game.calc();
// DXライブラリ側のカメラ行列・射影行列と
// Effekseer側のカメラ行列・射影行列の同期
cyncCameraMatrix();
// 頂点バッファに溜まった頂点データを吐き出す
RenderVertex();
// エフェクトの更新処理
manager->Update();
// エフェクトの描画開始処理
renderer->BeginRendering();
// DXライブラリ側のモデル表示
// (MV1DrawModel関数を使用)
game.draw();
// Effekseer側のエフェクト表示
manager->Draw();
// エフェクトの描画終了処理
renderer->EndRendering();
// DXライブラリの設定を戻す
RefreshDxLibDirect3DSetting();
ScreenFlip();
}
一度だけ呼び出すことで行っています.
void initDxLib()
{
// 画面モード変更時のモデルハンドルの無効化を防止
SetChangeScreenModeGraphicsSystemResetFlag(FALSE);
// Zバッファを使用
SetUseZBuffer3D(TRUE);
SetWriteZBuffer3D(TRUE);
// 裏画面を使用
SetDrawScreen(DX_SCREEN_BACK);
// カメラのNear/Farクリップを設定
SetCameraNearFar(50.0f, 1000000.0f);
// マウスカーソルを非表示に設定
SetMouseDispFlag(FALSE);
// マウスカーソルのウィンドウ外への移動を禁止
SetValidMousePointerWindowOutClientAreaMoveFlag(FALSE);
}
void initEffekseer()
{
// 描画用インスタンスの生成
const LPDIRECT3DDEVICE9 device = (LPDIRECT3DDEVICE9)GetUseDirect3DDevice9();
const int MAX_INSTANCE_NUM = 2000;
renderer = EfkRenderer::Create(device, MAX_INSTANCE_NUM);
// エフェクト管理用インスタンスの生成
manager = EfkManager::Create(MAX_INSTANCE_NUM);
// 描画用インスタンスから描画機能を設定
manager->SetSpriteRenderer(renderer->CreateSpriteRenderer());
manager->SetRibbonRenderer(renderer->CreateRibbonRenderer());
manager->SetRingRenderer(renderer->CreateRingRenderer());
manager->SetModelRenderer(renderer->CreateModelRenderer());
manager->SetTrackRenderer(renderer->CreateTrackRenderer());
// 描画用インスタンスからテクスチャの読込機能を設定
// 独自拡張可能、現在はファイルから読み込んでいる。
manager->SetTextureLoader(renderer->CreateTextureLoader());
manager->SetModelLoader(renderer->CreateModelLoader());
// DxLibに合わせて左手座標系に変更
manager->SetCoordinateSystem(Effekseer::COORDINATE_SYSTEM_LH);
// 何でもいいから画像読込
int grHandle = LoadGraph("effect\\effect\\pre.jpg");
// 何でもいいのでTransFragを有効にして画像を描画する。
// こうして描画した後でないと、Effekseerは描画できない。
DrawGraph(0, 0, grHandle, TRUE);
}
何かお気付きの点がございましたら,アドバイスよろしくお願い致しますm(_ _)m
開発環境等:
Microsoft Visual C++ 2010 Express
DXライブラリVer 3.10e
Effekseer0.610
参考サイト:
DXライブラリ公式 http://homepage2.nifty.com/natupaji/DxLib/
Effekseer公式 https://sites.google.com/site/effekseer/