新しいリソースの種類

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;

構造化バッファーにアクセスするには、次のオブジェクト型を使用します。

連結された操作を実装するアトミック関数は、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 フラグを渡すことで、順序なしアクセス バッファーまたはテクスチャを作成します。

順序なしアクセス リソースは、ピクセル シェーダーとコンピューティング シェーダーにのみバインドできます。 実行中、並列で実行されるピクセル シェーダーまたはコンピューティング シェーダーには、同じ順序なしのアクセス リソースがバインドされます。

バッファーの追加と使用

追加バッファーと消費バッファーは、スタックの動作と同様に、バッファーの末尾からの値の追加と削除をサポートする、順序なしのリソースの特殊な種類です。

追加バッファーと消費バッファーは、構造化バッファーである必要があります。

これらのリソースはメソッドを使用して使用します。これらのリソースではリソース変数は使用されません。

コンピューティング シェーダーの概要