输出深度寄存器

像素着色器输出深度寄存器 (oDepth) 是一个仅写标量寄存器,其范围 [0..1] 返回针对深度模具缓冲区的深度测试的新深度值。

语法

oDepth

 

其中:

名称 说明
oDepth 针对深度模具缓冲区的深度测试的新深度值

 

请务必注意,写入 oDepth 会导致任何特定于硬件的深度缓冲区优化算法 ((即分层 Z) 加速深度测试性能)丢失。

写入 oDepth 时,需要复制源重排 (.x | .y | .z | .w) 。 不允许显式写入掩码。

写入 oDepth 寄存器会替换内插深度值 (,并忽略任何深度偏差/斜率呈现统计信息) 。 如果未创建或附加到设备,则忽略写入 oDepth。

如果要对 oDepth 进行多重采样和写入,因为像素着色器每像素仅运行一次,因此深度值将针对所有覆盖的子样本位置进行复制。 深度测试仍按样本进行,但如果没有从像素着色器进行比较,但如果没有编写 oDepth,则不会对每个样本的深度值进行比较。

如果应用程序具有 w 缓冲区集作为其深度缓冲区,则在写入 oDepth 时需要考虑到这一点。 它可能需要将 w 范围信息发送到像素着色器,并计算 w 范围以缩放写入 oDepth 的 w 值。

ps_2_0和ps_2_x限制

  • oDepth 只能使用 mov - ps 指令编写,并且只能执行一次。
  • 写入 oDepth 时不允许使用源修饰符。
  • 写入 oDepth 时不允许使用指令修饰符。
  • 在流控制构造中或使用谓词时,不写入 oDepth。

ps_3_0限制

  • 对于ps_3_0,输出寄存器 oC# 和 oD# 可以写入任意次数。 像素着色器的输出来自着色器执行结束时的输出寄存器的内容。 如果写入输出寄存器未发生,可能是由于流控制或着色器刚刚未写入,则相应的呈现目标也不会更新。 如果写入输出寄存器中的通道子集,则未定义的值将写入其余通道。
  • 只要所有可能的路径最终写入寄存器,就可以在流控制或谓词中写入 oDepth。
  • 不能执行任何渐变计算 (或隐式调用渐变计算的操作,例如 texld - ps_2_0 和向上texldb - pstexldp - ps - ps) 流控制语句内部,其分支条件根据每个基元而有所不同, (即:动态流控制指令) 。 指令谓词不被视为动态流控制。

寄存器