Platform SDK: DirectX |
頂点バッファ オブジェクトを使うと、頂点データに割り当てられたメモリにアプリケーションが直接アクセスできる。IDirect3DVertexBuffer7::Lock メソッドを呼び出して頂点バッファ メモリへのポインタを取得し、次に必要に応じてメモリにアクセスして新しい頂点データをバッファに設定するか、既に設定されているデータを読み出す。
IDirect3DVertexBuffer7::Lock メソッドは 3 つのパラメータを受け取る。第 1 パラメータの dwFlags は、メモリのロック方法をシステムに知らせる。このパラメータは、バッファ内のデータにアプリケーションがどのようにアクセスするかを知らせるために使用できる (読み取り専用または書き込み専用アクセスを指定できる。これにより、ドライバはメモリをロックして、要求されているアクセス タイプで最高のパフォーマンスを提供する。ヒントは必須ではないが、状況によってはメモリ アクセスのパフォーマンスを改善できる)。頂点バッファは DirectDrawSurface オブジェクトを使用して頂点データを格納するため、IDirect3DVertexBuffer7::Lock が受け取るフラグは IDirectDrawSurface7::Lock メソッドのフラグと同じで、結果も同じである。
Lock メソッドが受け取る第 2 パラメータ lplpData は、LPVOID 変数のアドレスで、呼び出しが成功した場合は、頂点バッファ メモリを指す有効なポインタが設定される。最後のパラメータ lpdwSize は、呼び出しが返された後、lplpData が指すバッファのバイト単位でのサイズが設定される変数のアドレスである。アプリケーションがバッファ サイズの情報を必要としない場合は、lpdwSize に NULL を設定できる。
パフォーマンスに関する注意 : アプリケーションが頂点バッファ メモリからの読み取りのみを行う場合は、DDLOCK_READONLY フラグを使用する。このフラグを含めると、Direct3D が内部手順を最適化するので効率が上がる。ただし、メモリへのアクセスは読み出し専用になる。DDLOCK_READONLY フラグでロックしたメモリに書き込むことは可能であるが、予期せぬ結果になることがある。また、D3DVBCAPS_WRITEONLY フラグで作成した頂点バッファから読み出そうとすると、バッファを読み出し専用にロックした場合でも極端に低速になることがある。
C++ の場合、頂点バッファに割り当てられているメモリに直接アクセスする。このとき、目的のメモリには正しくアクセスするよう注意すること。そうでないと、不正なメモリがレンダリングされるおそれがある。アプリケーションで使用する頂点フォーマットのストライドを利用して、割り当てられているバッファの頂点から次の頂点に移動する。頂点バッファ メモリ自体は、柔軟な頂点フォーマットで指定された頂点の単純な配列である。アプリケーションで従来の頂点構造体の D3DVERTEX、D3DLVERTEX、および D3DTLVERTEX を使用する場合、ストライドは単にバイト単位の構造体のサイズである。従来のフォーマットと異なる頂点フォーマットを使用している場合は、定義した任意の頂点フォーマット構造体のストライドを使用する。頂点バッファの記述に含まれる柔軟な頂点フォーマット フラグを調べることで、実行時に各頂点のストライドを計算できる。次の表は、各頂点成分のサイズを示す。
頂点フォーマット フラグ | サイズ |
---|---|
D3DFVF_DIFFUSE | sizeof(DWORD) |
D3DFVF_NORMAL | sizeof(float) × 3 |
D3DFVF_SPECULAR | sizeof(DWORD) |
D3DFVF_TEXn | sizeof(float) × 2 × n |
D3DFVF_XYZ | sizeof(float) × 3 |
D3DFVF_XYZRHW | sizeof(float) × 4 |
頂点フォーマットに存在するテクスチャ座標の数は、D3DFVF_TEXn フラグで記述される (n は 0 〜 8 までの値)。頂点フォーマットのテクスチャ座標セットは、float 変数 2 個分の空間を占めるため、その数のテクスチャ座標に要求されるメモリを計算するには、テクスチャ座標セットの数にテクスチャ座標 1 セットのサイズを乗ずる。
特定の頂点にアクセスするには、合計頂点ストライドを使用して、メモリ ポインタを必要なだけインクリメントまたはデクリメントする。
頂点バッファを使用すると、Visual Basic アプリケーションでは、頂点バッファ内の頂点データを簡単に更新できる。頂点バッファ内のデータにアクセスするには、Direct3DVertexBuffer7.Lock メソッドを呼び出す。Lock メソッドには、メモリのロック方法をシステムに知らせる flags パラメータがある。flags パラメータは、バッファ内のデータにアプリケーションがどのようにアクセスするかを知らせる。(読み取り専用または書き込み専用アクセスを要求できる。これにより、ドライバはメモリをロックして、要求されているアクセス タイプで最高のパフォーマンスを提供する。ヒントは必須ではないが、状況によってはメモリ アクセスのパフォーマンスを改善できる)。頂点バッファは DirectDrawSurface オブジェクトを使用して頂点データを格納するため、Direct3DVertexBuffer7.Lock が受け取るフラグは、DirectDrawSurface7.Lock メソッドのフラグと同じで、結果も同じである。
パフォーマンスの注意 : アプリケーションが頂点バッファ メモリからの読み取りのみを行う場合は、DDLOCK_READONLY フラグを使用する。このフラグを含めると、Direct3D が内部手順を最適化するので効率が上がる。ただし、メモリへのアクセスは読み出し専用になる。DDLOCK_READONLY フラグでロックしたメモリに書き込むことは可能であるが、予期せぬ結果になることがある。また、D3DVBCAPS_WRITEONLY フラグで作成した頂点バッファから読み出そうとすると、バッファを読み出し専用にロックした場合でも極端に低速になることがある。
頂点バッファをロックすると、Direct3DVertexBuffer7.GetVertices メソッドを呼び出して、頂点バッファの現在の内容を配列に入れることができる。第 1 パラメータには、必要なバッファ内にある最初の頂点の 0 から始まるインデックスを設定し、第 2 パラメータには、取得する頂点の合計数を設定する。最後のパラメータには、呼び出し後に要求されるデータを入れる頂点バッファと同じ頂点フォーマットを使用する配列内の最初の要素を設定しなければならない。
頂点バッファ メモリ自体は、柔軟な頂点フォーマットで指定された頂点の単純な配列である。頂点フォーマットに存在するテクスチャ座標の数は、D3DFVF_TEXn フラグで記述される (n は 0 〜 8 の値)。頂点フォーマットのテクスチャ座標セットは、Single 変数 2 個分の空間を占めるため、その個数のテクスチャ座標で必要なメモリを計算するには、テクスチャ座標セットの個数にテクスチャ座標 1 セット分のサイズを乗ずる。
頂点バッファをロックした後でその内容を変更するには、配列の内容を変更し、次に Direct3DVertexBuffer7.SetVertices メソッドを呼び出して頂点をバッファにコピーする。頂点バッファ処理やレンダリング処理を実行する前に、Direct3DVertexBuffer7.Unlock メソッドで頂点バッファをロック解除する必要もある。