OpenGL深度缓冲区“扭曲”

时间:2012-12-28 20:26:12

标签: opengl depth

我从场景中收集深度缓冲区。然而,我注意到当相机和场景的物体停留在相同位置并且相机仅旋转时,深度缓冲器收集不同的结果,例如,屏幕侧面显示的对象的深度与中间显示的深度不同。这可能是OpenGL的一个特性,但即便如此,我该如何纠正呢?该怎么办?

我使用以下函数线性化我的深度:

float linearize(float depth) {
    float zNear = 0.1;
    float zFar = 100.0;

    return (2.0 * zNear) / (zFar + zNear - depth * (zFar - zNear));
}

我检查了它们应该没问题的近远值。

2 个答案:

答案 0 :(得分:1)

OpenGL中没有“相机”这样的东西。当您更改模型视图矩阵(旋转“相机”)时,您实际上可以想到将对象移动到更靠近屏幕的位置。这就是为什么它们的渲染深度值会有所不同,因为深度计算为每个顶点(片段)的标准化变换z 。由于在转换后您不仅要考虑对象的位置,还要考虑“相机”位置,更改模型视图矩阵会更改生成的z值。

答案 1 :(得分:1)

是的,这是预料之中的。近平面的透视是投影表面的一种,深度值是垂直于深度平面的点的距离。现在想想如果旋转“相机”会发生什么(当然OpenGL中没有相机):垂直距离会因旋转角度的正弦而变化,但会增加一些相移。

如果你想实际测量像素与视点的距离,那么最好的做法是不使用深度缓冲区,而是写一个顶点着色器,它将顶点距离传递给原点(内置)函数length)作为片段着色器的标量,片段着色器将其写入单通道帧缓冲​​对象输出。