使用以下语法使用 HLSL 声明结构。
struct
Name
{ [
InterpolationModifier
]
Type
[
R
x
C
]
MemberName
; ... };
可以在任何结构成员或像素着色器函数的参数上指定内插修饰符。 如果修饰符同时出现在这两个位置,则外部修饰符 (像素着色器参数修饰符) (结构修饰符) 推翻内部修饰符。
编译着色器或效果时,着色器编译器根据
HLSL 打包规则打包
结构成员。
着色器模型 4 中引入的内插修饰符
用于像素着色器输入的顶点着色器输出将线性内插,以便在光栅化期间获取每个像素的值。 若要设置内插方法,请使用以下任一值,这些值在
着色器模型 4
或更高版本中受支持。 在未用作像素着色器输入的任何顶点着色器输出上,将忽略修饰符。
内插修饰符
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)