使用OS:Windows 8
開発環境:Visual Studio 2013
使用ライブラリ:DirectXSDK June 2010
こんにちは。現在DirectX9を用いて、頂点と頂点インデックスを指定し「複数の」オブジェクトをレンダリングすることを考えています
そこで「頂点バッファを作成」→「頂点バッファをロック」→「頂点の座標値の指定」→「頂点カラーの指定」→「頂点データのアンロック」→「頂点インデックスバッファの作成」→「インデックスバッファをロック」→「インデックスの書き込み」→「インデックスバッファをアンロック」という手順を2回繰り返し、それぞれの頂点座標とインデックスバッファをIDirect3DDevice9に保持しています。(下記URLからDLできるソースのScene.cppとScene2.cppのcreate関数がそこに該当します)
ところが、いざその後レンダリングしてみると、最初に頂点情報などを取得したオブジェクトの画像が崩れてしまいます
この原因を追ってみると、1回目のインデックスバッファの内容を記録した領域に、2回目のインデックスバッファの内容が上書きされているということがメモリビューワーから明らかになりました
このため、1個ならともかく2個分以上の頂点情報を与えると、1個目の頂点情報が破壊された状態で描画されてしまいます
ソースは下記のURLからダウンロードできますので、心当たりがあるかた、この問題の解決法をご教授いただけないでしょうか?
ソース自体は2013以前のVisualStudioでも、空プロジェクトを作って追加のライブラリディレクトリと追加のインクルードディレクトリにDirectXSDKを指定し、全cpp,hを追加すれば動くと思いますのでなにとぞよろしくお願いします
https://box.yahoo.co.jp/guest/viewer?si ... ype=detail
DirectXでインデックスバッファの値が上書きされる
Re: DirectXでインデックスバッファの値が上書きされる
頂点バッファと同様、DrawIndexedPrimitiveを呼び出す都度対応するインデックスバッファをデバイスにセットしなければいけないのでは。
Scene.cppとScene2.cppのcreate関数でセットしているだけなので最後にセットしたバッファが使用されているのではないでしょうか?
Scene.cppとScene2.cppのcreate関数でセットしているだけなので最後にセットしたバッファが使用されているのではないでしょうか?
Re: DirectXでインデックスバッファの値が上書きされる
まさにその通りでした。ありがとうございました!
具体的にはScene.cpp,Scene2.cppのdraw関数のDrawIndexedPrimitiveの直前でインデックスバッファを再設定したらうまくいきました。具体的には以下の通りです(Sceneのメンバ関数ですがScene2も同様です)
具体的にはScene.cpp,Scene2.cppのdraw関数のDrawIndexedPrimitiveの直前でインデックスバッファを再設定したらうまくいきました。具体的には以下の通りです(Sceneのメンバ関数ですがScene2も同様です)
void Scene::draw( LPDIRECT3DDEVICE9 pD3DDevice ) {
if ( pD3DDevice == 0 ) {
return;
}
if ( pMyVB_ == 0 ) {
return;
}
// 座標変換(カメラの設定など)
transform( pD3DDevice );
// 座標変換(モデルの配置)
//dxMath_.matrixIdentity(&world_);
//pD3DDevice->SetTransform( D3DTS_WORLD, &world_ );
pD3DDevice->SetTransform(D3DTS_WORLD, &worldpos_);
//--------------------------------------
// 頂点バッファーの描画
//--------------------------------------
// 頂点バッファーをレンダリングパイプラインに設定
pD3DDevice->SetStreamSource( 0, pMyVB_, 0, sizeof( MY_VERTEX ) );
// 頂点データのFVFフォーマットを設定
pD3DDevice->SetFVF( MY_VERTEX_FVF );
// インデックスバッファを設定(これを追加)
pD3DDevice->SetIndices(pMyIB_);
// 描画
pD3DDevice->DrawIndexedPrimitive(
D3DPT_TRIANGLELIST,
0,
0,
8,
0,
12
);
}