Results 1 to 8 of 8

Thread: depth buffer values

  1. #1
    Junior Member Newbie
    Join Date
    Mar 2002
    Location
    UK
    Posts
    27

    depth buffer values

    Hi,

    I'm reading the depth buffer to enable me to calculate the range to any pixel in the screen. I'm want to ajust the z values from [0,1] to real-world depths. I can then multiply these by the corresponding precomputed scale factor to give the range. Can anyone tell me how these depth buffer values could be adjusted to real-world depths? Am I right to assume that 0.0 is coincident with the near clipping plane and 1.0 with the far clipping plane - thus I simply need to multiply by (far-near)?

    Code :
    // read the depth map from the framebuffer normalizing on the way
    glPixelTransferf(GL_DEPTH_SCALE, 1.0);
    glPixelTransferf(GL_DEPTH_BIAS, 0.0);
    glClearDepth(1.0);
    glReadPixels(x, y, dx, dy, GL_DEPTH_COMPONENT, GL_FLOAT, depthMap);
    Cheers for any pointers.

    [This message has been edited by thelamberto (edited 07-22-2002).]
    ----------------------------
    Anthony Clare
    School of Engineering
    Cranfield University

  2. #2
    Member Contributor
    Join Date
    Oct 2000
    Location
    Pittsburgh, PA
    Posts
    52

    Re: depth buffer values

    I'm pretty sure that's the way it works.

  3. #3
    Senior Member Frequent Contributor
    Join Date
    Apr 2000
    Location
    Adelaide, South Australia, Australia
    Posts
    763

    Re: depth buffer values

    Hello,

    no, that's not how it works. the depth map is _exponential_, not linear.

    ie, the values from near to far are stored like

    z' <- (z-n)/(f-n)

    so, z` becomes 0 when z == n and it becomes 1 when z==f, but it doesn't become 0.5 when z=(f+n)/2

    you'll need to compute the reverse of the projection matrix (found in the back of the red book), or use gluUnProject (which does this for you).

    cheers,
    John

  4. #4
    Senior Member Regular Contributor
    Join Date
    Dec 2001
    Location
    Belmont, CA, USA
    Posts
    216

    Re: depth buffer values

    Originally posted by john:
    ... the values from near to far are stored like

    z' <- (z-n)/(f-n)

    so, z` becomes 0 when z == n and it becomes 1 when z==f, but it doesn't become 0.5 when z=(f+n)/2
    ...
    Hmmm, you'd better go back and relearn algebra. If z = (f+n)/2 and z' = (z-n)/(f-n), then z' = 0.5

  5. #5
    Senior Member Frequent Contributor
    Join Date
    Apr 2000
    Location
    Adelaide, South Australia, Australia
    Posts
    763

    Re: depth buffer values

    hey
    you're right.

    hmm. maybe i was thinking of something else, then, without thinking it through properly

    oops

  6. #6
    Senior Member Frequent Contributor
    Join Date
    Apr 2000
    Location
    Adelaide, South Australia, Australia
    Posts
    763

    Re: depth buffer values

    aha!
    you're right about the poorly thought out analogy. but, then it clicked. z' is divided by w' when stored in the depth buffer, yes? Maybe it isn't. I'm pretty sure it is, in which case:

    octave:1> f=10
    f = 10
    octave:2> n=10
    n = 10
    octave:3> f=100
    f = 100
    octave:4> z=55
    z = 55
    octave:5> za=-(f*n)/(f-n)-(2.0*f*n)/(f-n)
    za = -33.333
    octave:6> zb=-z
    zb = -55
    octave:7> za/zb
    ans = 0.60606

  7. #7
    Junior Member Newbie
    Join Date
    Mar 2002
    Location
    UK
    Posts
    27

    Re: depth buffer values

    Hi Guys,

    I think I've nailed it - the transformation is not linear. Many thanks to Kevin Dennen for pointing this out.

    By Kevin Dennen
    Taken from "The Hidden Charms of Z-buffer" by Kurt Akeley, IRIS Universe ( 11 )

    dcp = FarClip - NearClip
    scp = FarClip + NearClip
    a = -1.0 * ( FarClip * NearClip / dcp )
    b = scp/ ( 2.0 * dcp ) + 0.5

    ans = a / ( zval - b )

    Depending on your far and near clip values, you may not see a big change until the 0.9## decimal values as this transformation is not linear. For example:
    for Near Clip = 10 and Far Clip = 10000, zval =0.9 range = 99.1
    zval =0.99 range = 909
    zval = 0.999 range = 5002


    [This message has been edited by thelamberto (edited 07-23-2002).]
    ----------------------------
    Anthony Clare
    School of Engineering
    Cranfield University

  8. #8
    Junior Member Newbie
    Join Date
    Mar 2002
    Location
    UK
    Posts
    27

    Re: depth buffer values

    Also got this:

    From "ABCs of th Z-Buffer", published Jan/Feb 1991, Pipeline Volume 2, Number 1, Revision 1.1.

    Code :
    When the projection matrix is defined by
     
        perspective (fovy, aspect, near, far);
     
    and the z viewport transformation is defined by
     
        lsetdepth (near  ,far  );
                           vp    vp
     
    then z    and z       are related by the following:
          eye      screen
     
                                  far near(far   - near  )
                                               vp       vp
                                 ------------------------
                                        far - near
    z    = ------------------------------------------------------------------
     eye             (far + near) (far   - near  )     far   + near
                                           vp       vp            vp       vp
           z       - -----------------------------  -  --------------
            screen          2 (far - near)                           2
    Most of the time far_vp and near_vp are 1 and 0 respectively so equation simplifies to that posted above. Remember z is negative into the screen and this is "corrected" in the previous post.

    EDIT: Equation got messed up - sorted.

    [This message has been edited by thelamberto (edited 07-24-2002).]
    ----------------------------
    Anthony Clare
    School of Engineering
    Cranfield University

Similar Threads

  1. Converting World Values to Depth Buffer Values
    By Tokage in forum OpenGL: Basic Coding
    Replies: 1
    Last Post: 10-22-2004, 02:04 AM
  2. Modifying Depth Buffer Values
    By Whilibarj in forum OpenGL: Basic Coding
    Replies: 4
    Last Post: 09-09-2004, 04:56 PM
  3. copy depth values from a buffer to another
    By rixed in forum OpenGL: Basic Coding
    Replies: 0
    Last Post: 01-28-2003, 01:26 AM
  4. depth buffer values (again)
    By thelamberto in forum OpenGL: Basic Coding
    Replies: 1
    Last Post: 07-24-2002, 08:53 AM
  5. depth buffer values
    By hoshi55 in forum OpenGL: Advanced Coding
    Replies: 0
    Last Post: 05-19-2001, 10:12 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  
Proudly hosted by Digital Ocean