Share via


イミディエイト レンダリングと遅延レンダリング

Direct3D 11 では、イミディエイトと遅延の 2 種類のレンダリングがサポートされています。 どちらも ID3D11DeviceContext インターフェイスを使用して実装されます。

イミディエイト レンダリング

イミディエイト レンダリングとは、デバイスからレンダリング API またはコマンドを呼び出すことです。これにより、GPU で実行するためにバッファー内のコマンドがキューに入れられます。 即時コンテキストを使用して、パイプラインの状態のレンダリング、設定、コマンド リストの再生を行います。

D3D11CreateDevice または D3D11CreateDeviceAndSwapChain を使用して、イミディエイト コンテキストを作成します。

遅延レンダリング

遅延レンダリングでは、グラフィックス コマンドをコマンド バッファーに記録して、他のタイミングで再生できるようにします。 遅延コンテキストを使用して、コマンド (レンダリングと状態設定) をコマンド リストに記録します。 遅延レンダリングは、Direct3D 11 の新しい概念です。遅延レンダリングは、追加のスレッドでレンダリングするためのコマンドを記録しながら、1 つのスレッドでのレンダリングをサポートするように設計されています。 この並列マルチスレッド戦略を使用すると、複雑なシーンを同時タスクに分割できます。 複雑なシーンのレンダリングの詳細については、「 マルチパス レンダリング」を参照してください。

ID3D11Device::CreateDeferredContext を使用して遅延コンテキストを作成します。

Direct3D は、コマンド バッファー内のコマンドをキューに入れるとレンダリング オーバーヘッドを生成します。 これに対し、 コマンド リスト は再生中にはるかに効率的に実行されます。 コマンド リストを使用するには、遅延コンテキストでレンダリング コマンドを記録し、イミディエイト コンテキストを使用して再生します。

シングル スレッド形式で生成できるコマンド リストは 1 つだけです。 ただし、個別のスレッドで複数の遅延コンテキストを同時に作成して使用できます。 その後、これらの複数の遅延コンテキストを使用して、複数のコマンド リストを同時に作成できます。

2 つ以上のコマンド リストをイミディエイト コンテキストで同時に再生することはできません。

デバイス コンテキストが即時コンテキストか遅延コンテキストかを判断するには、 ID3D11DeviceContext::GetType を呼び出します。

ID3D11DeviceContext::Map メソッドは、コマンド リスト内の最初の呼び出しがD3D11_MAP_WRITE_DISCARDされる動的リソース (D3D11_USAGE_DYNAMIC) の遅延コンテキストでのみサポートされます。 D3D11_MAP_WRITE_NO_OVERWRITE は、特定の種類のリソースで使用可能な場合、後続の呼び出しでサポートされます。

遅延コンテキストのクエリは、データ生成と述語付き描画に限定されます。 ID3D11DeviceContext::GetData を遅延コンテキストで呼び出して、クエリに関するデータを取得することはできません。GetData は、クエリに関するデータを取得する即時コンテキストでのみ呼び出すことができます。 レンダリング述語 (クエリの種類) を設定するには、 D3D11DeviceContext::SetPredication を呼び出して GPU でクエリ結果を使用します。 ID3D11DeviceContext::Begin と ID3D11DeviceContext::End の呼び出しを通じてクエリ データ生成できます。 ただし、即時コンテキストで ID3D11DeviceContext::ExecuteCommandList を呼び出して遅延コンテキスト コマンド リストを送信するまで、クエリ データは使用できません。 その後、クエリ データは GPU によって処理されます。

マルチスレッド