次の方法で共有


頂点バッファの内容へのアクセス

頂点バッファの内容へのアクセス

頂点バッファ オブジェクトを使うと、頂点データに割り当てられたメモリにアプリケーションが直接アクセスできる。IDirect3DVertexBuffer9::Lock メソッドを呼び出して頂点バッファ メモリへのポインタを取得し、次に必要に応じてメモリにアクセスして新しい頂点データをバッファに設定するか、既に設定されているデータを読み出す。IDirect3DVertexBuffer9::Lock メソッドは 4 つの引数を受け取る。第 1 引数 OffsetToLock は、頂点データへのオフセットである。第 2 引数は頂点データのサイズをバイト単位で指定する。IDirect3DVertexBuffer9::Lock メソッドが受け取る第 3 引数 ppbData は、呼び出しが成功した場合に、頂点データをポイントする BYTE ポインタのアドレスである。

最後の引数 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.

// To fill the vertex buffer, you need to lock the buffer to
//   gain access to the vertices.This mechanism is required  
//   because vertex buffers may be in device memory.
VOID* pVertices;

if( FAILED( g_pVB->Lock( 0,                  // Fill from the start of 
                                             //   the buffer.
                         sizeof(g_Vertices), // Size of the data to 
                                             //   load.
                         (BYTE**)&pVertices;, // Returned vertex data.
                         0 ) ) )             // Send default flags to 
                                             //   the lock.
    return E_FAIL;

memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );
g_pVB->Unlock();

  D3DUSAGE_WRITEONLY フラグで頂点バッファを作成した場合、D3DLOCK_READONLY ロッキング フラグは使えない。アプリケーションが頂点バッファ メモリから読み出しのみを行う場合は、D3DLOCK_READONLY フラグを使う。アプリケーションが頂点バッファ メモリから読み出しのみを行う場合は、D3DLOCK_READONLY フラグを使う。このフラグを含めると、Microsoft® Direct3D® が内部手順を最適化するので効率が上がる。ただし、メモリへのアクセスは読み出し専用になる。

D3DLOCK_DISCARD または D3DLOCK_NOOVERWRITE を IDirect3DVertexBuffer9::Lock メソッドの Flags パラメータで使用する方法については、「動的な頂点バッファとインデックス バッファの使い方」を参照すること。

C++ では、頂点バッファに割り当てられているメモリに直接アクセスするので、アプリケーションが目的のメモリに正しくアクセスするよう注意すること。そうでないと、不正なメモリがレンダリングされるおそれがある。アプリケーションで使用する頂点フォーマットのストライドを利用して、割り当てられているバッファの頂点から次の頂点に移動する。頂点バッファ メモリは、柔軟な頂点フォーマットで指定された頂点の単純な配列である。定義する任意の頂点フォーマット構造体のストライドを使用する。頂点バッファの記述に含まれる D3DFVF を調べることで、実行時に各頂点のストライドを計算できる。次の表は、各頂点の成分のサイズを示している。

頂点フォーマット フラグ サイズ
D3DFVF_DIFFUSE sizeof(DWORD)
D3DFVF_NORMAL sizeof(float) × 3
D3DFVF_SPECULAR sizeof(DWORD)
D3DFVF_TEXn sizeof(float) × n × t
D3DFVF_XYZ sizeof(float) × 3
D3DFVF_XYZRHW sizeof(float) × 4

頂点フォーマットに存在するテクスチャ座標の数は、D3DFVF_TEXn フラグで記述される (n は 0 ~ 8 の値)。その数だけあるテクスチャ座標で必要となるメモリを計算するには、テクスチャ座標セットの数にテクスチャ座標 1 セット分 (1 ~ 4 つの浮動小数) のサイズをかける。

特定の頂点にアクセスするには、合計頂点ストライドを使用して、メモリ ポインタを必要なだけインクリメントまたはデクリメントする。

頂点バッファの記述の取得

IDirect3DVertexBuffer9::GetDesc メソッドを呼び出して、頂点バッファに関する情報を取得できる。このメソッドは、頂点バッファに関する情報を D3DVERTEXBUFFER_DESC 構造体のメンバに格納する。