线性化深度
Linearize depth
在 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));
}
(来源:)
但是,Vulkan 处理深度值的方式有所不同 (https://matthewwellings.com/blog/the-new-vulkan-coordinate-system/)。我不太了解它背后的数学原理,我必须对函数进行哪些更改才能使用 Vulkan 线性化深度值?
此处 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));
}
在 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));
}
(来源:)
但是,Vulkan 处理深度值的方式有所不同 (https://matthewwellings.com/blog/the-new-vulkan-coordinate-system/)。我不太了解它背后的数学原理,我必须对函数进行哪些更改才能使用 Vulkan 线性化深度值?
此处 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));
}