共用方式為


直接在根簽章中使用常數

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

每一組使用者常數被視為 32 個 -bit 值的純量陣列形式,從著色器中動態編制索引並唯讀。 超出界限,為一組指定的根常數編製索引,會產生未定義的結果。 在 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 結構。

根存取憑證