Microsoft DirectX 8.0 (Visual Basic)

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

頂点バッファを使用すると、Microsoft® Visual Basic® アプリケーションでは、頂点バッファ内の頂点データを簡単に更新できる。頂点データのロック、データの設定、ロックの解除には、D3DVertexBuffer8SetData ヘルパー関数を使用する。D3DVertexBuffer8SetData は、5 つのパラメータを受け取る。第 1 パラメータ Vbuffer は、頂点データを格納する Direct3DVertexBuffer8 オブジェクトである。第 2 パラメータ OffsetToLock は、頂点データへのオフセットである。第 3 パラメータは頂点データのサイズをバイト数で示す。

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

D3DVertexBuffer8SetData ヘルパー関数が受け取る最後のパラメータ Data は、頂点バッファにロードされるデータ配列の最初の要素である。このパラメータは Any 型である。このパラメータを正しく使用するためには、Data に配列の最初の要素を指定する必要がある。次のコードに例を示す。

Dim Vertices(3) As CUSTOMVERTEX
Dim VertexSizeInBytes As Long

' 頂点データの長さを指定する。
VertexSizeInBytes = Len(Vertices(0))

' 頂点にデータを設定する。
       .
       .
       .

' このサンプル コードで、g_VB は Direct3DVertexBuffer8 オブジェクトへの
' 有効な参照を格納する変数であると仮定している。

'   VBuffer=g_VB                        データを設定する頂点バッファ。
'   Offset=0                            バッファの最初から設定を開始する。
'   Size=VertSizeInBytes*3              3 つの CUSTOMVERTEX 型をバッファにコピーする。
'   Flags=0                             デフォルト フラグをロック処理に送る。
'   data=Vertices(0)                    このパラメータは Any 型である。これを使用するには、
'                          配列内の先頭要素を送る。


D3DVertexBuffer8SetData g_VB, 0, VertexSizeInBytes * 3, 0, Vertices(0)

頂点バッファ メモリは、柔軟な頂点フォーマットで指定された頂点の単純な配列である。頂点フォーマットに存在するテクスチャ座標の数は、D3DFVF_TEXn フラグで記述される (n は 0 〜 8 までの値)。その数だけあるテクスチャ座標で必要となるメモリを計算するには、テクスチャ座標セットの数にテクスチャ座標 1 セット分 (1 〜 4 つの浮動小数) のサイズを乗ずる。

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

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

頂点バッファの内容のロック、読み出し、ロックの解除を行うには、D3DVertexBuffer8GetData ヘルパー関数を使用する。