结构类型

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

结构名称{ [InterpolationModifier] Type[RxC]MemberName; ... };

参数

名字

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

[InterpolationModifier]

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

Type[RxC]

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

MemberName

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

注解

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

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

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

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

内插修饰符 说明
线性 着色器输入之间的内插;如果未指定内插修饰符, 则线性 为默认值。
centroid 在像素覆盖区域内的样本之间内插 (这可能需要从像素中心) 推断终结点。 如果部分覆盖像素 (即使像素中心未覆盖) ,质心采样也可能提高抗锯齿。 质心修饰符必须与线性修饰符或无指定修饰符组合在一起。
nointerpolation 请勿内插。
noperspective 在内插期间不要执行透视更正。 noperspective 修饰符可以与质心修饰符组合在一起。
样品 在着色器模型 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) (数据类型