リソースは、3D パイプラインによって使用されるデータのコレクションです。 リソースを作成し、その動作を定義することは、アプリケーションをプログラミングするための最初のステップです。 このガイドでは、アプリケーションに必要なリソースを選択するための基本的なトピックについて説明します。
リソースを必要とするパイプライン ステージを特定する
最初の手順では、リソースを使用する グラフィックス パイプライン ステージ (またはステージ) を選択します。 つまり、リソースからデータを読み取る各ステージと、リソースにデータを書き込むステージを特定します。 リソースが使用されるパイプライン ステージを知ることで、リソースをステージにバインドするために呼び出される API が決まります。
次の表に、各パイプライン ステージにバインドできるリソースの種類を示します。 これには、リソースを入力または出力としてバインドできるかどうかが含まれます。
パイプライン ステージ | イン/アウト | リソース | リソースの種類 |
---|---|---|---|
入力アセンブラー | で | 頂点バッファー | バッファ |
入力アセンブラー | で | インデックス バッファー | バッファ |
シェーダー ステージ | で | Shader-ResourceView | Buffer、Texture1D、Texture2D、Texture3D |
シェーダー ステージ | で | Shader-Constant バッファー | バッファ |
ストリーム出力 | アウト | バッファ | バッファ |
出力合成 | アウト | レンダーターゲットビュー | Buffer、Texture1D、Texture2D、Texture3D |
出力合成 | アウト | 深度/ステンシル ビュー | Texture1D、Texture2D |
各リソースの使用方法を特定する
アプリケーションで使用するパイプライン ステージ (したがって、各ステージで必要なリソース) を選択したら、次の手順は、各リソースがどのように使用されるか、つまり、リソースに CPU と GPU のどちらをアクセスできるかを決定することです。
アプリケーションが実行されているハードウェアには、少なくとも 1 つの CPU と 1 つの GPU があります。 使用状況の値を選択するには、次のオプションからリソースに対して読み取りまたは書き込みを行う必要があるプロセッサの種類を検討します。
リソースの使用状況 | で更新できます。 | 更新の頻度 |
---|---|---|
既定値 | GPU(グラフィック・プロセッシング・ユニット) | 稀に |
動的 | CPU (中央処理装置) | よく |
ステージング | GPU(グラフィック・プロセッシング・ユニット) | n/a |
不変 | CPU (リソース作成時のみ) | n/a |
CPU によって更新頻度が低い (フレームあたり 1 回未満) ことが予想されるリソースには、既定の使用量を使用する必要があります。 パフォーマンスの低下を避けるために、CPU が既定の使用用途を持つリソースに直接書き込まないのが理想的です。
動的使用は、CPU が比較的頻繁に更新されるリソース (フレームあたり 1 回以上) に使用する必要があります。 動的リソースの一般的なシナリオは、実行時に各フレームのユーザーの視点から見えるジオメトリに関するデータを格納する動的頂点バッファーとインデックス バッファーを作成することです。 これらのバッファーは、そのフレームのユーザーに表示されるジオメトリのみをレンダリングするために使用されます。
ステージングの使用は、他のリソースとの間でデータをコピーするために使用する必要があります。 一般的なシナリオは、(CPU がアクセスできない) 既定の使用量のリソース内のデータを、ステージング使用率 (CPU がアクセスできる) リソースにコピーすることです。
変更できないリソースは、リソース内のデータが変更されない場合に使用する必要があります。
同じアイデアを見るもう 1 つの方法は、アプリケーションがリソースで何を行うかを考える方法です。
アプリケーションでリソースを使用する方法 | リソースの使用状況 |
---|---|
1 回読み込んで更新しない | 不変または既定 |
アプリケーションがリソースを繰り返し消費する | 動的 |
テクスチャにレンダリングする | 既定値 |
GPU データの CPU アクセス | ステージング |
選択する使用法がわからない場合は、最も一般的なケースと予想される既定の使用方法から始めます。 Shader-Constant バッファーは、常に既定の使用を持つ必要がある 1 つのリソースの種類です。
パイプライン ステージにリソースをバインドする
リソースの作成時に指定された制限が満たされている限り、1 つのリソースを複数のパイプライン ステージに同時にバインドできます。 これらの制限は、使用フラグ、バインド フラグ、または CPU アクセス フラグとして指定されます。 具体的には、リソースの一部の読み取りと書き込みを同時に行うことができない限り、リソースを入力と出力として同時にバインドできます。
リソースをバインドするときは、GPU と CPU がリソースにアクセスする方法について考えます。 1 つの目的で設計されたリソース (複数の使用量、バインド、CPU アクセス フラグを使用しない) は、パフォーマンスが向上する可能性が高くなります。
たとえば、テクスチャとして複数回使用されるレンダー ターゲットの場合を考えてみます。 レンダー ターゲットとテクスチャの 2 つのリソースをシェーダー リソースとして使用する方が高速な場合があります。 各リソースでは、"レンダー ターゲット" または "シェーダー リソース" を示すバインド フラグが 1 つだけ使用されます。 データはレンダー ターゲット テクスチャからシェーダー テクスチャにコピーされます。
この例のこの手法では、シェーダー テクスチャの読み取りからレンダー ターゲットの書き込みを分離することで、パフォーマンスが向上する可能性があります。 確実に行う唯一の方法は、両方のアプローチを実装し、特定のアプリケーションのパフォーマンスの違いを測定することです。
関連トピック