頂点バッファーの内容へのアクセス (Direct3D 9)
頂点バッファー オブジェクトを使用すると、アプリケーションは頂点データに割り当てられたメモリに直接アクセスできます。 頂点バッファー メモリへのポインターを取得するには、 IDirect3DVertexBuffer9::Lock メソッドを呼び出し、必要に応じてメモリにアクセスして、バッファーに新しい頂点データを格納したり、既に含まれているデータを読み取ったりします。 IDirect3DVertexBuffer9::Lock メソッドは 4 つのパラメーターを受け取ります。 最初の OffsetToLock は、頂点データへのオフセットです。 2 番目のパラメーターは、頂点データのサイズ (バイト単位) です。 受け入れられる 3 番目のパラメーターは、呼び出しが成功した場合に頂点データを指すポインターのアドレスです。
最後のパラメーター Flags は、メモリをロックする方法をシステムに伝えます。 頂点データへのアクセス方法に従って 、Flags パラメーターの定数を指定します。 D3DUSAGE に選択した値が、D3DLOCK で選択した値と一致していることを確認します。 たとえば、書き込みアクセス権のみを持つ頂点バッファーを作成する場合、D3DLOCK_READONLYを指定してデータを読み取ろうとしても意味がありません。 これらのフラグを使用すると、ドライバーはメモリをロックし、要求されたアクセスの種類に応じて最高のパフォーマンスを提供できます。
頂点データの入力または読み取りが完了したら、次のコード例に示すように IDirect3DVertexBuffer9::Unlock メソッドを呼び出します。
// This code example assumes the g_pVB is a variable of type
// LPDIRECT3DVERTEXBUFFER9 and that g_Vertices has been
// properly initialized with vertices
// Lock the buffer to gain access to the vertices
VOID* pVertices;
if(FAILED(g_pVB->Lock(0, sizeof(g_Vertices),
(BYTE**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy(pVertices, g_Vertices, sizeof(g_Vertices));
g_pVB->Unlock();
D3DUSAGE_WRITEONLY フラグを使用して頂点バッファーを作成する場合は、D3DLOCK_READONLYロック フラグを使用しないでください。 アプリケーションが頂点バッファー メモリからのみ読み取る場合は、D3DLOCK_READONLY フラグを使用します。 このフラグを含めると、メモリへのアクセスが読み取り専用になると、Direct3D は内部プロシージャを最適化して効率を向上させることができます。
IDirect3DVertexBuffer9::Lock の Flags パラメーターにD3DLOCK_DISCARDまたはD3DLOCK_NOOVERWRITEを使用する方法については、「動的頂点バッファーとインデックス バッファーの使用」を参照してください。
C++ では、頂点バッファーに割り当てられたメモリに直接アクセスするため、アプリケーションが割り当てられたメモリに適切にアクセスしていることを確認します。 それ以外の場合は、そのメモリが無効なレンダリングを行うリスクがあります。 アプリケーションで使用する頂点形式のストライドを使用して、割り当てられたバッファー内のある頂点から別の頂点に移動します。 頂点バッファー メモリは、FVF で指定された頂点の単純な配列です。 定義した頂点書式構造のストライドを使用します。 頂点バッファーの説明に含まれる D3DFVF を調べることで、実行時に各頂点のストライドを計算できます。 次の表は、各頂点コンポーネントのサイズを示しています。
頂点書式フラグ | サイズ |
---|---|
D3DFVF_DIFFUSE | sizeof(DWORD) |
D3DFVF_NORMAL | sizeof(float) x 3 |
D3DFVF_SPECULAR | sizeof(DWORD) |
D3DFVF_TEXn | sizeof(float) x n |
D3DFVF_XYZ | sizeof(float) x 3 |
D3DFVF_XYZRHW | sizeof(float) x 4 |
頂点形式で存在するテクスチャ座標の数は、D3DFVF_TEX n フラグ (n は 0 から 8 の値) によって記述されます。 テクスチャ座標セットの数に 1 セットのテクスチャ座標のサイズを乗算します。このサイズは、1 から 4 個の浮動小数点の範囲で指定でき、テクスチャ座標の数に必要なメモリを計算します。
頂点ストライドの合計を使用して、特定の頂点にアクセスするために必要に応じてメモリ ポインターをインクリメントおよびデクリメントします。
頂点バッファーの説明の取得
頂点バッファーに関する情報を取得するには、 IDirect3DVertexBuffer9::GetDesc メソッドを 呼び出します。 このメソッドは、頂点バッファーに関する情報を D3DVERTEXBUFFER_DESC 構造体のメンバーに入力します。
関連トピック