下一節顯示根簽章的複雜性,從空白到完全完整。
空白根簽章
空的根簽章不太可能有用,但可用於僅使用輸入組合器的簡單轉譯階段,以及無法存取任何描述元的最小頂點和像素著色器。 此外,您也可以使用混合階段、轉譯目標和深度樣板階段,即使具有空的根簽章也一樣。
一個常數
API 系結位置是此參數的根自變數將在命令清單記錄時間系結的位置。 API 系結位置的數目是隱含的,根據根簽章中的參數順序(第一個永遠為零)。 HLSL 系結位置是著色器會看到根參數顯示的位置。 上述範例中的類型 (“uint”) 在硬體中並不知道,但只是影像中的批注,硬體只會將單一 DWORD 視為內容。
若要在命令清單記錄時間係結常數,將會使用類似下列的命令:
pCmdList->SetComputeRoot32BitConstant(0,seed); // 0 is the parameter index, seed is used by the shaders
新增根常數緩衝區檢視
此範例顯示兩個根常數,以及成本為兩個 DWORD 插槽的根常數緩衝區檢視 (CBV)。
若要系結常數緩衝區檢視,請使用下列命令。 請注意,第一個參數 (2) 是影像中顯示的位置。 一般而言,會設定常數數位,然後提供給 B0 做為 CBV 的著色器使用。
pCmdList->SetGraphicsRootConstantBufferView(2,GPUVAForCurrDynamicConstants);
系結描述元數據表
此範例顯示兩個描述元數據表的使用;其中一個宣告五個描述元的數據表,該描述項將在運行時間在CBV_SRV_UAV描述元堆積中使用,另一個宣告在取樣器描述元堆積中顯示在運行時間的兩個描述元數據表。
在錄製命令清單時系結描述項數據表。
pCmdList->SetComputeRootDescriptorTable(1, handleToCurrentMaterialDataInHeap);
pCmdList->SetComputeRootDescriptorTable(2, handleToCurrentMaterialDataInSamplerHeap);
根簽章的另一個功能是大小為四個 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串流進出一個大型數位的案例。 在運行時間,設定根簽章時,可以設定描述元數據表一次。 然後,所有紋理讀取都是透過透過前幾個根自變數所饋送的常數來編製數位的索引來完成。 只需要單一描述元堆積,而且只會隨著紋理串流進出自由描述元位置而更新。
大型堆積中的描述元位移是使用常數緩衝區檢視中的常數來識別著色器。 例如,如果著色器有材質標識符,則可以使用常數來存取所需的描述元來索引到一個大型陣列中(其會參考必要的紋理)。
此案例需要具有資源系結層 2+ 的硬體。
相關主題