Share via


直接在根簽章中使用常數

應用程式可以在根簽章中定義根常數,每個常數都是一組 32 位值。 它們會以高階網底語言 (HLSL) 顯示為常數緩衝區。 請注意,基於歷史原因,常數緩衝區會視為 4x32 位值的集合。

每組使用者常數都會被視為 32 位值的純量陣列,可從著色器動態編制索引和唯讀。 超出範圍,為一組指定的根常數編制索引,會產生未定義的結果。 在 HLSL 中,您可以為使用者常數提供資料結構定義,以提供它們類型。 例如,如果根簽章定義一組 4 個根常數,HLSL 可以重迭下列結構。

struct DrawConstants
{
    uint foo;
    float2 bar;
    int moo;
};
ConstantBuffer<DrawConstants> myDrawConstants : register(b1, space0);

常數緩衝區不允許陣列對應至根常數,因為不支援根簽章空間中的動態索引編制。 例如,讓常數緩衝區中的專案像 一樣 float myArray[2]; 無效。 對應至根常數的常數緩衝區本身不能是陣列;因此,對應到根常數無效 cbuffer myCBArray[2]

常數可以部分設定。 例如,如果根簽章在 RootTableBindSlot 2 定義四個 32 位值,則可以一次設定四個常數的任何子集, (其他常數維持不變) 。 這在繼承根簽章狀態的套件組合中很有用,而且可以部分變更它。

設定常數時,請小心著色器預期的常數緩衝區配置。 例如,常數可能會填補到 vec4 界限。 若要確認預期的配置,請檢查 HLSL 著色器中的反映資訊。

下列 API (來自 ID3D12GraphicsCommandList 介面) 用於直接在根簽章上設定常數:

此外,請參閱 D3D12_ROOT_CONSTANTS 結構。

根簽章