【发布时间】:2011-07-08 02:56:02
【问题描述】:
在 D3D HLSL 中,我们可以直接将深度值输出到 Pixel Shader 中的深度寄存器中。但它要求值应该在 0 和 1 之间。
如果我想将深度设置为大于 1,我该怎么做?
24 位存储深度值对于我非常大的场景图来说太有限了。
【问题讨论】:
-
“24 位...”这句话只是随机观察,还是问题的一部分?
在 D3D HLSL 中,我们可以直接将深度值输出到 Pixel Shader 中的深度寄存器中。但它要求值应该在 0 和 1 之间。
如果我想将深度设置为大于 1,我该怎么做?
24 位存储深度值对于我非常大的场景图来说太有限了。
【问题讨论】:
您可以输出 [0,1] 之外的值,但在用于深度测试(如果启用)和写入深度目标之前,它将被限制在 [0,1] 范围内。对于 Z16/Z24 格式(甚至不能表示 [0,1] 之外的值)和 Z32F 格式都是如此。
为什么 24 位太有限——您需要更大的范围还是需要更高的精度?
您的问题表明您需要比 [0,1] 更大的范围,但您的场景图可以使用您想要的任何范围,只要顶点着色器将范围映射到 [0,1](这种范围映射通常发生在模型/视图/投影变换中)。
如果您需要更高的精度,则无法通过原生方式获得:整个 API 和硬件中使用的 32 位浮点数只有 23 个尾数位,而隐式前导 1 有效地为您提供了 24 位精度。为了解决这个问题,典型的解决方案是将世界分割成多个片段(例如网格),并存储相对于它们所在片段的对象位置。当一个对象从一个片段移动到另一个片段时,您将其位置转换为相对于新段。渲染时,使用包含相机的段作为 (0,0,0) 并将位于视锥内的段映射到 [0,1] 深度范围。
【讨论】: