RobotRock
RobotRock

Reputation: 4449

Show depth equally over frame

I am reading the depthbuffer of a scene, however as I rotate the camera I notice that towards the edges of the screen the depth is returned closer to camera. I think the angle of impact has an effect on the depthbuffer, however as I am drawing a quad to the framebuffer, I do not want this to happen (this is not actually the case ofcourse but this sums up my what I need).

I linearize the depth with the following:

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

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

I figured the following to correct for this, but it's not quite right yet. 45.0 is the angle of the camera vertically / 2. side is the space from the center of the screen.

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;
}

To show my problem with a drawing with results of depth of a flat surface in front of the camera:

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

is what I have, what I need:

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

Upvotes: 0

Views: 81

Answers (1)

Mortennobel
Mortennobel

Reputation: 3481

An idea of how to do it, would be to find the position P in eye-space. Consider P a vector from origin to the point. Project the P onto the the eye direction vector (which in eye-space always is (0,0,-1)). The length of the projected vector is what you need.

Upvotes: 2

Related Questions