次の方法で共有


新しいリソースの種類

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::CreateBufferID3D11Device::CreateTexture2D などの関数を呼び出し、D3D11_BIND_FLAG 列挙体から D3D11_BIND_UNORDERED_ACCESS フラグを渡すことによって、順序指定されていないアクセス バッファーまたはテクスチャを作成します。

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

バッファーの追加と使用

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

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

  • AppendStructuredBuffer
  • ConsumeStructuredBuffer

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

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