OpenGL - How to access depth buffer values? - Or: gl_FragCoord.z vs. Rendering depth to texture

0xbadf00d picture 0xbadf00d · Apr 29, 2014 · Viewed 24.4k times · Source

I want to access the depth buffer value at the currently processed pixel in a pixel shader.

How can we achieve this goal? Basically, there seems to be two options:

  1. Render depth to texture. How can we do this and what is the tradeoff?
  2. Use the value provided by gl_FragCoord.z - But: Is this the correct value?

Answer

Reto Koradi picture Reto Koradi · Apr 29, 2014

On question 1: You can't directly read from the depth buffer in the fragment shader (unless there are recent extensions I'm not familiar with). You need to render to a Frame Buffer Object (FBO). Typical steps:

  1. Create and bind an FBO. Look up calls like glGenFramebuffers and glBindFramebuffer if you have not used FBOs before.
  2. Create a texture or renderbuffer to be used as your color buffer, and attach it to the GL_COLOR_ATTACHMENT0 attachment point of your FBO with glFramebufferTexture2D or glFramebufferRenderbuffer. If you only care about the depth from this rendering pass, you can skip this and render without a color buffer.
  3. Create a depth texture, and attach it to the GL_DEPTH_ATTACHMENT attachment point of the FBO.
  4. Do your rendering that creates the depth you want to use.
  5. Use glBindFramebuffer to switch back to the default framebuffer.
  6. Bind your depth texture to a sampler used by your fragment shader.
  7. Your fragment shader can now sample from the depth texture.

On question 2: gl_FragCoord.z is the depth value of the fragment that your shader is operating on, not the current value of the depth buffer at the fragment position.