新しいリソースのタイプ
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;
次のオブジェクト タイプを使用して、構造化バッファーにアクセスします。
- StructuredBuffer は、読み取り専用の構造化バッファーです。
- RWStructuredBuffer は、読み取り/書き込みの構造化バッファーです。
インターロックされた処理を実装するアトミック関数は、RWStructuredBuffer の int 要素および uint 要素で許可されます。
バイト アドレス バッファー
バイト アドレス バッファーは、その内容がバイト オフセットでアドレス可能なバッファーです。通常、バッファーの内容は、S*N のように各要素のストライド (S) と要素数 (N) を使用して、要素ごとにインデックス作成されます。バイト アドレス バッファー (未処理バッファーとも呼ばれる) は、バッファーの先頭からバイト値オフセットを使用してデータにアクセスします。このバイト値は、DWORD 単位でアライメントされるように 4 の倍数である必要があります。他の値が指定されると、動作が不定になります。
シェーダー モデル 5 では、読み取り専用バイト アドレス バッファーおよび読み取り/書き込みバイト アドレス バッファーにアクセスするオブジェクトが導入されます。バイト アドレス バッファーの内容は、32 ビットの符号なし整数になるように設計されています。バッファーの値が符号なし整数でない場合、これを読み取るには asfloat などの関数を使用します。
アンオーダード アクセス バッファーまたはテクスチャー
アンオーダード アクセス リソース (バッファー、テクスチャー、およびテクスチャー配列を含む、マルチサンプリングは含まない) は、複数のスレッドからのアンオーダード読み取り/書き込みアクセスを一時的に許可します。つまり、このリソース タイプは、アトミック関数を使用することで、メモリー競合を起こさずに複数のスレッドの同時読み取り/書き込みを行うことができます。
ID3D11Device::CreateBuffer や ID3D11Device::CreateTexture2D などの関数を呼び出して、アンオーダード アクセス バッファーまたはテクスチャーを作成し、D3D11_BIND_FLAG 列挙型の D3D11_BIND_UNORDERED_ACCESS フラグを渡します。
アンオーダード アクセス リソースは、ピクセル シェーダーおよびコンピュート シェーダーにのみバインドできます。同時実行中のピクセル シェーダーまたはコンピュート シェーダーは、同じアンオーダード リソースにバインドされます。
追加および消費バッファー
追加および消費バッファーは、スタック処理のようにバッファー末尾での値の追加と削除をサポートする、特別なアンオーダード リソース タイプです。
追加および消費バッファーは、構造化バッファーである必要があります。
これらのリソースは、それぞれのメソッドで使用してください。リソース変数は使用しません。