1

我从场景中收集深度缓冲区。然而,我注意到当相机和场景的对象保持在同一位置并且相机只旋转时,深度缓冲区会收集不同的结果,例如,屏幕侧面显示的对象与中间显示的对象具有不同的深度。这可能是 OpenGL 的一个特性,但即便如此,我该如何纠正呢?要考虑什么?

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

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

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

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

4

2 回答 2

1

OpenGL 中没有“相机”之类的东西。当您更改模型视图矩阵(旋转“相机”)时,您实际上可以考虑将对象移动得更远或更靠近屏幕。这就是为什么它们的渲染深度值会不同,因为深度是作为每个顶点(片段)的归一化变换 z计算的。由于在转换之后,您不仅必须考虑对象的位置,还要考虑“相机”位置,因此更改模型视图矩阵会更改结果 z 值。

于 2012-12-28T20:32:07.100 回答
1

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

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

于 2012-12-28T20:35:45.403 回答