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:
- Create and bind an FBO. Look up calls like
glGenFramebuffers
andglBindFramebuffer
if you have not used FBOs before. - 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 withglFramebufferTexture2D
orglFramebufferRenderbuffer
. If you only care about the depth from this rendering pass, you can skip this and render without a color buffer. - Create a depth texture, and attach it to the
GL_DEPTH_ATTACHMENT
attachment point of the FBO. - Do your rendering that creates the depth you want to use.
- Use
glBindFramebuffer
to switch back to the default framebuffer. - Bind your depth texture to a sampler used by your fragment shader.
- 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.