结构类型

使用以下语法使用 HLSL 声明结构。

struct Name{ [InterpolationModifier] Type[RxC] MemberName; ... };

参数

名字

唯一标识结构名称的 ASCII 字符串。

[InterpolationModifier]

指定内插类型的可选修饰符。 有关详细信息,请参阅“备注”。

Type[RxC]

具有可选行 (R) x 列的成员类型 (C) 数组大小。 结构至少包含一个元素;如果它包含多个元素,则元素都是同一类型。 行数和列数是介于 1 和 4(含)之间的无符号整数。

MemberName

唯一标识成员名称的 ASCII 字符串。

备注

可以在任何结构成员或像素着色器函数的参数上指定内插修饰符。 如果修饰符同时出现在这两个位置,则外部修饰符 (像素着色器参数修饰符) (结构修饰符) 推翻内部修饰符。

编译着色器或效果时,着色器编译器根据 HLSL 打包规则打包结构成员。

着色器模型 4 中引入的内插修饰符

用于像素着色器输入的顶点着色器输出将线性内插,以便在光栅化期间获取每个像素的值。 若要设置内插方法,请使用以下任一值,这些值在 着色器模型 4 或更高版本中受支持。 在未用作像素着色器输入的任何顶点着色器输出上,将忽略修饰符。

内插修饰符 说明
线性 在着色器输入之间内插;如果未指定内插修饰符,则 linear 为默认值。
centroid 在像素覆盖区域内某处的样本之间内插 (这可能需要从像素中心) 推断终结点。 如果像素部分覆盖 (即使像素中心未覆盖) ,质心采样也可能改善抗锯齿。 质心修饰符必须与线性修饰符或非特异性修饰符结合使用。
nointerpolation 不要内插 。
noperspective 在内插期间不执行透视更正。 noperspective 修饰符可以与质心修饰符组合使用。
sample 在着色器模型 4.1 及更高版本中可用在样本位置(而不是像素中心)内插。 这会导致像素着色器按样本执行,而不是按像素执行。 导致每个样本执行的另一种方法是具有 语义SV_SampleIndex的输入,该输入指示当前示例。 仅具有指定 样本 的输入 (或输入SV_SampleIndex) 像素中的着色器调用不同,而其他未指定修饰符的输入 (例如,如果混合不同输入上的修饰符) 仍在像素中心内插。 像素着色器调用和深度/模具测试都会针对像素中的每个覆盖样本进行。 这有时称为 超级采样。 相比之下,在没有采样频率调用(称为 多重采样)的情况下,每个像素都会调用一次像素着色器,无论覆盖了多少样本,而深度/模具测试则以采样频率进行。 这两种模式都提供等效的边缘抗锯齿。 但是,超级采样通过更频繁地调用像素着色器来提供更好的着色质量。
1. 使用 int/uint 类型时,唯一有效的选项是“nointerpolation”。

内插修饰符可以应用于结构成员或 函数参数,也可以同时应用于这两者。

示例

下面是一些示例结构声明。

struct struct1
{
  int    a;
}

此声明包括一个数组。

struct struct2
{
  int    a;
  float  b;
  int4x4 iMatrix;
}

此声明包括一个内插修饰符。

struct In
{
  centroid float2 Texcoord;
};

另请参阅

数据类型 (DirectX HLSL)