像素着色器阶段

像素着色器阶段 (PS) 可实现丰富的着色技术,例如每像素照明和后期处理。 像素着色器是一个程序,它将常变量、纹理数据、内插的每顶点值和其他数据组合起来以生成每像素输出。 光栅器阶段对基元覆盖的每个像素调用一次像素着色器,但是,可以指定 NULL 着色器以避免运行着色器。

像素着色器

当对某个纹理进行多重采样时,如果为每个覆盖的多重采样执行了一次深度/模具测试,则会为每个覆盖的像素调用一次像素着色器。 通过深度/模具测试的样本将使用像素着色器输出颜色进行更新。

像素着色器内部函数将生成或使用与屏幕空间 x 和 y 相关的数量的派生对象。 派生对象的最常见用途是计算纹理采样的详细程度,在各向异性过滤的情况下,其用途是选择各向异性的轴上的样本。 通常,硬件实现同时对多个像素(例如 2x2 网格)运行像素着色器,以便在像素着色器中计算得出的数量的派生对象可以合理地近似为相邻像素中的同一执行点上的值的增量。

输入

如果管道在配置时未使用几何着色器,像素着色器限制为 16 个 32 位 4 分量输入。 否则,像素着色器可能占用多达 32 个 32 位 4 分量输入。

像素着色器输入数据包含顶点属性(可以在使用或不使用透视校正的情况下内插),或者也可以被视为每基元常量。 像素着色器输入根据声明的内插模式从正在光栅化的基元的顶点属性内插。 如果基元在光栅化之前被剪裁,内插模式在剪裁过程中也受支持。

顶点属性在像素着色器中心位置被内插(或评估)。 在参数输入结构中,像素着色器属性内插模式将逐个元素地在输入寄存器声明中声明。 属性可以线性内插,也可以通过 质心采样进行内插。 质心计算仅在多重采样期间相关,以包含像素由基元覆盖但像素中心可能并非如此的情况;质心计算尽可能靠近(非覆盖)像素中心进行。

输入也可以用系统值语义声明,该语意将标记由其他管道阶段使用的参数。 例如,像素位置应使用 SV_Position 语义标记。 IA 阶段可以使用 SV_PrimitiveID) 为像素着色器 (生成一个标量:光栅器阶段还可以使用 SV_IsFrontFace) 为像素着色器 (生成一个标量。

Outputs

像素着色器可输出多达 8 个 32 位 4 分量颜色,如果像素被弃用,则不会生成颜色。 像素着色器输出寄存器分量必须先声明才能使用;允许每个寄存器使用一个独特的输出写入掩码。

在输出合并阶段使用深度写入-启用状态 () 来控制深度数据是写入深度缓冲区 (还是使用放弃指令放弃该像素) 的数据。 像素着色器还可输出用于深度测试(使用 SV_Depth 语义)的可选 32 位 1 分量浮点深度值。 深度值是 oDepth 寄存器中的输出,它将替换用于深度测试的内插深度值(假定已启用深度测试)。 你无法在使用固定函数深度与使用着色器 oDepth 之间动态更改。

像素着色器无法输出模具值。

图形管道

管道阶段 (Direct3D 10)