直接在根簽章中使用常數
應用程式可以在根簽章中定義根常數,每個常數都是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 結構。
相關主題