Bishamon Personal コミュニティ

Bishamon Personal コミュニティ 掲示板(仮運営中)です。

Bishamon Personal コミュニティ » DirectX9 » DXライブラリとの連携

DXライブラリとの連携

Post Reply

Page: 1

Author Post
Member
Registered: Oct 2011
Posts: 16
DXライブラリとの連携試行中のEIKIです。

解決した問題
1. DXライブラリの描画とエフェクト描画を併用した場合、DXライブラリの描画が成されない

未解決の問題
1. 描画を併用した場合、特定条件でロードした画像が白く塗り潰されてしまう
2. 描画順序の指定方法が分からない

進捗あり次第更新します
Administrator
Registered: Oct 2011
Posts: 206
Location: Tokyo
EIKI wrote
1. 描画を併用した場合、特定条件でロードした画像が白く塗り潰されてしまう


DXライブラリ内で無駄なテクスチャスイッチを行わないようにしているために起きている現象だと思います。
「固定機能パイプラインとの共存について http://www.matchlock.co.jp/bbs/topic.php?id=19
でBishamon描画後にテクスチャステージ0をNULLにしてしまっているため、
実際はNULLなのにDXライブラリ内では同じテクスチャがセットされていると判断して
SetTextureをコールしていないものと推測しました。


int image = LoadGraph("test.png");

// 1回目の描画(テクスチャセットされる)
DrawGraph(100, 100, image, 1);

// Bishamon描画
...
device->SetTexture(0, NULL);
// Bishamon描画が終わったらテクスチャをNULLにしてしまっている

// 2回目の描画(DX内でセットされない)
DrawGraph(200, 100, image, 1);


下記の様に改善すれば正しく表示されるようになると思います。


int image = LoadGraph("test.png");

// 1回目の描画(テクスチャセットされる)
DrawGraph(100, 100, image, 1);

// Bishamon描画の前にテクスチャを保持しておく
IDirect3DBaseTexture9 *texture = NULL;
device->GetTexture(0, &texture);

// Bishamon描画
...

// Bishamon描画後にテクスチャを戻す
if(texture) {
device->SetTexture(0, texture);
texture->Release();
}

// 2回目の描画
// DX内でセットされないけどテクスチャステージ0は
// Bishamon描画前の状態に戻っているので問題なし
DrawGraph(200, 100, image, 1);
Administrator
Registered: Oct 2011
Posts: 206
Location: Tokyo
EIKI wrote
2. 描画順序の指定方法が分からない


DXライブラリ内を少々調べてみました。
描画順にプライオリティ付けする方法を2通りほど
見つけましたので参考にしてみて下さい。

両者ともBishamon描画前にはRenderVertexHardware関数で
DX内の頂点バッファを強制描画させて下さい。

1. FVFを保持してBishamon描画後に元に戻す


int image = LoadGraph("test.png");

// 1回目の描画
DrawGraph(100, 100, image, 1);

// 強制的に描画
RenderVertexHardware();

// fvfを保持
DWORD fvf = 0;
device->GetFVF(&fvf);

// Bishamon描画
...

// fvfを元に戻す
device->SetFVF(fvf);

// 2回目の描画
DrawGraph(200, 100, image, 1);


2. Bishamon描画後にDrawPixelで画面外に点を描画する


int image = LoadGraph("test.png");

// 1回目の描画
DrawGraph(100, 100, image, 1);

// 強制的に描画
RenderVertexHardware();

// Bishamon描画
...

// 画面外に点を描画する
// この関数内で描画状態が戻る?
DrawPixel(-1, -1, 0);

// 2回目の描画
DrawGraph(200, 100, image, 1);


左が1回目で奥、エフェクトが真ん中、右が2回目で手前になります。
User posted image
Member
Registered: Oct 2011
Posts: 16
ありがとうございます。いずれも提示された方法で解決することが出来ました。
現在ラッパーを整備中です。完成次第配布する予定です。

