直接在根签名中使用常量

应用程序可在根签名中定义根常量,每个常量都是一组 32 位值。 它们按高级着色语言 (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 上定义了四个 32 位值,则每次可设置这四个常量的任何子集(其他常量不变)。 这在继承根签名状态且可部分更改它的捆绑中非常有用。

设置常量时,请注意着色器预期的常量缓冲区布局。 例如,常量可填充到 vec4 边界。 要验证预期的布局,请检查 HLSL 着色器的反射信息。

以下 API(来自 ID3D12GraphicsCommandList 接口)用于直接在根签名上设置常量

另请参阅 D3D12_ROOT_CONSTANTS 结构。

根签名