【问题标题】:Could depth value be greater than 1?深度值可以大于 1 吗?
【发布时间】:2011-07-08 02:56:02
【问题描述】:

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

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

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

【问题讨论】:

  • “24 位...”这句话只是随机观察,还是问题的一部分?

标签: graphics directx direct3d


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2021-05-07
    • 2019-11-13
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多