DirectXでインデックスバッファの値が上書きされる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
OROCHI
記事: 14
登録日時: 11年前

DirectXでインデックスバッファの値が上書きされる

#1

投稿記事 by OROCHI » 11年前

使用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

ISLe()

Re: DirectXでインデックスバッファの値が上書きされる

#2

投稿記事 by ISLe() » 11年前

頂点バッファと同様、DrawIndexedPrimitiveを呼び出す都度対応するインデックスバッファをデバイスにセットしなければいけないのでは。
Scene.cppとScene2.cppのcreate関数でセットしているだけなので最後にセットしたバッファが使用されているのではないでしょうか?

OROCHI
記事: 14
登録日時: 11年前

Re: DirectXでインデックスバッファの値が上書きされる

#3

投稿記事 by OROCHI » 11年前

まさにその通りでした。ありがとうございました!

具体的には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
		);

}

閉鎖

“C言語何でも質問掲示板” へ戻る