リソースの選択Choosing a resource

リソースは、3D パイプラインで使用されるデータのコレクションです。A resource is a collection of data that is used by the 3D pipeline. リソースを作成してその動作を定義することが、アプリケーションをプログラミングするための第一歩になります。Creating resources and defining their behavior is the first step toward programming your application. このガイドでは、アプリケーションで必要なリソースの選択に関する基本的なトピックについて説明します。This guide covers basic topics for choosing the resources required by your application.

リソースを必要があるパイプライン ステージを識別します。Identify pipeline stages that need resources

最初の手順は、リソースを使用するグラフィックス パイプラインのステージの選択です。The first step is to choose the graphics pipeline stage (or stages) that will use a resource. このとき、リソースからデータを読み込むステージだけでなく、リソースにデータを書き込むステージも特定します。That is, identify each stage that will read data from a resource as well as the stages that will write data out to a resource. リソースを使用するパイプラインのステージを把握できれば、リソースをステージにバインドするために呼び出す API を決定できます。Knowing the pipeline stages where the resources will be used determines the APIs that will be called to bind the resource to the stage.

次の表は、各パイプラインのステージにバインドすることのできるリソースの種類を示しています。This table lists the types of resources that can be bound to each pipeline stage. リソースを入力または出力としてバインドできるかどうかを示しています。It includes whether the resource can be bound as an input or an output.

パイプラインのステージPipeline Stage 入力/出力In/Out リソースResource リソースの種類Resource Type
入力アセンブラーInput Assembler 入力In 頂点バッファーVertex Buffer バッファーBuffer
入力アセンブラーInput Assembler 入力In インデックス バッファーIndex Buffer バッファーBuffer
シェーダー ステージShader Stages 入力In シェーダー リソース ビューShader-ResourceView バッファー、Texture1D、Texture2D、Texture3DBuffer, Texture1D, Texture2D, Texture3D
シェーダー ステージShader Stages 入力In シェーダー定数バッファーShader-Constant Buffer バッファーBuffer
ストリーム出力Stream Output Out バッファーBuffer バッファーBuffer
出力結合Output Merger Out レンダー ターゲット ビューRender-target View バッファー、Texture1D、Texture2D、Texture3DBuffer, Texture1D, Texture2D, Texture3D
出力結合Output Merger Out 深度/ステンシル ビューDepth/Stencil View Texture1D、Texture2DTexture1D, Texture2D

 

各リソースの使用方法の識別します。Identify how each resource will be used

アプリケーションが使用するパイプラインのステージ (および各ステージが必要とするリソース) を選択したら、各リソースの使用方法つまりリソースを CPU または GPU からアクセス可能にするかどうかを決定します。Once you have chosen the pipeline stages that your application will use (and therefore the resources that each stage will require), the next step is to determine how each resource will be used, that is, whether a resource can be accessed by the CPU or the GPU.

アプリケーションを実行するハードウェアには、最低でも CPU と GPU が 1 つずつあります。The hardware that your application is running on will have a minimum of at least one CPU and one GPU. 使用方法の値を選ぶ際には、リソースの読み取りまたは書き込みに必要なプロセッサの種類が次の選択肢のいずれになるかを検討します。To pick a usage value, consider which type of processor needs to read or write to the resource from the following options.

リソースの使用方法Resource Usage 更新の実行Can be updated by 更新頻度Frequency of Update
DefaultDefault GPUGPU 低頻度infrequently
動的Dynamic CPUCPU 高頻度frequently
ステージングStaging GPUGPU なしn/a
固定Immutable CPU (リソースの作成時のみ)CPU (only at resource creation time) なしn/a

 

CPU によるリソースの更新が低頻度 (フレームごとに 1 回未満) であると予想される場合は、既定の使用方法を選択します。Default usage should be used for a resource that is expected to be updated by the CPU infrequently (less than once per frame). パフォーマンス低下を避けるため、既定の使用方法では CPU からリソースに直接書き込まないことが理想的です。Ideally, the CPU would never write directly to a resource with default usage so as to avoid potential performance penalties.

