Question

I am writing a simple rendering program using OpenGL 3.3.

I have following lines in my code (which should enable depth test and culling):

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
ExitOnGLError("ERROR: Could not set OpenGL depth testing options");

glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
ExitOnGLError("ERROR: Could not set OpenGL culling options");

However after rendering I see the following result:

flower-bad-depth

As you can see the depth test does not seem to work. What am I doing wrong? Where I should look for the problem?

Some information that may be useful:

  • In the projection matrix I have near clipping plane set to 0.2 and far to 3.2 (so near plane is not zero).
  • I render mesh and texture it using simple method with glDrawArrays and two buffers for vertex and texture coordinates. Shaders than are used to display these arrays properly.
  • I do not calculate and draw normals.
  • Context creation code: http://pastebin.com/mRMUxPL1

UPDATE:

Finally got it working! As it turns out I was not creating the buffer for depth rendering. When I replaced this code (buffers initialization):

glGenFramebuffers(1, &mainFrameBufferId);

glGenRenderbuffers(1, &renderBufferId);
glBindRenderbuffer(GL_RENDERBUFFER, renderBufferId);
glRenderbufferStorage(GL_RENDERBUFFER,
                      GL_RGBA8,
                      camera.imageSize.width,
                      camera.imageSize.height);

glBindFramebuffer(GL_FRAMEBUFFER, mainFrameBufferId);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
                          GL_COLOR_ATTACHMENT0,
                          GL_RENDERBUFFER,
                          renderBufferId);
CV_Assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);

with this one:

glGenFramebuffers(1, &mainFrameBufferId);

glGenRenderbuffers(1, &renderBufferId);
glBindRenderbuffer(GL_RENDERBUFFER, renderBufferId);
glRenderbufferStorage(GL_RENDERBUFFER,
                      GL_RGBA8,
                      camera.imageSize.width,
                      camera.imageSize.height);

glBindFramebuffer(GL_FRAMEBUFFER, mainFrameBufferId);
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
                          GL_COLOR_ATTACHMENT0,
                          GL_RENDERBUFFER,
                          renderBufferId);
CV_Assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);

glGenRenderbuffers(1, &depthRenderBufferId);
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderBufferId);
glRenderbufferStorage(GL_RENDERBUFFER,
                      GL_DEPTH24_STENCIL8,
                      camera.imageSize.width,
                      camera.imageSize.height);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderBufferId);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthRenderBufferId);

everything started to work fine!

Was it helpful?

Solution

static int visualAttribs[] = { None };
                               ^^^^
int numberOfFramebufferConfigurations = 0;
GLXFBConfig* fbConfigs = glXChooseFBConfig( display, DefaultScreen(display), visualAttribs, &numberOfFramebufferConfigurations );
CV_Assert(fbConfigs != 0);

glXChooseFBConfig():

GLX_DEPTH_SIZE: Must be followed by a nonnegative minimum size specification. If this value is zero, frame buffer configurations with no depth buffer are preferred. Otherwise, the largest available depth buffer of at least the minimum size is preferred. The default value is 0.

Try setting visualAttribs[] to something like { GLX_DEPTH_SIZE, 16, None }

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top