Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Glsl 线性化深度_Glsl_Vulkan_Depth Buffer - Fatal编程技术网

Glsl 线性化深度

Glsl 线性化深度,glsl,vulkan,depth-buffer,Glsl,Vulkan,Depth Buffer,在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处理深度值的方式略有不同()。我不太明白它背后的数学原理,我需要对函数做什么更改才能用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));
}
(来源:)


但是,Vulkan处理深度值的方式略有不同()。我不太明白它背后的数学原理,我需要对函数做什么更改才能用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));
}
看,解决方案是不变的投影深度失真,因为它绕过了投影矩阵和透视分割,所以它也更准确。