我从场景中收集深度缓冲区。然而,我注意到当相机和场景的物体停留在相同位置并且相机仅旋转时,深度缓冲器收集不同的结果,例如,屏幕侧面显示的对象的深度与中间显示的深度不同。这可能是OpenGL的一个特性,但即便如此,我该如何纠正呢?该怎么办?
我使用以下函数线性化我的深度:
float linearize(float depth) {
float zNear = 0.1;
float zFar = 100.0;
return (2.0 * zNear) / (zFar + zNear - depth * (zFar - zNear));
}
我检查了它们应该没问题的近远值。
答案 0 :(得分:1)
OpenGL中没有“相机”这样的东西。当您更改模型视图矩阵(旋转“相机”)时,您实际上可以想到将对象移动到更靠近屏幕的位置。这就是为什么它们的渲染深度值会有所不同,因为深度计算为每个顶点(片段)的标准化变换z 。由于在转换后您不仅要考虑对象的位置,还要考虑“相机”位置,更改模型视图矩阵会更改生成的z值。
答案 1 :(得分:1)
是的,这是预料之中的。近平面的透视是投影表面的一种,深度值是垂直于深度平面的点的距离。现在想想如果旋转“相机”会发生什么(当然OpenGL中没有相机):垂直距离会因旋转角度的正弦而变化,但会增加一些相移。
如果你想实际测量像素与视点的距离,那么最好的做法是不使用深度缓冲区,而是写一个顶点着色器,它将顶点距离传递给原点(内置)函数length
)作为片段着色器的标量,片段着色器将其写入单通道帧缓冲对象输出。