深度值可能大于1吗?

时间:2011-07-08 02:56:02

标签: graphics directx direct3d

在D3D HLSL中,我们可以直接在Pixel Shader中将深度值输出到深度寄存器中。但是它要求值应该在0和1之间。

如果我想将深度设置为大于1,我该怎么办?

用于存储深度值的24位对于我非常大的场景图来说太有限了。

1 个答案:

答案 0 :(得分:2)

您可以输出[0,1]以外的值,但在用于深度测试(如果已启用)之前和写入深度目标之前,它将被钳位到[0,1]范围。对于Z16 / Z24格式(甚至不能表示[0,1]以外的值)和Z32F格式都适用。

为什么24位太有限 - 你需要更大的范围还是需要更高的精度?

您的问题表明您需要比[0,1]更大的范围,但只要顶点着色器将范围映射到[0,1],您的场景图就可以使用您想要的任何范围(此范围映射通常会发生在模型/视图/投影变换中。)

如果你需要更高的精度,你就无法得到它本身:整个API和硬件中使用的32位浮点数只有23个尾数位,隐式前导1有效地提供24位精度。为了解决这个问题,典型的解决方案是将世界切割成段(例如网格),并相对于它们所处的段存储对象位置。当对象从一个段移动到另一个段时,将其位置转换为相对于新的细分市场。渲染时使用包含相机的片段(0,0,0)并将视锥体内的片段映射到[0,1]深度范围。