packoffset
選擇性著色器常數封裝關鍵字,其使用下列語法:
:packoffset ( c[Subcomponent][.component] )
參數
項目 | 描述 |
---|---|
packoffset |
必要關鍵字。 |
C |
封裝僅適用于 c) 常數暫存器 (。 |
[子元件][.component] |
選擇性子元件和元件。 子元件是一個暫存器編號,也就是整數。 元件的格式為 [.xyzw]。 |
備註
宣告 變數類型時,使用此關鍵字手動封裝著色器常數。
封裝常數時,您無法混合常數類型。
編譯器對於全域常數和統一常數的行為稍有不同:
- 全域常數。 全域變數會新增為編譯器 所$Global cbuffer 的全域常數。 自動封裝元素 (宣告而沒有 packoffset 的元素) 會出現在最後一個手動封裝的變數之後。 封裝全域常數時,您可以混合類型。
- 統一常數。 當著色器在效果架構外部編譯時,函式參數清單中的統一參數將會新增至 編譯器$Param 常數緩衝區。 在效果架構內編譯時,統一常數必須解析為全域範圍中定義的統一變數。 統一常數不能手動位移;其建議用途僅適用于將著色器別名傳回全域的特製化,而不是將應用程式資料傳遞至著色器的方法。
以下是一些額外的範例: 使用著色器模型 4 封裝常數。
範例
以下是手動封裝著色器常數的數個範例。
封裝向量和純量的子元件,其大小足以防止跨越暫存器界限。 例如,這些全都是有效的:
cbuffer MyBuffer
{
float4 Element1 : packoffset(c0);
float1 Element2 : packoffset(c1);
float1 Element3 : packoffset(c1.y);
}