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