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);
}

请参阅

变量语法

(DirectX HLSL) 变量