EIKI`
_______________
twitter: @eiki_okuma
Member
Registered: Oct 2011
Posts: 16
おかげさまでラッパーが完成したので公開致します。
ソースコードのライセンスについて尋ねた所サンプルコードは改変しての再配布が可能(著作権表示は維持)とのことでしたので、プロジェクトに含まれております。問題があればお申し付け下さい。

http://media.illucalab.com/bmsample.zip

また、解説はブログの方に投稿しております。
http://d.hatena.ne.jp/eiki_okuma/20111026/1319631385

EIKI`
_______________
twitter: @eiki_okuma
Member
Registered: Feb 2012
Posts: 1
EIKIさんのラッパーを使おうと思い、bmsampleサンプルを使おうとしています。
コンパイルは通るのですが、DxBM_Init();でエラーが出て起動はできません。
どういった原因が考えられるでしょうか?

・simpleサンプルでBISHAMONエフェクトの起動は確認済み。
・EIKIさんのエフェクトをsimpleサンプルで動作確認済み。
・for DirectX9 (インディーズ用)、1.0.3上書き済み
・DirectXのバージョン11 SDK (June 2010)
・VisualC++2008EXPRESS
・windows7 Home 64bit


\BishamonSDK_DirectX9\include\bm3\core\bm3_RenderStateManager_inl.h

template<typename StateChangePolicyType, typename RenderDevicePolicyType>
void RenderStateManagerImpl<StateChangePolicyType, RenderDevicePolicyType>::Initialize(RenderStateInitializeInfo &info){

StateChangePolicyType::InitializeChangePolicy(info);
RenderDevicePolicyType::InitializeRenderDevicePolicy(info);
is_initialized_ = true;
}

InitializeRenderDevicePolicy実行時に
bmsample.exe の 0x0060e353 で初回の例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。
bmsample.exe の 0x77a615de でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。


もし何か心当たりがありましたら、よろしくおねがいします。
Member
Registered: Oct 2011
Posts: 16
どうやら(?)、vistaバージョン以降のDXライブラリがIDirect3DDDevice9ではなくIDirect3DDDevice9Exを返すので、そこに原因があるのでは?という話でした(Twitterより)
DeviceにIDirect3DDDevice9Exを入れた場合でも初期化できるようになりませんでしょうか。
(或いは、ラッパー側で一工夫すれば解決する問題でしょうか?)
_______________
twitter: @eiki_okuma
« Last edit by EIKI on Wed Feb 08, 2012 3:56 pm. »
Administrator
Registered: Oct 2011
Posts: 206
Location: Tokyo
Dxlibのデバイス取得がIDirect3DDDevice9Exを取得できる場合優先的にそちらを選択するようになっているみたいですね。
BISHAMON側でマスパーティクルの機能を使用する際にD3DPOOL_MANAGEDを指定しますが
IDirect3DDDevice9ExがD3DPOOL_MANAGEDを許容しないため今回の現象が起こっているようです。
Member
Registered: Oct 2011
Posts: 16
応急処置としてDXライブラリ側にSetUseDirect3D9Ex();という関数を追加して頂きました。
引数にfalseを指定することで、返されるデバイスがIDirect3DDDevice9になります。

が、この場合Direct3DDevice9ExのAPIであるSetMaximumFrameLatencyが使えなくなるという弊害があります。
これはVista以降のOSで遅延の原因になりえるレンダリング前フレームバッファをプログラム側で変更するというものです。

既にご検討頂いているようですが、MANAGEDを使わないマスパーティクル或いはマスパーティクル機能のOFFを実装して頂ければと思います。
宜しくお願いします。
_______________
twitter: @eiki_okuma
Member
Registered: Oct 2011
Posts: 16
1.0.5にて、依然IDirect3DDDevice9EXを使用すると競合しエラーが出ます。
以下に最小構成サンプルを上げました。

http://illucalab.com/temp/bishtest.zip

※ 実行には最新のDXライブラリと環境設定が必要です。
  http://homepage2.nifty.com/natupaji/DxLib/dxdload.html
※ WinXP以前だと発生しません。

エラー内容はcrecrekokoさんのものと同一です。
SetUseDirect3D9Exをfalseにすると動作するので、同様の原因んだと思われます。
_______________
twitter: @eiki_okuma

Post Reply

Page: 1

Bishamon Personal コミュニティ » DirectX9 » DXライブラリとの連携

Bishamon Personal コミュニティ is powered by UseBB 1 Forum Software