packoffset
可选着色器常量打包关键字 (keyword) ,它使用以下语法:
:packoffset ( c[Subcomponent][.component] )
parameters
项 | 说明 |
---|---|
packoffset |
必需的关键字 (keyword) 。 |
C |
打包仅适用于常量寄存器 (c) 。 |
[子组件][.component] |
可选的子组件和组件。 子组件是寄存器编号,它是一个整数。 组件采用 [.xyzw] 的形式。 |
备注
使用此关键字 (keyword) 在声明变量类型时手动打包着色器常量。
打包常量时,不能混合使用常量类型。
对于全局常量和统一常量,编译器的行为略有不同:
- 全局常量。 编译器将全局变量作为全局常量添加到 $Global cbuffer。 自动打包的元素 (声明没有 packoffset 的元素) 将显示在最后一个手动打包的变量之后。 打包全局常量时,可以混合使用类型。
- 统一常量。 在效果框架外部编译着色器时,编译器会将函数参数列表中的统一参数添加到 $Param 常量缓冲区。 在效果框架中编译时,统一常量必须解析为全局范围内定义的统一变量。 无法手动偏移统一常量;他们建议的使用仅适用于着色器专用化,其中着色器别名回全局,而不是作为将应用程序数据传递到着色器的方式。
下面是一些其他示例: 使用着色器模型 4 打包常量。
示例
下面是手动打包着色器常量的几个示例。
打包其大小足以防止跨越寄存器边界的向量和标量子组件。 例如,这些都有效:
cbuffer MyBuffer
{
float4 Element1 : packoffset(c0);
float1 Element2 : packoffset(c1);
float1 Element3 : packoffset(c1.y);
}