• 追加された行はこの色です。
  • 削除された行はこの色です。
*頂点バッファの作成((頂点インデックスバッファに関してもここで記述します。)) [#ia28fccc]

&shiftnote(nohr);

頂点バッファを作成する手順は以下の様になります。
+頂点のフォーマットを決定する。
+前項で決めた頂点フォーマットに対しCreateVertexBufferを使い、必要な頂点数の分だけ頂点バッファの為にメモリを確保する。
+確保したバッファにデータを送り込む。

また、頂点インデックスバッファの作成も似た様な手順になります。
+2バイト整数を使用するか4バイト整数を試用するかを決める。((GPUによっては最大65535までしか利用できない場合があります。その場合は4バイト整数を利用しようとしても意味がないばかりか、表示がおかしくなる場合があります。その場合には2バイト整数を使用する事になります。GPUがどれだけ確保できるかはGetDeviceCapsでMaxIndexBufferの値を調べると良いでしょう。))
+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:04:59,rakuppe)
#pageinfo([[:Category/DirectX]],2006-08-05 (土) 00:04:59,rakuppe,2006-08-15 (火) 03:20:18,rakuppe)

[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]