範例根簽章
下一節顯示根簽章的複雜度從空白到完全完整。
空的根簽章
空的根簽章不太可能很有用,但可用於簡單的轉譯階段,只使用輸入組合器,以及不存取任何描述元的最小頂點和圖元著色器。 此外,您也可以使用混合階段、轉譯目標和深度樣板階段,即使具有空的根簽章也一樣。
一個常數
API 系結位置是此參數的根引數將在命令清單記錄時間系結的位置。 API 系結位置的數目是隱含的,根據根簽章中的參數順序,第一個參數 (一律為零) 。 HLSL 系結位置是著色器會看到根參數顯示的位置。 上述範例中的類型 (「uint」) 不知道硬體,但只是影像中的批註,硬體只會看到單一 DWORD 做為內容。
若要在命令清單記錄時間系結常數,則會使用類似下列的命令:
pCmdList->SetComputeRoot32BitConstant(0,seed); // 0 is the parameter index, seed is used by the shaders
新增根常數緩衝區檢視
此範例顯示兩個根常數,以及一個根常數緩衝區檢視 (CBV) ,其成本為兩個 DWORD 位置。
若要系結常數緩衝區檢視,請使用下列命令。 請注意,第一個參數 (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+ 的硬體。
相關主題