Platform SDK: DirectX |
オプションで、ライティング、クリップ フラグの生成、および範囲の更新などの頂点操作も適用できる。IDirect3DVertexBuffer7 インターフェイスは、頂点処理用の IDirect3DVertexBuffer7::ProcessVertices メソッドを公開する。転送元バッファではなく転送先頂点バッファの ProcessVertices メソッドを呼び出して、頂点を転送元頂点バッファから転送先頂点バッファに処理する。このメソッドが受け取る 7 つのパラメータには、実行する操作、転送元頂点バッファの IDirect3DVertexBuffer7 インターフェイスの位置座標、頂点操作を行うレンダリング デバイス、およびメソッドのターゲットとなる頂点の位置座標と数を記述する。呼び出しの後、転送先バッファには処理された頂点データが設定されるが、転送元バッファは変化しない。
頂点の処理を準備するときは、第 1 パラメータ dwVertexOp に行いたい頂点操作を設定する。D3DVOP_TRANSFORM フラグは必ず含めなければならず、含めないとメソッドは失敗する。残りの操作はオプションである。頂点の処理に、頂点のライティング、クリップ フラグの生成、範囲の更新など、オプションのフラグはどのような組み合わせでも含めることができる。
第 2 パラメータ dwDestIndex と第 3 パラメータ dwCount は、頂点が置かれる転送先バッファのインデックスと、処理されて転送先バッファ内に置かれる頂点の合計数を表わす。第 4 パラメータ lpSrcBuffer には、転送される頂点を含む頂点バッファ オブジェクトの IDirect3DVertexBuffer7 のアドレスを設定する。dwSrcIndex は、メソッドが頂点処理を開始する位置座標を示すインデックスを指定する (処理の対象となる転送元の頂点の合計数は dwCount パラメータで指定される)。lpD3DDevice パラメータには、頂点を処理するレンダリング デバイスの IDirect3DDevice7 インターフェイスのアドレスを設定する。
最後のパラメータ dwFlags は、メソッドの特殊処理オプションを指定する。このパラメータを 0 に設定すると、デフォルトの頂点処理が実行され、D3DPV_DONOTCOPYDATA を設定すると、何らかの状況において処理が最適化される。dwFlags を 0 に設定すると、転送元頂点バッファの頂点フォーマットの頂点成分は、頂点処理の影響を受けずに転送元頂点バッファからコピーされるか (転送元バッファにある場合)、0 に設定される。ただし、D3DPV_DONOTCOPYDATA を使用することにより、転送元バッファの頂点フォーマットの頂点成分は、ProcessVertices の呼び出しの一部として計算されずにそのまま残る。ProcessVertices メソッドを呼び出して、ライトを当てていない頂点をトランスフォーム (このメソッドの D3DVOP_TRANSFORM 頂点処理を利用) する場合を考えてみる。転送先頂点バッファで D3DFVF_TLVERTEX 頂点フォーマットを使用している場合、D3DPV_DONOTCOPYDATA フラグを指定すると、転送先バッファのディフューズ、スペキュラ、およびテクスチャ座標コンポーネントは無視される。その結果、システムには頂点のトランスフォームのみ要求することになり、処理とデータ転送のオーバーヘッドが軽くなる。D3DPV_DONOTCOPYDATA を指定していない場合は、アプリケーションで不必要であるにもかかわらず、ライティングおよびテクスチャ座標コンポーネントが転送先バッファにコピーされる。D3DPV_DONOTCOPYDATA フラグは、頂点処理の際にシステムで必要となる作業量を軽減するのに有効なフラグである。ProcessVertices を使用するアプリケーションでは、スタティック頂点成分を転送先頂点バッファに直接コピーできるため、システム側で転送元バッファから転送先バッファにコピーする必要はなくなる。
デバイスでの頂点処理の制限を調べるには、サポートされている頂点処理能力について、D3DDEVICEDESC7 構造体の dwVertexProcessingCaps メンバを問い合わせる。
オプションで、ライティング、クリップ フラグの生成、および範囲の更新などの頂点操作も適用できる。Direct3DVertexBuffer7 クラスには、頂点を処理する Direct3DVertexBuffer7.ProcessVertices メソッドがある。転送元バッファではなく転送先頂点バッファの ProcessVertices メソッドを呼び出して、頂点を転送元頂点バッファから転送先頂点バッファに処理する。このメソッドには 7 つのパラメータがあり、実行する操作、転送元 Direct3DVertexBuffer7 オブジェクトへの参照、頂点処理を実行するレンダリング デバイス、およびメソッドの対象となる頂点の位置座標と個数をそれぞれ記述する。呼び出しの後、転送先バッファには処理された頂点データが設定されるが、転送元バッファは変化しない。
頂点の処理をするときは、第 1 パラメータ vertexOp に実行する頂点処理を設定する。D3DVOP_TRANSFORM フラグは必ず含めなければならず、含めないとメソッドは失敗する。残りの操作はオプションである。頂点の処理に、頂点のライティング、クリップ フラグの生成、範囲の更新など、オプションのフラグはどのような組み合わせでも含めることができる。
第 2 パラメータ destIndex および第 3 パラメータ count は、頂点が配置される転送先バッファのインデックス、および処理されて転送先バッファに配置される頂点の合計数をそれぞれ表わす。第 4 パラメータ srcBuffer には、転送される頂点を含む Direct3DVertexBuffer7 オブジェクトを設定する必要がある。srcIndex は、メソッドが頂点処理を開始する位置座標を示すインデックスを指定する (処理の対象となる転送元の頂点の合計数は count パラメータで指定される)。dev パラメータには、頂点を処理する Direct3DDevice7 オブジェクトを設定する。
最後のパラメータ flags は、メソッドの特殊処理オプションを指定する。このパラメータを 0 に設定すると、デフォルトの頂点処理が実行され、D3DPV_DONOTCOPYDATA を設定すると、何らかの状況において処理が最適化される。flags を 0 に設定すると、転送元頂点バッファの頂点フォーマットの頂点成分は、頂点処理の影響を受けずに転送元頂点バッファからコピーされるか (転送元バッファにある場合)、0 に設定される。ただし、D3DPV_DONOTCOPYDATA を使用することにより、転送元バッファの頂点フォーマットの頂点成分は、ProcessVertices の呼び出しの一部として計算されずにそのまま残る。ProcessVertices メソッドを呼び出して、ライトを当てていない頂点をトランスフォーム (このメソッドの D3DVOP_TRANSFORM 頂点処理を利用) する場合を考えてみる。転送先頂点バッファで D3DFVF_TLVERTEX 頂点フォーマットを使用している場合、D3DPV_DONOTCOPYDATA フラグを指定すると、転送先バッファのディフューズ、スペキュラ、およびテクスチャ座標コンポーネントは無視される。その結果、システムに頂点のトランスフォームのみ要求することになり、処理とデータ転送のオーバーヘッドが軽くなる。D3DPV_DONOTCOPYDATA を指定していない場合は、アプリケーションで不必要であるにもかかわらず、ライティングおよびテクスチャ座標コンポーネントが転送先バッファにコピーされる。D3DPV_DONOTCOPYDATA フラグは、頂点処理の際にシステムで必要となる作業量を軽減するのに有効なフラグである。ProcessVertices を使用するアプリケーションでは、スタティック頂点成分を転送先頂点バッファに直接コピーできるため、システム側で転送元バッファから転送先バッファにコピーする必要はなくなる。
デバイスでの頂点処理の制限を調べるには、サポートされている頂点処理能力について、D3DDEVICEDESC7 型の lVertexProcessingCaps メンバを問い合わせる。
互換性のある頂点フォーマットを使用した頂点バッファを作成するように注意すること。少なくとも、転送元バッファは未トランスフォームの頂点を含み (バッファ記述の頂点フォーマットに D3DFVF_XYZ フラグを使用)、転送先バッファはトランスフォームされた頂点を含むものとする (D3DFVF_XYZRHW フラグを使用)。ライティングまたはクリッピング サービスのために、転送元と転送先の頂点フォーマットは適切なフィールドを含むことが要求される。たとえば、頂点フォーマットに頂点法線を含めていない場合は、頂点のライティングを要求しないこと。同様に、クリッピング機能なしで作成された転送先頂点バッファに、システムがクリップ フラグを生成するよう要求することはできない。互換性のないバッファで操作を行おうとすると、デバッグ ビルドの場合、失敗する。
アプリケーションで頂点バッファからレンダリングを実行する場合は、頂点バッファ メソッドを使用する必要がある。
転送元または転送先の頂点バッファがロックされているときは、頂点を処理することはできない。