新しいリソースの種類
Direct3D 11 では、いくつかの新しいリソースの種類が追加されました。
読み取り/書き込みバッファーとテクスチャ
シェーダー モデル 4 のリソースは読み取り専用です。 シェーダー モデル 5 では、新しい対応する読み取り/書き込みリソースのセットが実装されています。
これらのリソースには、メモリに直接アクセスする方法がないため、(インデックス作成を介して) メモリにアクセスするためにリソース変数が必要です。 リソース変数は、数式の左右の辺で使用できます。右側で使用する場合、テンプレートの型は 1 つのコンポーネント (float、int、または uint) である必要があります。
構造化バッファー
構造化バッファーは、同じサイズの要素を含むバッファーです。 1 つ以上のメンバー型を持つ構造体を使用して、要素を定義します。 3 つのメンバーを持つ構造を次に示します。
struct MyStruct
{
float4 Color;
float4 Normal;
bool isAwesome;
};
次のような構造化バッファーを宣言するには、次の構造体を使用します。
StructuredBuffer<MyStruct> mySB;
構造化バッファーは、インデックス作成に加えて、次のような 1 つのメンバーへのアクセスをサポートします。
float4 myColor = mySb[27].Color;
構造化バッファーにアクセスするには、次のオブジェクト型を使用します。
- StructuredBuffer は、読み取り専用の構造化バッファーです。
- RWStructuredBuffer は、読み取り/書き込み構造化バッファーです。
連結された操作を実装するアトミック関数は、RWStructuredBuffer 内の int 要素と uint 要素で許可されます。
バイト アドレス バッファー
バイト アドレス バッファーは、その内容がバイト オフセットによってアドレス指定可能なバッファーです。 通常、 バッファー の内容は、各要素 (S) のストライドと、S*N によって指定された要素番号 (N) を使用して、要素ごとにインデックスが作成されます。 バイト アドレス バッファー (生バッファーとも呼ばれます) は、バッファーの先頭からのバイト値オフセットを使用してデータにアクセスします。 バイト値は、DWORD で配置されるように、4 の倍数である必要があります。 他の値が指定されている場合、動作は未定義です。
シェーダー モデル 5 では、読み取り専用バイト アドレス バッファーと読み取り/書き込みバイト アドレス バッファーにアクセスするためのオブジェクトが導入されています。 バイト アドレス バッファーの内容は、32 ビット符号なし整数として設計されています。バッファー内の値が実際には符号なし整数でない場合は、 asfloat などの関数を使用して読み取ります。
順序なしアクセス バッファーまたはテクスチャ
順序なしアクセス リソース (マルチサンプリングを使用しないバッファー、テクスチャ、テクスチャ配列を含む) を使用すると、複数のスレッドから一時的に順序付けされていない読み取り/書き込みアクセスが可能になります。 つまり、このリソースの種類は、 Atomic Functions を使用してメモリの競合を生成することなく、複数のスレッドで同時に読み取り/書き込みを行うことができます。
ID3D11Device::CreateBuffer や ID3D11Device::CreateTexture2D などの関数を呼び出し、D3D11_BIND_FLAG列挙体から D3D11_BIND_UNORDERED_ACCESS フラグを渡すことで、順序なしアクセス バッファーまたはテクスチャを作成します。
順序なしアクセス リソースは、ピクセル シェーダーとコンピューティング シェーダーにのみバインドできます。 実行中、並列で実行されるピクセル シェーダーまたはコンピューティング シェーダーには、同じ順序なしのアクセス リソースがバインドされます。
バッファーの追加と使用
追加バッファーと消費バッファーは、スタックの動作と同様に、バッファーの末尾からの値の追加と削除をサポートする、順序なしのリソースの特殊な種類です。
追加バッファーと消費バッファーは、構造化バッファーである必要があります。
これらのリソースはメソッドを使用して使用します。これらのリソースではリソース変数は使用されません。
関連トピック