ルート署名で定数を直接使用する

アプリケーションでは、それぞれ 32 ビット値のセットとして、ルート署名でルート定数を定義できます。 これらは High Level Shading Language (HLSL) で定数バッファーとして扱われます。 履歴の理由上、定数バッファーは 4x32 ビット値のセットとして表示されていることに注意してください。

ユーザー定数の各セットは、動的なインデックス作成が可能で、かつシェーダーからは読み取り専用である 32 ビット値のスカラー配列として扱われます。 ルート定数のセットに範囲外のインデックス作成を行った場合の結果は未定義です。 HLSL では、データ構造定義によってユーザー定数に型を設定することができます。 たとえば、ルート署名で 4 つのルート定数から成るセットを定義した場合、HLSL でそれらに対して次の構造をオーバーレイできます。

struct DrawConstants
{
    uint foo;
    float2 bar;
    int moo;
};
ConstantBuffer<DrawConstants> myDrawConstants : register(b1, space0);

ルート署名の領域では動的なインデックス作成がサポートされないため、ルート定数にマップされる定数バッファーでは配列を設定できません。 たとえば、float myArray[2]; のように定数バッファーにエントリを設定するのは無効です。 ルート定数にマップされる定数バッファー自体を配列にすることはできません。このため、ルート定数に cbuffer myCBArray[2] をマップするのは無効です。

定数は部分的に設定することができます。 たとえば、ルート署名で RootTableBindSlot 2 に 4 つの 32 ビット値が定義されている場合、4 つの定数の任意のサブセットを一度に設定できます (それ以外は変更されません)。 これは、ルート署名の状態を継承してそれを部分的に変更できるバンドルで役立ちます。

定数を設定するときは、シェーダーで必要な定数バッファー レイアウトに注意してください。 たとえば、定数が vec4 境界にパディングされる可能性があります。 必要なレイアウトを確認するには、HLSL シェーダーのリフレクション情報を調べます。

次の API (ID3D12GraphicsCommandList インターフェイスから) は、ルート署名に定数を直接設定するために使用します。

また、 D3D12_ROOT_CONSTANTS 構造を参照してください。

ルート署名