【DirectXプログラミング】インデックスバッファを使った描画について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
シエル

【DirectXプログラミング】インデックスバッファを使った描画について

#1

投稿記事 by シエル » 15年前

いつもお世話になっております。シエルです。

今回はDirectXのインデックスバッファを使った描画について質問があります。

添付の画像のようにインデックスバッファを使って四角形四つを9つの頂点を使って
描画しようとしています。

頂点バッファとインデックスバッファは下記の通りです。

//頂点バッファ
v[0].p = D3DXVECTOR3(-1.0f, 1.0f, 0.0f );
v[1].p = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
v[2].p = D3DXVECTOR3( 1.0f, 1.0f, 0.0f );
v[3].p = D3DXVECTOR3(-1.0f, 0.0f, 0.0f );
v[4].p = D3DXVECTOR3( 0.0f, 0.0f, 0.0f );
v[5].p = D3DXVECTOR3( 1.0f, 0.0f, 0.0f );
v[6].p = D3DXVECTOR3(-1.0f, -1.0f, 0.0f );
v[7].p = D3DXVECTOR3( 0.0f, -1.0f, 0.0f );
v[8].p = D3DXVECTOR3( 1.0f, -1.0f, 0.0f );
v[0].t = D3DXVECTOR2(0.0f,0.0f);
v[1].t = D3DXVECTOR2(0.5f,0.0f);
v[2].t = D3DXVECTOR2(1.0f,0.0f);
v[3].t = D3DXVECTOR2(0.0f,0.5f);
v[4].t = D3DXVECTOR2(0.5f,0.5f);
v[5].t = D3DXVECTOR2(1.0f,0.5f);
v[6].t = D3DXVECTOR2(0.0f,1.0f);
v[7].t = D3DXVECTOR2(0.5f,1.0f);
v[8].t = D3DXVECTOR2(1.0f,1.0f);

//インデックスバッファ
id[0] = 0; id[1] = 1; id[2] = 3; id[3] = 4; //四角形1
id[4] = 1;id[5] = 2; id[6] = 4; id[7] = 5; //四角形2
id[8] = 3;id[9] = 4; id[10] = 6; id[11] = 7; //四角形3
id[12] = 4; id[13]=5; id[14]=7; id[15]=8; //四角形4

//ココの第六引数が8だと思うのに16じゃないと思い通りにならない。
pD3DDevice->DrawIndexedPrimitive( D3DPT_TRIANGLESTRIP , 0, 0, 9, 0, 16);

プリミティブタイプをD3DPT_TRIANGLESTRIPで描画しようと思ったので、
4×4=16で16個のインデックスバッファを使って描画しようとしました。

ですが、最後のDrawIndexedPrimitiveの第六引数でプリミティブの数を指定するところで、
イメージでは三角形が8個なので8を指定すればいいのかなと思ったのですが、そうすると
四角形二つ分しか描画されません。
16個にするとやっと四角形四つが描画されるようになります。

どう見ても画像の中には三角形が8個しかないのに、何故16という値を引数に設定しなければならないのか
分かる方、ご教授願います。

よろしくお願い致します。

※ちなみにプリミティブタイプをD3DPT_TRIANGLELISTにして、インデックスバッファを3×8=24個定義して
描画しようとすると、こっちは第六引数は8個で四角形が四つ全て描画されました。

うしお

Re:【DirectXプログラミング】インデックスバッファを使った描画について

#2

投稿記事 by うしお » 15年前

D3DPT_TRIANGLESTRIPの性質が原因だと思われます、性質を確認してみてください
D3DPT_TRIANGLESTRIPは四角形ごとに合わせてくれるわけではないので、
あくまで連なりとして描こうとします。
ということを念頭にいれて、インデックスを紙に書き出してみると、
四角形1から四角形2(同様に2→3)の途中で無駄なポリゴンが生まれていることがわかります
この無駄なポリゴンの数の分だけ引数の数字が足りなくなっているものと思われます。

また、D3DPT_TRIANGLESTRIPでは
インデックスの数 - 2個 の3角形を描けるので、
インデックスが16個ある場合は16-2= 14個のポリゴンが描かれる計算になります

シエル

Re:【DirectXプログラミング】インデックスバッファを使った描画について

#3

投稿記事 by シエル » 15年前

あ~そういうことですか。
確かに良く考えてみるとSTRIPの性質からして、そうなっちゃいますね。。。

うーん。でもLISTよりインデックスバッファの数は減るから、メモリ的には節約できるかな?
まあ速度は落ちるかもしれないんでどっちがいいかは分かりませんが^^;

まあ、原因がはっきり分かったので、解決にします!

うしおさん!ありがとうございました! 画像

閉鎖

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