ルート署名の例
次のセクションでは、空の状態から完全なフルまで、さまざまな複雑さのルートの署名を示します。
空のルート署名
空のルート署名は、役に立つ場面はあまりありませんが、入力アセンブラー、最小の頂点、および記述子にアクセスしないピクセル シェーダーのみ使用する簡易レンダリング パスで使用できます。 また、空のルート署名でも、ブレンド ステージ、レンダー ターゲット、および深度ステンシル ステージを使用できます。
1 つの定数
API バインド スロットは、このパラメーターのルート引数がコマンド リストの記録時にバインドされる場所です。 API バインド スロットの番号は暗黙的であり、ルート署名のパラメーターの順序に基づいています (最初は常にゼロです)。 HLSL バインド スロットは、渡されるルート パラメーターをシェーダーが認識する場所です。 その型 (上の例では "uint") をハードウェアは認識しません。これは、この図の単なるコメントです。ハードウェアはコンテンツとして 1 DWORD を単に認識します。
コマンド リストの記録時に定数をバインドするには、次のようなコマンドを使用します。
pCmdList->SetComputeRoot32BitConstant(0,seed); // 0 is the parameter index, seed is used by the shaders
ルート定数バッファー ビューの追加
この例は、2 つのルート定数と、2 DWORD スロットのコストがかかるルート定数バッファー ビュー (CBV) を示しています。
定数バッファー ビューをバインドするには、次のようなコマンドを使用します。 最初のパラメーター (2) は、図に示されているスロットです。 通常、定数の配列が設定され、その後、CBV として b0 でシェーダーがこれを利用できるようになります。
pCmdList->SetGraphicsRootConstantBufferView(2,GPUVAForCurrDynamicConstants);
記述子テーブルのバインディング
この例では、2 つの記述子テーブルの使用を示します。1 つは、CBV_SRV_UAV記述子ヒープで実行時に使用可能になる 5 つの記述子のテーブルを宣言し、もう 1 つは、サンプラー記述子ヒープの実行時に表示される 2 つの記述子のテーブルを宣言します。
コマンド リストの記録時に記述子テーブルをバインドするには、次のようにします。
pCmdList->SetComputeRootDescriptorTable(1, handleToCurrentMaterialDataInHeap);
pCmdList->SetComputeRootDescriptorTable(2, handleToCurrentMaterialDataInSamplerHeap);
ルート署名のもう 1 つの特徴は、4 DWORD のサイズを持つ float4 ルート定数です。 次のコマンドでは、4 DWORD のうち中間の 2 DWORD のみをバインドしています。
pCmdList->SetComputeRoot32BitConstants(0,2,myFloat2Array,1); // 2 constants starting at offset 1 (middle 2 values in float4)
より複雑なルート署名
この例は、ほとんどの型のエントリがある複雑なルート署名を示しています。 2 つの記述子テーブル (スロット 3 および 6 ) には、サイズが無制限の配列が含まれます。 ヒープ内の有効な記述子に接触する場合に限り、ここで負荷がアプリケーションにかかります。 無制限の配列または非常に大きな配列には、リソース バインディング サポートのハードウェア層 2 以上が必要です。
2 つの静的サンプラーがあります (ルート署名スロットを必要とせずにバインドされます)。
スロット 9 で、UAV u4 および UAV u5 が同じ記述子テーブル オフセットで宣言されています。 これは、エイリアス記述子の使用で、メモリ内の 1 つの記述子が HLSL シェーダーで u4 と u5 の両方として出現します。 この場合、シェーダーは、D3D10_SHADER_RESOURCES_MAY_ALIAS オプションまたは FXC の または /res_may_alias
オプションを使用してコンパイルする必要があります。 エイリアス記述子により、1 つの記述子を複数のバインド ポイントにバインドできます。このとき、シェーダーに変更を加える必要はありません。
ストリーミング シェーダー リソース ビュー
このルート署名は、すべての SRV が 1 つの大きな配列に対してストリーム入出力を行うシナリオを示しています。 実行時に、ルート署名を設定するときに記述子テーブルを 1 回設定できます。 その後、最初のいくつかのルート引数によって取り込まれる定数を介して配列に対してインデックスを作成することで、すべてのテクスチャの読み取りが実行されます。 テクスチャが空き記述子スロットに対してストリーム入出力されるときに、1 つの記述子ヒープのみが必要とされ、その更新のみが行われます。
大規模ヒープ内の記述子オフセットは、定数バッファー ビューの定数を使用してシェーダーによって識別されます。 たとえば、シェーダーにマテリアル ID が付与されると、シェーダーは、(必要なテクスチャを参照する) 必要な記述子にアクセスするための定数を使用して、1 つの大きな配列に対してインデックスを作成できます。
このシナリオでは、リソース バインディング層 2 以上のハードウェアが必要です。
関連トピック