*DrawIndexedPrimitiveについて [#ddb3e7e3] プリミティブ(基本的な図形)を描画する為のコマンドにはDrawPrimitiveとDrawIndexedPrimitiveの二種類があります。(更にそれぞれのコマンドの派生としてDrawPrimitiveUpとDrawIndexedPrimitiveUpというのもありますが、ここでは省略します。) DrawIndexedPrimitiveは頂点バッファの他に頂点インデックスバッファも指定する必要がありますが、同じ頂点を共有する複数のプリミティブを描画する場合にメモリ使用の効率が良くなります。 DrawIndexedPrimitiveを呼び出す時は頂点データが入っている頂点バッファの他に、何番目の頂点を使ってプリミティブを描くかを指示する頂点インデックスバッファも指定する必要があります。しかし同じ頂点を共有する複数のプリミティブを描画する場合にはDrawIndexedPrimitiveを使った方がメモリ使用の効率が良くなります。~ (下のコード例では頂点バッファに入る頂点データは1頂点あたり24バイトも消費するのに対し、頂点インデックスバッファには頂点番号を入れれば良いので1頂点あたり2バイト又は4バイトしか消費しない為。) ただDrawIndexedPrimitiveの引数はヘルプを見てもわかりにくい所があるので、どの様な値を指定すれば良いのかを以下の例で示したいと思います。 **実際のコード [#sb36e1a1] #code(c){{ /*== 宣言部 ==*/ /* 頂点バッファの型 */ struct d3dvtx_s { D3DXVECTOR3 pnt; // 位置 D3DCOLOR clr; // 色 D3DXVECTOR2 tx1; // テクスチャ }; /*== 実際のコード ==*/ /* ここでは頂点バッファ(VtxSet)に VtxSet[0] = {0.0f, 0.0f, 0.0f, 0xFF00, 0.0f, 0.0f}; VtxSet[1] = {1.0f, 0.0f, 0.0f, 0xFF00, 0.0f, 0.0f}; VtxSet[2] = {2.0f, 0.0f, 0.0f, 0xFF00, 0.0f, 0.0f}; VtxSet[3] = {0.0f, 1.0f, 0.0f, 0xFF00, 0.0f, 0.0f}; VtxSet[4] = {1.0f, 1.0f, 0.0f, 0xFF00, 0.0f, 0.0f}; VtxSet[5] = {2.0f, 1.0f, 0.0f, 0xFF00, 0.0f, 0.0f}; VtxSet[6] = {0.0f, 2.0f, 0.0f, 0xFF00, 0.0f, 0.0f}; VtxSet[7] = {1.0f, 2.0f, 0.0f, 0xFF00, 0.0f, 0.0f}; VtxSet[8] = {2.0f, 2.0f, 0.0f, 0xFF00, 0.0f, 0.0f}; 頂点インデックスバッファ(VIdxSet)に VIdxSet = {0, 3, 1, 1, 3, 7}; とセットされている物とします。 ・頂点バッファの値はそれぞれ{X座標, Y座標, Z座標, 色, テクスチャのU座標, テクスチャのV座標}です。 ・頂点バッファや頂点インデックスバッファの作成、値のセットに関しては別項を設けて説明したいと思います。 */ /* Direct3Dデバイス(のポインタ)をlpD3Ddevとします */ lpD3Ddev->SetIndecs(&VIdxSet); // 頂点インデックスバッファの指定 lpD3Ddev->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1); // 頂点フォーマットの指定 lpD3Ddev->SetStreamSource(0, VtxSet, 0, sizeof(d3dvtx_s)); // 頂点バッファの指定 /* 頂点インデックスバッファの3番目の項目から3項目を使い三角形を描画する */ lpD3Ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, // 三角形リスト 0, // 頂点バッファのベースとなる位置。(…★) 1, // 頂点バッファの1番目の項目(上の★で示した位置を0番目とする)から使用する。 7, // 頂点バッファの1番〜7番の範囲を使用する。 3, // 頂点インデックスバッファの開始位置 1); // 幾つプリミティブを描画するか? /* 頂点インデックスバッファの3番目の項目(ただし最初の項目を0番目として数える)から 3項目(つまり{1, 3, 7}を指定)を使い三角形を描画する */ lpD3Ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, // (Type)どのプリミティブを描画するか?…ここでは三角形リスト 0, // (BaseVertexIndex)頂点バッファのベースとなる位置。 1, // (MinIndex)頂点バッファの1番目の項目(BaseVertexIndexで示した位置を0番目とする)から使用する 7, // (NumVertices)MinIndexで示される頂点番号からどの範囲まで頂点バッファを使用するか?(下注参照) 3, // (StartIndex)頂点インデックスバッファの開始位置 1); // (PrimitiveCount)幾つプリミティブを描画するか?…ここでは1つのみ /* 注.NumVerticesに設定する値は、プリミティブを書くのに使用する最小の頂点番号(=MinIndexの値)と最大の頂点番号の間の幅を指定する。 つまり上の例ではプリミティブを構成する最小の頂点番号が1、最大の頂点番号が7の為、7(最大の頂点番号) - 1(最小の頂点番号) + 1(幅を示す為最後に1を足す) = 7 となる。 */ }} //これより下は編集しないでください #pageinfo([[:Category/DirectX]],2006-07-09 (日) 22:38:46,rakuppe,2006-07-09 (日) 23:51:50,rakuppe) #pageinfo([[:Category/DirectX]],2006-07-09 (日) 22:38:46,rakuppe,2006-07-19 (水) 02:17:45,rakuppe) |