次の方法で共有


ルート署名の例

次のセクションでは、複雑さが空から完全に完全に異なるルート署名を示します。

空のルート署名

空のルート署名にバインド

空のルートシグネチャは役に立つことはほとんどありませんが、入力アセンブラーのみを使用する単純なレンダリング パスや、記述子にアクセスしない最小限の頂点シェーダーとピクセル シェーダーで使用できます。 また、ブレンド ステージ、レンダー ターゲット、深度ステンシル ステージは、空のルート署名を使用しても使用できます。

1 つの定数

1 つのルート定数する

API バインド スロットは、このパラメーターのルート引数がコマンド リスト レコード時にバインドされる場所です。 API バインド スロットの数は、ルート署名内のパラメーターの順序に基づいて暗黙的です (1 つ目は常に 0 です)。 HLSL バインド スロットは、シェーダーにルート パラメーターが表示される場所です。 型 (上記の例では "uint" はハードウェアには認識されませんが、イメージ内のコメントにすぎません。ハードウェアは単に単なる 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 つの DWORDS である float4 ルート定数です。 次のコマンドは、4 つの DWORDS の中央の 2 つだけをバインドします。

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 以降のハードウェアが必要です。

リソース バインド ハードウェア層

HLSL でのリソース バインドの

ルート署名