Depth buffer, do you speak it

Ok anyone got any idea why I can't allocate a depth buffer in the iPhone simulator ? I'm doing:

  CAEAGLLayer *eagl_layer = (CAEAGLLayer *) view.layer;
eagl_layer.opaque = TRUE;
eagl_layer.drawableProperties =
[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:FALSE], kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat,
nil];
ogl_ctx = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];

...

[EAGLContext setCurrentContext: ogl_ctx];

double s = self.contentScaleFactor;
int w = s * [self frame].size.width;
int h = s * [self frame].size.height;

glGenFramebuffersOES (1, &gl_framebuffer);
glBindFramebufferOES (GL_FRAMEBUFFER_OES, gl_framebuffer);

glGenRenderbuffersOES (1, &gl_renderbuffer);
glBindRenderbufferOES (GL_RENDERBUFFER_OES, gl_renderbuffer);
glRenderbufferStorageOES (GL_RENDERBUFFER_OES, GL_RGBA8_OES, w, h);
glFramebufferRenderbufferOES (GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES,
GL_RENDERBUFFER_OES, gl_renderbuffer);

#if 1 // #### why you no worky
glGenRenderbuffersOES (1, &gl_depthbuffer);
glBindRenderbufferOES (GL_RENDERBUFFER_OES, gl_depthbuffer);
glRenderbufferStorageOES (GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES,
w, h);
glFramebufferRenderbufferOES (GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES,
GL_RENDERBUFFER_OES, gl_depthbuffer);
#endif

[ogl_ctx renderbufferStorage:GL_RENDERBUFFER_OES
fromDrawable:(CAEAGLLayer*)self.layer];

switch (glCheckFramebufferStatusOES (GL_FRAMEBUFFER_OES)) {
...

I'm getting GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES. If I don't allocate the depth buffer, I get no error, but of course neither does depth testing work.

Tags: , , , ,

3 Responses:

  1. Frode M says:

    I used something like this in my last opengles2 iOS app:

    (...)
    self.glContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2];
    (...)

    [EAGLContext setCurrentContext:self.glContext];
    glGenFramebuffers(1, &_glDefaultFramebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, _glDefaultFramebuffer);

    glGenRenderbuffers(1, &_glColorRenderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _glColorRenderBuffer);

    [self.glContext renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer];
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_glFramebufferWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_glFramebufferHeight);

    glGenRenderbuffers(1, &_glDepthRenderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _glDepthRenderBuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _glFramebufferWidth, _glFramebufferHeight);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _glColorRenderBuffer);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _glDepthRenderBuffer);

    glBindRenderbuffer(GL_RENDERBUFFER, _glColorRenderBuffer);

    GLenum glFramebufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);

    • jwz says:

      Thanks! Looks like what I had wrong was that
      [ogl_ctx renderbufferStorage: ..etc...]
      has to come before
      glBindRenderbufferOES (GL_RENDERBUFFER_OES, gl_depthbuffer)
      and (I think?) the
      glRenderbufferStorageOES (GL_RENDERBUFFER_OES, GL_RGBA8_OES, w, h)
      is redundant with it.

      • Piku says:

        Yeah that was really helpful. I'd somehow managed to get the

        glGenRenderbuffers(1, &_glDepthRenderBuffer);
        glBindRenderbuffer(GL_RENDERBUFFER, _glDepthRenderBuffer);
        glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, _glFramebufferWidth, _glFramebufferHeight);

        bit before the

        glGenRenderbuffers(1, &_glColorRenderBuffer);

        and then totally miss out the

        glBindRenderbuffer(GL_RENDERBUFFER, _glColorRenderBuffer);

        ... and still get an image (but with no depth buffer which really confused me when I tried using it in a shader).