输出深度寄存器

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

语法

oDepth

 

其中:

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

 

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

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

写入 oDepth 寄存器会替换内插深度值 (,并忽略) 的任何深度偏差/斜率刻度呈现状态。 如果尚未创建深度缓冲区或未将深度缓冲区附加到设备,则会忽略对 oDepth 的写入。

如果要进行多重采样并写入 oDepth,由于像素着色器每个像素仅运行一次,因此将针对所有涵盖的子样本位置复制深度值。 深度测试仍按样本进行,但你没有从像素着色器进行比较的按样本深度值,就像没有编写 oDepth 时那样。

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

ps_2_0和ps_2_x限制

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

ps_3_0限制

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

寄存器