在帧上均匀显示深度

时间:2012-09-05 18:06:57

标签: opengl glsl depth

我正在阅读场景的深度缓冲区,但是当我旋转相机时,我注意到朝向屏幕边缘的深度会更接近相机。我认为冲击角度对深度缓冲有影响,但是当我向帧缓冲器绘制一个四边形时,我不希望这种情况发生(事实上这不是事实,但这总结了我需要的东西)。 / p>

我用以下内容线性化深度:

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

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

我认为以下内容是为了纠正这个问题,但它还不是很正确。 45.0是垂直摄像机的角度/ 2.侧面是距屏幕中心的空间。

const float angleVert = 45.0 / 180.0 * 3.17;
float sideAdjust(vec2 coord, float depth) {
    float angA = cos(angleVert);
    float side = (coord.y - 0.5);
    if (side < 0.0) side = -side;
    side *= 2.0;
    float depthAdj = angA * side;
    return depth / depthAdj;
}

要在相机前面显示平面深度结果的图形显示我的问题:

         c
       / | \
      /  |  \
     /   |   \
closer further closer      

is what I have, what I need:

         c
    |    |   |
    |    |   |
    |    |   |
  even even even

1 个答案:

答案 0 :(得分:2)

如何做到这一点的想法是在眼睛空间中找到位置P.考虑P从原点到点的向量。将P投影到眼睛方向矢量(眼睛空间总是(0,0,-1))。投射矢量的长度是您所需要的。