*頂点バッファの作成((頂点インデックスバッファに関してもここで記述します。)) [#ia28fccc] &shiftnote(nohr); 頂点バッファを作成する手順は以下の様になります。 +頂点のフォーマットを決定する。 +前項で決めた頂点フォーマットに対しCreateVertexBufferを使い、必要な頂点数の分だけ頂点バッファの為にメモリを確保する。 +確保したバッファにデータを送り込む。 また、頂点インデックスバッファの作成も似た様な手順になります。 +2バイト整数を使用するか4バイト整数を使用するかを決める。((GPUによっては最大65535(もしくはそれ以下)しか利用できない場合があります。その場合は4バイト整数を利用しようとしても意味がないばかりか、表示がおかしくなる場合があります。その場合には2バイト整数を使用する事になります。GPUがどれだけ確保できるかはGetDeviceCapsでMaxVertexIndexの値を調べると良いでしょう。)) +CreateIndexBufferを使い、必要な分だけ頂点インデックスバッファの為にメモリを確保する。 +確保したバッファにデータを送り込む。 &shiftnote(nohr); **実際のコード [#c4cde96e] #code(c){{ /* 頂点データのフォーマット */ struct d3dvtx_s { D3DXVECTOR3 pnt; // 位置 D3DCOLOR clr; // 色 D3DXVECTOR2 tx1; // テクスチャ }; /* 上の頂点フォーマットをフラグで表現する */ const int FVFVTX1_X = (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1); /* 動的に確保する配列 */ d3dvtx_s* VtxSet; // 頂点データ unsigned short* VtxIdxSet; // 頂点インデックスデータ // (===== 実際のコードは後ほど記述します =====) LPDIRECT3DVERTEXBUFFER9 lpVtxBuf; // 頂点バッファ LPDIRECT3DINDEXBUFFER9 lpIdxBuf; // 頂点インデックスバッファ /***** ここから実際のコード *****/ /* ここでlpD3DdevはLPDIRECT3DDEVICE9型で定義された有効なDirect3Dデバイスとする。 */ // 必要な数だけ頂点用の配列を確保する VtxSet = new d3dvtx_s[9]; // 頂点のセット SetVertex(0, 0.0f, 0.0f, 0.0f, 0xFF00, 0.0f, 0.0f); SetVertex(1, 1.0f, 0.0f, 0.0f, 0xFF00, 0.0f, 0.0f); SetVertex(2, 2.0f, 0.0f, 0.0f, 0xFF00, 0.0f, 0.0f); SetVertex(3, 0.0f, 1.0f, 0.0f, 0xFF00, 0.0f, 0.0f); SetVertex(4, 1.0f, 1.0f, 0.0f, 0xFF00, 0.0f, 0.0f); SetVertex(5, 2.0f, 1.0f, 0.0f, 0xFF00, 0.0f, 0.0f); SetVertex(6, 0.0f, 2.0f, 0.0f, 0xFF00, 0.0f, 0.0f); SetVertex(7, 1.0f, 2.0f, 0.0f, 0xFF00, 0.0f, 0.0f); SetVertex(8, 2.0f, 2.0f, 0.0f, 0xFF00, 0.0f, 0.0f); // 頂点バッファに確保するサイズの計算 size_t wsz = 9 * sizeof(d3dvtx_s); // 頂点バッファの確保 lpD3Ddev->CreateVertexBuffer(wsz, 0, FVFVTX1_X, D3DPOOL_MANAGED, &lpVtxBuf, NULL); // 確保する頂点バッファを宣言 d3dvtx_s* vbuf; // ロック lpVtxBuf->Lock(0, 0, reinterpret_cast<void**>(&vbuf), D3DLOCK_NOSYSLOCK); // データの転送 memcpy(vbuf, VtxSet, wsz); // 解放 lpVtxBuf->Unlock(); // 頂点インデックスの確保(ここでは頂点1, 3, 7を使って三角形を描画しようとする。) VtxIdxSet = new unsigned short[3]; VtxIdxSet[0] = 1; VtxIdxSet[1] = 3; VtxIdxSet[2] = 7; // 頂点インデックスバッファを確保するサイズ size_t isz = 3 * sizeof(unsigned short); // 頂点インデックスバッファの確保(2バイト整数のバッファしか対応していないGPUもある為、2バイト整数のバッファとして定義) lpD3Ddev->CreateIndexBuffer(isz, 0, D3DFMT_INDEX16, D3DPOOL_MANAGED, &lpIdxBuf, NULL); // 確保する頂点インデックスバッファを宣言 unsigned short* ibuf; // ロック lpIdxBuf->Lock(0, 0, reinterpret_cast<void**>(&ibuf), D3DLOCK_NOSYSLOCK); // 転送 memcpy(ibuf, VtxIdxSet, isz); // 解放 lpIdxBuf->Unlock(); // デバイスにインデックスをセット lpD3Ddev->SetIndices(lpIdxBuf); }} #column(作成中) この項目は現在作成中です。 #column(end) なお、頂点セット用の関数SetVertexは以下の様に定義されている物とします。~ あとここでは範囲チェックを省略していますが、実際にはidがVtxSetの範囲内におさまっているかをチェックしてください。 #code(c){{ void SetVertex(int id, float x, float y, float z, D3DCOLOR c, float u, float v) { (VtxSet + id)->pnt.x = x; (VtxSet + id)->pnt.y = y; (VtxSet + id)->pnt.z = z; (VtxSet + id)->clr = c; (VtxSet + id)->tx1.x = u; (VtxSet + id)->tx1.y = v; } }} なお、頂点データの表示に関しては[[DrawIndexedPrimitiveについて]]を参考にしてください。 //これより下は編集しないでください #pageinfo([[:Category/DirectX]],2006-08-05 (土) 00:04:59,rakuppe,2006-08-05 (土) 00:15:00,rakuppe) #pageinfo([[:Category/DirectX]],2006-08-05 (土) 00:04:59,rakuppe,2006-08-15 (火) 03:20:18,rakuppe) |