リソースの選択 (Direct3D 10)
リソースは、3D パイプラインで使用されるデータのコレクションです。 リソースを作成してその動作を定義することが、アプリケーションをプログラミングするための第一歩になります。 このガイドでは、アプリケーションで必要なリソースの選択に関する基本的なトピックについて説明します。
リソースが必要なパイプライン ステージを特定する
最初の手順では、リソースを使用する パイプライン ステージ (またはステージ) を選択します。 このとき、リソースからデータを読み込むステージだけでなく、リソースにデータを書き込むステージも特定します。 リソースを使用するパイプラインのステージを把握できれば、リソースをステージにバインドするために呼び出す API を決定できます。
次の表は、各パイプラインのステージにバインドすることのできるリソースの種類を示しています。 これには、リソースを入力と出力のどちらとしてバインドできるか、バインド API としてバインドできるかが含まれます。
パイプラインのステージ | /アウトの選択 | リソース | リソースの種類 | バインド API |
---|---|---|---|---|
入力アセンブラー | / | 頂点バッファー | バッファー | IASetVertexBuffers |
入力アセンブラー | / | インデックス バッファー | バッファー | IASetIndexBuffer |
シェーダー ステージ | / | シェーダー リソース ビュー | バッファー、Texture1D、Texture2D、Texture3D | VSSetShaderResources、 GSSetShaderResources、 PSSetShaderResources |
シェーダー ステージ | / | シェーダー定数バッファー | バッファー | VSSetConstantBuffers、 GSSetConstantBuffers、 PSSetConstantBuffers |
ストリーム出力 | アウト | バッファー | バッファー | SOSetTargets |
出力結合 | アウト | レンダー ターゲット ビュー | バッファー、Texture1D、Texture2D、Texture3D | OMSetRenderTargets |
出力結合 | アウト | 深度/ステンシル ビュー | Texture1D、Texture2D | OMSetRenderTargets |
各リソースの使用方法を特定する
アプリケーションが使用するパイプラインのステージ (および各ステージが必要とするリソース) を選択したら、各リソースの使用方法つまりリソースを CPU または GPU からアクセス可能にするかどうかを決定します。
アプリケーションを実行するハードウェアには、最低でも CPU と GPU が 1 つずつあります。 使用量の値を選択するには、次のオプションからリソースに対して読み取りまたは書き込みを行う必要があるプロセッサの種類を検討します ( D3D10_USAGEを参照)。
Resource Usage | 更新の実行 | 更新頻度 |
---|---|---|
Default | GPU | 低頻度 |
動的 | CPU | 高頻度 |
ステージング | GPU | 該当なし |
変更不可 | CPU (リソースの作成時のみ) | 該当なし |
CPU によるリソースの更新が低頻度 (フレームごとに 1 回未満) であると予想される場合は、既定の使用方法を選択します。 パフォーマンス低下を避けるため、既定の使用方法では CPU からリソースに直接書き込まないことが理想的です。
CPU によるリソースの更新が比較的高頻度 (フレームごとに 1 回以上) である場合は、動的の使用方法を選択します。 動的リソースの一般的なシナリオは、動的な頂点バッファーとインデックス バッファーを作成し、ユーザーの視点から見えるジオメトリのデータを使用して、実行時にフレームごとに描画することです。 これらのバッファーは、各フレームでユーザーから見えるジオメトリのみをレンダリングするために使用されます。
ステージングの使用方法は、他のリソースとの間のコピーに使用します。 一般的なシナリオは、既定の使用方法おける (CPU がアクセスできない) リソースのデータをステージングの使用方法における (CPU がアクセス可能な) リソースにコピーすることです。
固定のリソースは、リソース内のデータが決して変更されない場合に使用します。
この問題を別の視点から見ると、アプリケーションがリソースにどのような処理を実行するか考えることになります。
アプリケーションによるリソースの使用方法 | Resource Usage |
---|---|
1 度だけロードし更新しない | 固定または既定 |
アプリケーションが頻繁にリソースに格納する | 動的 |
テクスチャへのレンダリング | Default |
GPU データの CPU アクセス | ステージング |
どの使用法を選択すべきかよくわからない場合は、一般的なほとんどのケースに対応可能な既定の使用方法から始めてください。 シェーダー定数バッファーは、常に既定の使用方法にする必要のあるリソース タイプの 1 つです。
パイプライン ステージへのリソースのバインド
リソースの作成時に指定された制限 (使用フラグ、 バインド フラグ、 CPU アクセス フラグ) が満たされている限り、1 つのリソースを複数のパイプライン ステージに同時にバインドできます。 具体的には、リソースの読み取り部分と書き込み部分の同時発生がない場合には、リソースを入力と出力に同時にバインドすることができます。
リソースをバインドするときは、CPU と GPU がリソースにどのようにアクセスするかを考えます。 多くの場合、単一の用途に設計された (複数の利用フラグ、バインド フラグ、および CPU アクセス フラグを持たない) リソースの方がより高いパフォーマンスを得られます。
たとえば、テクスチャとして複数回使用されるレンダー ターゲットを考えてください。 この場合、リソースを 2 つにする方が速くなる可能性があります (1 つのシェーダー リソースとしてレンダー ターゲットとテクスチャを使用)。 各リソースで使用されるバインド フラグは 1 つだけです (D3D10_BIND_RENDER_TARGET または D3D10_BIND_SHADER_RESOURCE)。 データは、 CopyResource または CopySubresourceRegion を使用して、レンダー ターゲット テクスチャからシェーダー テクスチャ にコピーされます。 これにより、シェーダー テクスチャの読み取りからレンダー ターゲットの書き込みを分離することで、パフォーマンスが向上する可能性があります。 もちろん、確実に行う唯一の方法は、両方のアプローチを実装し、特定のアプリケーションのパフォーマンスの違いを測定することです。
関連トピック