Microsoft DirectX 8.0 (C++)

インデックス バッファの内容へのアクセス

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

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

インデックス データを設定または読み出した後、IDirect3DIndexBuffer8::Unlock メソッドを呼び出す。次のコードに例を示す。

// このサンプル コードでは、IB は LPDIRECT3DINDEXBUFFER8 型の変数であり、
// g_Indices は
// インデックスで正しく初期化されていると仮定している。

// インデックス バッファにデータを格納するには、バッファをロックして
// インデックスへのアクセスを取得する。これは、インデックス バッファがデバイス メモリに存在する
// 可能性があるために必要となるメカニズムである。

VOID* pIndices;

if( FAILED( IB->Lock( 0,                 // バッファの最初からデータを格納する。
                      sizeof(g_Indices), // ロードするデータのサイズ。
                      (BYTE**)&pIndices, // 返されるインデックス データ。
                      0 ) ) )            // デフォルト フラグをロックに送る。
    return E_FAIL;

memcpy( pIndices, g_Indices, sizeof(g_Vertices) );
IB->Unlock();

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

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

C++ では、インデックス バッファに割り当てられているメモリに直接アクセスするので、アプリケーションが目的のメモリに正しくアクセスするよう注意すること。そうでないと、不正なメモリがレンダリングされるおそれがある。アプリケーションで使用するインデックス フォーマットのストライドを利用して、割り当てられているバッファのインデックスから次のインデックスに移動する。