0

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

我用以下方法线性化深度:

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

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

我想出以下来纠正这个问题,但它还不太正确。45.0 是相机的垂直角度/2. side 是距屏幕中心的空间。

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
4

1 回答 1

2

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

于 2012-09-05T19:59:59.150 回答