【问题标题】:Linearize depth线性化深度
【发布时间】:2018-12-09 01:17:27
【问题描述】:

在 OpenGL 中,您可以像这样线性化深度值:

float linearize_depth(float d,float zNear,float zFar)
{
    float z_n = 2.0 * d - 1.0;
    return 2.0 * zNear * zFar / (zFar + zNear - z_n * (zFar - zNear));
}

(来源:https://stackoverflow.com/a/6657284/10011415

但是,Vulkan 处理深度值的方式略有不同 (https://matthewwellings.com/blog/the-new-vulkan-coordinate-system/)。我不太了解它背后的数学原理,我必须对函数进行哪些更改才能使用 Vulkan 线性化深度值?

【问题讨论】:

标签: glsl vulkan depth-buffer


【解决方案1】:

这里 OpenGL 和 Vulkan 的重要区别在于标准化设备坐标 (NDC) 的 z 范围(深度)不同。在 OpenGL 中为 -1 到 1,在 Vulkan 中为 0 到 1。

但是,在 OpenGL 中,当深度存储到深度纹理中并从中读取时,该值会进一步标准化为 0 到 1。在您的示例中似乎就是这种情况,因为函数的第一行映射它回到 -1 到 1。

在 Vulkan 中,您的深度始终介于 0 和 1 之间,因此上述函数也适用于 Vulkan。你可以稍微简化一下:

float linearize_depth(float d,float zNear,float zFar)
{
    return zNear * zFar / (zFar + d * (zNear - zFar));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多