线性化深度

l19*_*743 4 glsl depth-buffer vulkan

在 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));
}
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

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));
}
Run Code Online (Sandbox Code Playgroud)