新しいリソースのタイプ

Direct3D 11 には、いくつかの新しいリソース タイプが追加されました。

  • 読み取り/書き込みバッファーおよび読み取り/書き込みテクスチャー
  • 構造化バッファー
  • バイト アドレス バッファー
  • アンオーダード アクセス バッファーまたはテクスチャー

読み取り/書き込みバッファーおよび読み取り/書き込みテクスチャー

シェーダー モデル 4 の各リソースは読み取り専用です。シェーダー モデル 5 では、次の対応する新しい読み取り/書き込みリソースのセットが実装されます。

これらのリソースは、メモリーに直接アクセスする方法がないため、インデックスを通じてメモリーにアクセスするリソース変数が必要です。リソース変数は、式の左側および右側で使用できます。右側で使用する場合、テンプレート タイプは 1 つの要素 (float、int または uint) に絞る必要があります。

構造化バッファー

構造化バッファーは、同じサイズの要素を含むバッファーです。1 つ以上のメンバー タイプを持つ構造体を使用して、要素を定義します。次に 3 つのメンバーを持つ構造体を示します。

 struct MyStruct {     float4 Color;     float4 Normal;     bool isAwesome; }; 

この構造体を使用して、次のように構造化バッファーを宣言します。

 StructuredBuffer<MyStruct> mySB; 

インデックスの提供に加えて、構造化バッファーでは、次のような単一メンバーへのアクセスがサポートされています。

 float4 myColor = mySb[27].Color; 

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

インターロックされた処理を実装するアトミック関数は、RWStructuredBuffer の int 要素および uint 要素で許可されます。

バイト アドレス バッファー

バイト アドレス バッファーは、その内容がバイト オフセットでアドレス可能なバッファーです。通常、バッファーの内容は、S*N のように各要素のストライド (S) と要素数 (N) を使用して、要素ごとにインデックス作成されます。バイト アドレス バッファー (未処理バッファーとも呼ばれる) は、バッファーの先頭からバイト値オフセットを使用してデータにアクセスします。このバイト値は、DWORD 単位でアライメントされるように 4 の倍数である必要があります。他の値が指定されると、動作が不定になります。

シェーダー モデル 5 では、読み取り専用バイト アドレス バッファーおよび読み取り/書き込みバイト アドレス バッファーにアクセスするオブジェクトが導入されます。バイト アドレス バッファーの内容は、32 ビットの符号なし整数になるように設計されています。バッファーの値が符号なし整数でない場合、これを読み取るには asfloat などの関数を使用します。

アンオーダード アクセス バッファーまたはテクスチャー

アンオーダード アクセス リソース (バッファー、テクスチャー、およびテクスチャー配列を含む、マルチサンプリングは含まない) は、複数のスレッドからのアンオーダード読み取り/書き込みアクセスを一時的に許可します。つまり、このリソース タイプは、アトミック関数を使用することで、メモリー競合を起こさずに複数のスレッドの同時読み取り/書き込みを行うことができます。

ID3D11Device::CreateBufferID3D11Device::CreateTexture2D などの関数を呼び出して、アンオーダード アクセス バッファーまたはテクスチャーを作成し、D3D11_BIND_FLAG 列挙型の D3D11_BIND_UNORDERED_ACCESS フラグを渡します。

アンオーダード アクセス リソースは、ピクセル シェーダーおよびコンピュート シェーダーにのみバインドできます。同時実行中のピクセル シェーダーまたはコンピュート シェーダーは、同じアンオーダード リソースにバインドされます。

追加および消費バッファー

追加および消費バッファーは、スタック処理のようにバッファー末尾での値の追加と削除をサポートする、特別なアンオーダード リソース タイプです。

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

これらのリソースは、それぞれのメソッドで使用してください。リソース変数は使用しません。

関連項目

コンピュート シェーダーの概要