頂点バッファーの作成 (Direct3D 9)
頂点バッファー オブジェクトを作成する場合は、5 つのパラメーターを受け入れる IDirect3DDevice9::CreateVertexBuffer メソッドを呼び出します。 最初のパラメーターは、頂点バッファーの長さをバイト単位で指定します。 sizeof 演算子を使用して、頂点形式のサイズをバイト単位で決定します。 次のカスタム頂点形式について考えてみましょう。
struct CUSTOMVERTEX {
FLOAT x, y, z;
FLOAT rhw;
DWORD color;
FLOAT tu, tv; // Texture coordinates
};
// Custom flexible vertex format (FVF) describing 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 頂点バッファー (Direct3D 9)」を参照してください。 4 番目のパラメーターは、頂点バッファーを配置するメモリ クラスを表します。
IDirect3DDevice9::CreateVertexBuffer が受け取る最後のパラメーターは、呼び出しが成功した場合に、頂点バッファー オブジェクトの新しい IDirect3DVertexBuffer9 インターフェイスへのポインターで埋める変数のアドレスです。
頂点バッファーのサポートなしで作成された頂点バッファーのクリップ フラグを生成することはできません。
次の C++ コード例は、頂点バッファーを作成するコードの外観を示しています。
// d3dDevice contains the address of an IDirect3DDevice9 interface
// 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, NULL ) ) )
return E_FAIL;
関連トピック