直接在根簽章中使用描述項

若要避免需要經歷描述元堆積,您可以將描述元直接放入根簽章。 這些描述元佔用根簽章中的大量空間 (請參閱根 簽章限制) ,因此我們建議您謹慎使用。

範例使用方式是在根配置中放置常數緩衝區檢視, (CBV) 每個繪圖變更。 如此一來,描述元堆積空間就不需要由每個繪製的應用程式佈建 (,並將描述中繼資料表指向描述元堆積中新位置) 。 藉由將某個專案放在根簽章中,應用程式只會將版本控制責任交給驅動程式;但這是驅動程式已有的基礎結構。

對於使用極少資源的轉譯,如果所有所需的描述元都可以直接放在根簽章中,可能完全不需要描述中繼資料表/堆積使用。

這些是根簽章中唯一支援的描述項類型。

  • 常數緩衝區檢視 (CBV) 。
  • 著色器資源檢視 (SRV) /未排序的存取檢視, (UAV) 緩衝區資源) , (不具類型的緩衝區) 。 可以與根描述項系結的不具型別緩衝區範例包括 StructuredBuffer<type>RWStructuredBuffer<type>ByteAddressBufferRWByteAddressBuffer 。 型別緩衝區,例如 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 中沒有 根描述元陣列 的概念。 描述項陣列僅在描述項堆積中受到支援。