CPU によるリソースの更新が比較的高頻度 (フレームごとに 1 回以上) である場合は、動的の使用方法を選択します。Dynamic usage should be used for a resource that the CPU updates relatively frequently (once or more per frame). 動的リソースの一般的なシナリオは、動的な頂点バッファーとインデックス バッファーを作成し、ユーザーの視点から見えるジオメトリのデータを使用して、実行時にフレームごとに描画することです。A typical scenario for a dynamic resource would be to create dynamic vertex and index buffers that would be filled at runtime with data about the geometry visible from the point of view of the user for each frame. これらのバッファーは、各フレームでユーザーから見えるジオメトリのみをレンダリングするために使用されます。These buffers would be used to render only the geometry visible to the user for that frame.

ステージングの使用方法は、他のリソースとの間のコピーに使用します。Staging usage should be used to copy data to and from other resources. 一般的なシナリオは、既定の使用方法おける (CPU がアクセスできない) リソースのデータをステージングの使用方法における (CPU がアクセス可能な) リソースにコピーすることです。A typical scenario would be to copy data in a resource with default usage (which the CPU cannot access) to a resource with staging usage (which the CPU can access).

固定のリソースは、リソース内のデータが決して変更されない場合に使用します。Immutable resources should be used when the data in the resource will never change.

この問題を別の視点から見ると、アプリケーションがリソースにどのような処理を実行するか考えることになります。Another way of looking at the same idea is to think of what an application does with a resource.

アプリケーションによるリソースの使用方法How Application uses the Resource リソースの使用方法Resource Usage
1 度だけロードし更新しないLoad once and never update 固定または既定Immutable or Default
アプリケーションが頻繁にリソースに格納するApplication fills resource repeatedly 動的Dynamic
テクスチャへのレンダリングRender to texture DefaultDefault
GPU データの CPU アクセスCPU access of GPU data ステージングStaging

 

どの使用法を選択すべきかよくわからない場合は、一般的なほとんどのケースに対応可能な既定の使用方法から始めてください。If you are unsure what usage to choose, start with the default usage as it is expected to be the most common case. シェーダー定数バッファーは、常に既定の使用方法にする必要のあるリソース タイプの 1 つです。A Shader-Constant buffer is the one resource type that should always have default usage.

パイプライン ステージへのリソースのバインドBinding resources to pipeline stages

リソースは、作成時に指定された制限を満たす限り、同時に複数のパイプラインのステージにバインドすることができます。A resource can be bound to more than one pipeline stage at the same time as long as the restrictions specified when the resource was created are met. これらの制限は、利用フラグ、バインド フラグ、CPU アクセス フラグとして指定されます。These restrictions are specified as usage flags, bind flags, or cpu access flags. 具体的には、リソースの読み取り部分と書き込み部分の同時発生がない場合には、リソースを入力と出力に同時にバインドすることができます。More specifically, a resource can be bound as an input and an output simultaneously as long as reading and writing part of a resource cannot happen at the same time.

リソースをバインドするときは、CPU と GPU がリソースにどのようにアクセスするかを考えます。When binding a resource, think about how the GPU and the CPU will access the resource. 多くの場合、単一の用途に設計された (複数の利用フラグ、バインド フラグ、および CPU アクセス フラグを持たない) リソースの方がより高いパフォーマンスを得られます。Resources that are designed for a single purpose (do not use multiple usage, bind, and cpu access flags) will more than likely result in better performance.

たとえば、テクスチャとして複数回使用されるレンダー ターゲットを考えてください。For example, consider the case of a render target used as a texture multiple times. この場合、リソースを 2 つにする方が速くなる可能性があります (1 つのシェーダー リソースとしてレンダー ターゲットとテクスチャを使用)。It may be faster to have two resources: a render target and a texture used as a shader resource. 各リソースは、バインド フラグを 1 つだけ使用して、「レンダー ターゲット」または「シェーダー リソース」を示します。Each resource would use only one bind flag, indicating "render target" or "shader resource". データはレンダー ターゲット テクスチャからシェーダー テクスチャにコピーされます。The data would be copied from the render-target texture to the shader texture.

この例のように、シェーダー テクスチャの読み取りとレンダー ターゲットの書き込みを分離することで、パフォーマンスが向上する場合があります。This technique in this example may improve performance by isolating the render-target write from the shader-texture read. 実際にどうなるかを確かめるには、アプリケーションに両方の方法を実装して、パフォーマンスの違いを測定する必要があります。The only way to be sure is to implement both approaches and measure the performance difference in your particular application.

関連トピックRelated topics

リソースResources