像素着色器阶段

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

像素着色器

对纹理进行多重采样时,将为每个覆盖像素调用一次像素着色器,同时对每个覆盖的多重采样进行深度/模具测试。 通过深度/模具测试的示例使用像素着色器输出颜色进行更新。

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

输入

在没有几何着色器的情况下配置管道时,像素着色器限制为 16、32 位、4 分量输入。 否则,像素着色器最多可能需要 32 位、32 位、4 分量输入。

像素着色器输入数据包括顶点属性(可以使用或不使用透视更正进行内插),也可以被视为按基元常量。 根据声明的内插模式,从要光栅化的基元的顶点属性内插像素着色器输入。 如果在光栅化之前剪裁基元,则剪裁过程中也会遵循内插模式。

顶点属性在像素着色器中心位置内插(或计算)。 像素着色器属性内插模式在输入寄存器声明中声明,每个元素在 参数输入结构。 属性可以线性内插,也可以使用 质心采样。 质心评估仅在多重采样期间相关,以涵盖基元覆盖像素但像素中心可能不是:质心计算尽可能接近(非覆盖)像素中心。

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

输出

如果丢弃像素,像素着色器最多可以输出 8、32 位、4 分量颜色或无颜色。 必须先声明像素着色器输出寄存器组件,然后才能使用它们;允许每个寄存器使用不同的输出写入掩码。

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

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

图形管道

管道阶段(Direct3D 10)