頂点バッファの作成
頂点バッファの作成
5 つの引数を受け取る IDirect3DDevice9::CreateVertexBuffer メソッドを呼び出して、頂点バッファ オブジェクトを作成する。第 1 引数は、頂点バッファの長さをバイト単位で指定する。頂点フォーマットのサイズをバイト単位で判定するには、sizeof 演算子を使う。次に、カスタム頂点フォーマットの例を示す。
struct CUSTOMVERTEX {
FLOAT x, y, z;
FLOAT rhw;
DWORD color;
FLOAT tu, tv; // The texture coordinates.
};
// Custom FVF, which describes the custom vertex structure.
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)
4 つの CUSTOMVERTEX 構造体を保持する頂点バッファを作成するには、Length パラメータに [4*sizeof(CUSTOMVERTEX)] を指定する。
第 2 引数は、使用法コントロール セットである。特に、この値は、頂点バッファが表示領域外の頂点のクリッピング情報を (クリップ フラグ形式で) 保持できるかどうかを指定する。クリップ フラグを格納できない頂点バッファを作成するには、Usage パラメータに D3DUSAGE_DONOTCLIP フラグを含める。D3DUSAGE_DONOTCLIP フラグは、頂点バッファがトランスフォーム済みの頂点を保持するように指示した場合、つまり、D3DFVF_XYZRHW フラグが FVF パラメータに含まれる場合のみ適用される。未トランスフォームの頂点 (D3DFVF_XYZ フラグ) をバッファに含めるよう指示した場合、IDirect3DDevice9::CreateVertexBuffer メソッドは D3DUSAGE_DONOTCLIP フラグを無視する。クリッピング フラグは追加メモリを占有するため、クリッピング可能な頂点バッファは、クリッピング フラグを含めない頂点バッファよりも若干大きくなる。リソースは頂点バッファが作成されるときに割り当てられるため、クリッピング可能な頂点バッファは先に要求しておかなければならない。
第 3 引数 FVF は、D3DFVF の組み合わせによって、頂点バッファの頂点フォーマットを記述する。この引数に 0 を指定した場合、頂点バッファは非 FVF 頂点バッファとなる。詳細については、「FVF 頂点バッファ」を参照すること。第 4 引数は、頂点バッファを格納するメモリ クラスを指定する。
IDirect3DDevice9::CreateVertexBuffer が受け取る最後の引数は、呼び出しが成功したときに頂点バッファ オブジェクトの新しい IDirect3DVertexBuffer9 インターフェイスへのポインタが格納される変数のアドレスである。
注 クリップ フラグのサポートなしで作成した頂点バッファにクリップ フラグを生成することはできない。
次のコードは、C++ で頂点バッファを作成する方法を示している。
// For the purposes of this example, the d3dDevice variable is
// the address of an IDirect3DDevice9 interface exposed by a
// Direct3DDevice object, g_pVB is a variable of type
// LPDIRECT3DVERTEXBUFFER9.
// The custom vertex type
struct CUSTOMVERTEX {
FLOAT x, y, z;
FLOAT rhw;
DWORD color;
FLOAT tu, tv; // The texture coordinates
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)
// Create a clipping-capable vertex buffer.Allocate enough memory
// in the default memory pool to hold three CUSTOMVERTEX
// structures.
if( FAILED( d3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
0 /* Usage */, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB ) ) )
return E_FAIL;