直接在根签名中使用描述符

为了避免需要浏览描述符堆,可以将描述符直接放入根签名中。 这些描述符占用根签名中的大量空间 (根签名 限制) 因此建议谨慎使用。

例如,在根布局中放置一个常量缓冲区视图 (CBV) 按绘制更改。 这样,描述符堆空间就不必由应用程序按绘图分配 (并且将描述符表指向描述符堆堆中的新位置) 。 通过将某些内容放在根签名中,应用程序只是将版本控制责任承担给驱动程序;但这是驱动程序已有的基础结构。

对于使用极少资源的呈现,如果所有所需的描述符都可以直接放置在根签名中,则可能完全不需要使用描述符表/堆。

这些是根签名中唯一支持的描述符类型。

  • 常量缓冲区视图 (CBV) 。
  • 着色器资源视图 (SRV) /无序访问视图 (AAV) 缓冲区资源,其中格式转换 (非类型化缓冲区) 。 可以使用根描述符绑定的一些非类型化缓冲区示例包括 StructuredBuffer<type> 、 和 RWStructuredBuffer<type> ByteAddressBuffer RWByteAddressBuffer 。 键入的缓冲区(如 Buffer<uint>Buffer<float2> )不能。
  • 本地或全局根签名中光线跟踪加速结构的 SRV。

根中的 UAV 不能具有与之关联的计数器。 根签名中的描述符显示为单独的单独描述符,它们 — 无法动态编制索引。

struct SceneData
{
   uint foo;
   float bar[2];
   int moo;
};
ConstantBuffer<SceneData> mySceneData : register(b6);

在以上示例中, 不能声明为数组,就像 要映射到根签名中的描述符 mySceneData cbuffer mySceneData[2] 一样。 这是因为根签名不支持跨描述符编制索引。 如果需要,可以定义单独的常量缓冲区,并分别将其定义为根签名中的单独条目。 请注意,在以上的 mySceneData 中,有一个数组 bar[2]。 常量缓冲区中的动态索引是有效的,根签名中的描述符的行为与同一描述符通过描述符堆访问时的行为 — 相同。 这与直接在根签名中显示(也显示为常量缓冲区)中的内线常量相反,只不过约束是不允许在内向常量内进行动态索引,因此不允许在根签名中执行动态索引。 bar[2]

这些 API (ID3D12GraphicsCommandList 接口) 用于直接在根签名上设置描述符。

备注

Direct3D 12中不存在根描述符数组的概念。 描述符数组仅在描述符堆中受支持。