一、非线性深度值
这是默认的,非线性深度值可以保证,在近处得深度值精度高,在远处得深度值精确度低,更有实际意义,方程如下:

变化图如下:

接下来,从练习得角度,来改成线性。
二、线性深度值
先看方程:

变化图:

变换思路:
(1)将坐标变换回标准化设备坐标(裁剪空间)
(2)反转方程
代码如下:
#version 330 core
out vec4 FragColor;
float near = 0.1;
float far = 100.0;
float LinearizeDepth(float depth)
{
float z = depth * 2.0 - 1.0; // back to NDC(裁剪空间)
return (2.0 * near * far) / (far + near - z * (far - near)); //反转方程
}
void main()
{
float depth = LinearizeDepth(gl_FragCoord.z) / far; // 为了演示除以 far
FragColor = vec4(vec3(depth), 1.0);
}
效果:有种世界末日得感觉,用深度值作为颜色,近处黑色,远处白色

该博客探讨了OpenGL中深度测试的默认非线性深度值及其意义,并介绍了如何将深度值转换为线性形式,通过代码示例展示了线性深度值在视觉上的效果。

1227

被折叠的 条评论
为什么被折叠?



