デバイスの種類と頂点処理の要件 (Direct3D 9)
変換や照明を含む頂点処理操作のパフォーマンスは、頂点バッファーがメモリ内のどこに存在し、どの種類のレンダリング デバイスが使用されているかによって大きく異なります。 アプリケーションは、頂点バッファーの作成時にメモリ割り当てを制御します。 D3DPOOL_SYSTEMMEM メモリ フラグが設定されると、頂点バッファーがシステム メモリに作成されます。 D3DPOOL_DEFAULTメモリ フラグを使用すると、デバイス ドライバーは、頂点バッファーのメモリが最適に割り当てられる場所 (ドライバー最適メモリと呼ばれることがよくあります) を決定します。 ドライバーに最適なメモリは、ローカル ビデオ メモリ、非ローカル ビデオ メモリ、またはシステム メモリです。
IDirect3DDevice9::CreateVertexBuffer を使用してD3DUSAGE_SOFTWAREPROCESSING定数を設定すると、頂点バッファー データに対するソフトウェア頂点処理が可能になります。 このフラグは、混合モード中のソフトウェア頂点処理に必要です。 このフラグは、ハードウェア頂点処理モードでは使用できません。 ソフトウェア頂点処理で使用される頂点バッファーには、次のようなものがあります。
- IDirect3DDevice9::P rocessVertices のすべての入力ストリーム。
- IDirect3DDevice9::D rawPrimitive および IDirect3DDevice9::D rawIndexedPrimitive のすべての入力ストリーム。
頂点バッファーのメモリ位置 (システムまたはドライバーの最適) を決定するために使用する理由は、テクスチャの場合と同じです。 ハードウェアでの頂点処理 (変換や照明を含む) は、ドライバーに最適なメモリに頂点バッファーが割り当てられると最適に機能しますが、ソフトウェア頂点処理はシステム メモリに割り当てられた頂点バッファーで最適に機能します。 テクスチャの場合、ハードウェアラスタライズは、テクスチャがドライバーに最適なメモリに割り当てられるときに最適に機能しますが、ソフトウェアラスタライズはシステムメモリテクスチャで最適に動作します。
Microsoft Direct3D 9 では、 IDirect3DDevice9::P rocessVertices メソッドを使用してプリミティブをレンダリングすることなく、頂点のスタンドアロン処理がサポートされています。 このスタンドアロン頂点処理は、常にホスト プロセッサ上のソフトウェアで実行されます。 このため、 IDirect3DDevice9::SetStreamSource で設定されたソースとして使用される頂点バッファーは、D3DUSAGE_SOFTWAREPROCESSING フラグを使用して作成する必要があります。 IDirect3DDevice9::P rocessVertices によって提供される機能は、ソフトウェア頂点処理の使用中に IDirect3DDevice9::D rawPrimitive メソッドおよび IDirect3DDevice9::D rawIndexedPrimitive メソッドと同じです。
アプリケーションが独自の頂点処理を実行し、変換、点灯、およびクリップされた頂点をレンダリング メソッドに渡す場合、アプリケーションはドライバーに最適なメモリに割り当てられた頂点バッファーに頂点を直接書き込むことができます。 この手法を使うと、後で冗長コピー操作を実行できなくなります。 ドライバーに最適なメモリからホストによって実行される読み取り操作は非常に遅くなる可能性があるため、アプリケーションが頂点バッファーからデータを読み取り戻すと、この手法はうまく機能しないことに注意してください。 そのため、処理中にアプリケーションでデータを読み取る必要がある場合や、バッファーに誤ってデータを書き込む必要がある場合は、システム メモリ頂点バッファーを使用することをお勧めします。
Direct3D 頂点処理機能を使用する場合 (変換されていない頂点を頂点バッファー レンダリング メソッドに渡すことによって)、デバイスの種類とデバイス作成フラグに応じて、ハードウェアまたはソフトウェアのいずれかで処理が行われる可能性があります。 事実上すべてのケースで最適なパフォーマンスを得るには、プールD3DPOOL_DEFAULTに頂点バッファーを割り当てることをお勧めします。 デバイスがハードウェア頂点処理を使用している場合は、フラグのD3DUSAGE_DYNAMICとD3DUSAGE_WRITEONLYに基づいて、いくつかの追加の最適化が実行される可能性があります。 これらのフラグの使用の詳細については、「IDirect3DDevice9::CreateVertexBuffer」を参照してください。
関連トピック