示例根签名

以下部分显示根签名的复杂性从空到完全完整。

空根签名

空根签名没有绑定

空根签名不太可能有用,但可用于仅使用输入汇编程序以及访问任何描述符的最小顶点和像素着色器,在简单呈现传递中使用。 此外,混合阶段、呈现目标和深度模具阶段也可用,即使根签名为空。

一个常量

单个根常量

API 绑定槽是此参数的根参数将在命令列表记录时间绑定的位置。 API 绑定槽的数目是隐式的,具体取决于根签名中参数的顺序(第一个始终为零)。 HLSL 绑定槽是着色器将显示根参数的位置。 上述示例中的类型(“uint”)对硬件未知,但只是图像中的注释,硬件将只看到单个 DWORD 作为内容。

若要在命令列表记录时间绑定常量,将使用类似于下面的命令:

pCmdList->SetComputeRoot32BitConstant(0,seed); // 0 is the parameter index, seed is used by the shaders

添加根常量缓冲区视图

将常量缓冲区视图添加到根签名

此示例显示了两个根常量,以及一个需要两个 DWORD 槽的根常量缓冲区视图(CBV)。

若要绑定常量缓冲区视图,请使用如下命令。 请注意,第一个参数 (2) 是图像中显示的槽。 通常,将设置常量数组,然后将其作为 CBV 提供给着色器。

pCmdList->SetGraphicsRootConstantBufferView(2,GPUVAForCurrDynamicConstants);

绑定描述符表

将描述符表添加到根签名

此示例演示了两个描述符表的用法:一个声明五个描述符的表,该描述符将在CBV_SRV_UAV描述符堆的执行时可用,另一个声明一个描述符的表,其中两个描述符将在执行时显示在采样器描述符堆中。

录制命令列表时绑定描述符表。

pCmdList->SetComputeRootDescriptorTable(1, handleToCurrentMaterialDataInHeap);
pCmdList->SetComputeRootDescriptorTable(2, handleToCurrentMaterialDataInSamplerHeap);

根签名的另一个功能是大小为 4 个 DWORDS 的 float4 根常量。 以下命令仅绑定四个中间的两个 DWORDS。

pCmdList->SetComputeRoot32BitConstants(0,2,myFloat2Array,1);  // 2 constants starting at offset 1 (middle 2 values in float4)

更复杂的根签名

包含多个元素的复杂根签名

此示例显示了包含大多数条目类型的密集根签名。 其中两个描述符表(在槽 3 和 6 处)包括未绑定的大小数组。 此处的负担在于应用程序仅触摸堆中的有效描述符。 未绑定或非常大的阵列需要硬件第 2 层以上的资源绑定支持。

有两个静态采样器(绑定而无需根签名槽)。

在槽 9 处,UAV u4 和 UAV u5 在相同的描述符表偏移量上声明。 这是使用别名描述符,内存中的一个描述符将在 HLSL 着色器中显示为 u4 和 u5。 在这种情况下,必须使用 D3D10_SHADER_RESOURCES_MAY_ALIAS 选项或 FXC 中的或 /res_may_alias 选项编译着色器。 别名描述符使一个描述符可以绑定到多个绑定点,而无需对着色器进行任何更改。

流式处理着色器资源视图

此根签名中的流式处理着色器资源视图

此根签名演示了一种方案,其中所有 SRV 都在一个大型数组中流式传输和流出。 在执行时,可以在设置根签名时设置描述符表一次。 然后,通过通过前几个根参数馈送的常量对数组编制索引来完成所有纹理读取。 只需要一个描述符堆,并且仅随着纹理在可用描述符槽中流式传输或传出而更新。

大型堆中的描述符偏移量由着色器使用常量缓冲区视图中的常量标识。 例如,如果为着色器提供材料 ID,则可以使用常量来访问所需的描述符(该描述符引用所需纹理)为一个大数组编制索引。

此方案需要具有资源绑定层 2+ 的硬件。

资源绑定硬件层

HLSL 中的 资源绑定

根签名