Microsoft DirectX 8.0 (C++)

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

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

最後のパラメータ Flags は、メモリのロック方法をシステムに知らせる。このパラメータを使って、バッファ内のデータにアプリケーションがどのようにアクセスするかを示すことができる。アプリケーションが頂点データにアクセスする方法に応じて、Flags パラメータに定数を指定する。これにより、ドライバはメモリをロックして、要求されているアクセス タイプで、最高のパフォーマンスを提供する。アプリケーションが頂点バッファ メモリから読み出しのみを行う場合は、D3DLOCK_READONLY フラグを使用する。このフラグを含めると、Microsoft® Direct3D® が内部手順を最適化するので効率が上がる。ただし、メモリへのアクセスは読み出し専用になる。

頂点データの設定または読み出しが終了したら、IDirect3DVertexBuffer8::Unlock メソッドを呼び出す。次のコードに例を示す。

// このコード例では、g_pVB は LPDIRECT3DVERTEXBUFFER8 型の変数であり、
// g_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 が内部手順を最適化するので効率が上がる。ただし、メモリへのアクセスは読み出し専用になる。

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

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

頂点フォーマット フラグ サイズ
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 つの浮動小数) のサイズを乗ずる。

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