デバイスの種類と頂点処理の要件
デバイスの種類と頂点処理の要件
トランスフォーム & ライティングなどの頂点処理のパフォーマンスは、頂点バッファのメモリ内での位置と、使用されるレンダリング デバイスの種類に大きく依存する。頂点バッファを作成すると、アプリケーションはその頂点バッファへのメモリ割り当てを制御できる。D3DPOOL_SYSTEMMEM メモリ フラグが設定されているときは、システム メモリ内に頂点バッファが作成される。D3DPOOL_DEFAULT メモリ フラグを使うと、頂点バッファ用のメモリの最良の割り当て場所をデバイス ドライバが決定する。このようにして決定されたメモリのことを多くの場合ドライバ最適化メモリと呼ぶ。ドライバ最適化メモリとしては、ローカル ビデオ メモリ、非ローカル ビデオ メモリ、またはシステム メモリが指定される。
D3DUSAGE_SOFTWAREPROCESSING 動作フラグを設定して IDirect3DDevice9::CreateVertexBuffer メソッドを呼び出すと、頂点バッファはソフトウェア頂点処理に使われる。このフラグは、ミックス,モードにおけるソフトウェア頂点処理で必要である。このフラグは、ソフトウェア頂点処理モードでは使えるが、ハードウェア頂点処理モードでは使えない。ソフトウェア頂点処理に使う頂点バッファを次に示す。
- IDirect3DDevice9::ProcessVertices のすべての入力ストリーム。
- ソフトウェア頂点処理における、IDirect3DDevice9::DrawPrimitive および IDirect3DDevice9::DrawIndexedPrimitive のすべての入力ストリーム。
頂点バッファがシステム メモリにあるか、ドライバ最適化メモリにあるかを調べる必要があるのは、テクスチャの場合と同じ理由からである。ハードウェアにおける頂点処理 (トランスフォーム & ライティングなど) に最適なのは、ドライバ最適化メモリに割り当てられた頂点バッファで、ソフトウェアでの頂点処理に最適なのは、システム メモリに割り当てられた頂点バッファである。テクスチャの場合、ハードウェア ラスタ化には、ドライバ最適化メモリに割り当てられたテクスチャが最適で、ソフトウェア ラスタ化には、システム メモリに割り当てられたテクスチャが最適である。
注 Microsoft DirectX® 9.0 の Microsoft® Direct3D® は、プリミティブをレンダリングしないスタンドアロン頂点処理を IDirect3DDevice9::ProcessVertices メソッドでサポートする。このスタンドアロン頂点処理は、常にホスト プロセッサ上のソフトウェアで実行される。このため、IDirect3DDevice9::SetStreamSource で転送元として設定される頂点バッファは、D3DUSAGE_SOFTWAREPROCESSING フラグで作成する必要がある。IDirect3DDevice9::ProcessVertices の機能は、IDirect3DDevice9::DrawPrimitive メソッドおよび IDirect3DDevice9::DrawIndexedPrimitive メソッドがソフトウェア頂点処理において提供する機能と同じである。
アプリケーションが独自の頂点処理を実行する、また、トランスフォーム済みで、ライティングが適用され、クリッピングされた頂点を頂点バッファ レンダリング メソッドに渡す場合、アプリケーションはドライバ最適化メモリに割り当てられた頂点バッファに頂点を直接書き込むことができる。この方法により、以降の冗長なコピー処理を防止する。ただし、ホストから実行するドライバ最適化メモリからの読み取り処理は、非常に処理速度が遅いことがあるため、アプリケーションが頂点バッファからデータを読み返す場合には、この方法はうまく機能しない。したがって、アプリケーションで処理中に読み取り、またはバッファへのデータ書き込みを不規則に実行する必要がある場合は、システム メモリに頂点バッファを割り当てるとよい。
Direct3D 頂点処理機能を使用する場合 (未トランスフォームの頂点を頂点バッファ レンダリング メソッドに渡す場合)、デバイスの種類とデバイス作成フラグに応じて、ハードウェアまたはソフトウェアのいずれかで処理が実行される。最終的にあらゆる場合において最善のパフォーマンスを得られるように、頂点バッファをプール D3DPOOL_DEFAULT に割り当てることを推奨する。デバイスがハードウェア頂点処理を使用する場合は、フラグ D3DUSAGE_DYNAMIC および D3DUSAGE_WRITEONLY に基づいて実行できる追加の最適化機能がいくつかある。これらのフラグの使い方の詳細については、「IDirect3DDevice9::CreateVertexBuffer」を参照すること。