• Advertisement
Sign in to follow this  

iOS: Depth Buffer Not Working

This topic is 1808 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I don't know what's going on here, but right now, I can't get the depth buffer to work properly (that or I'm missing something really obvious).  I made a test example to verify that it works, but so far, no depth sorting is taking place.


I hate to just dump code and say "Hey, tell me what's wrong", but I've been struggling with this iOS stuff for a long time now, and never has OpenGL been so complicated.


From ViewController.m

- (void)viewDidLoad
    [super viewDidLoad];
	// Do any additional setup after loading the view.
    // 1. Create an Xcode Project
    // 2. Create a Context
    EAGLContext *context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1] autorelease];
    [EAGLContext setCurrentContext:context];
    // 3. Create a View
    GLView *glView = [[[GLView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease];
    [self.view addSubview:glView];
    GLuint depthBuffer;
    glGenRenderbuffers( 1, &depthBuffer );
    glBindRenderbuffer( GL_RENDERBUFFER, depthBuffer );
    glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 320, 480 );
    glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer );
    // 4. Create a Renderbuffer
    GLuint renderbuffer;
    glGenRenderbuffers(1, &renderbuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
    [context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)glView.layer];
    // 5. Create a Framebuffer
    GLuint framebuffer;
    glGenFramebuffers(1, &framebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, 320, 480 );
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
    GLenum status = glCheckFramebufferStatus( GL_FRAMEBUFFER );
    if( status != GL_FRAMEBUFFER_COMPLETE )
        NSLog( @"Error completing FBO! %x", status );
    glEnable( GL_DEPTH_TEST );
    glDepthFunc( GL_LEQUAL );
    glClearDepthf( 1.0f );
    glDisable( GL_CULL_FACE );
    glDisable( GL_LIGHT0 );
    glViewport( 0, 0, 320, 480 );
    glMatrixMode( GL_PROJECTION );
    gluPerspective( 45.0f, 320.0f/480.0f, 0.1f, 1000.0f );
    glMatrixMode( GL_MODELVIEW );


And my test code


-(void) drawView:(id)sender
    glClearColor( 0.0f, 0.5f, 0.0f, 1.0f );
    glMatrixMode( GL_MODELVIEW );
    glTranslatef( 0.0f, 0.0f, -5.0f );
    float v[9] = { 0, 1.0f, 0,
                  1.0f, -1.0f, 0,
                 -1.0f, -1.0f, 0 };
    glEnableClientState( GL_VERTEX_ARRAY );
    glVertexPointer( 3, GL_FLOAT, 0, v );
    glColor4f( 1.0f, 0, 0, 0 );
    glDrawArrays( GL_TRIANGLES, 0, 3 );
    glTranslatef( 1, 0, -6.0f );
    glColor4f( 1.0f, 1.0f, 0, 0 );
    glDrawArrays( GL_TRIANGLES, 0, 3 );
    glDisableClientState( GL_VERTEX_ARRAY );
    [[EAGLContext currentContext] presentRenderbuffer:GL_RENDERBUFFER];


The second triangle should be behind the first, but it's not.  I ensured that depth testing was enabled, but this still happens.  Also, depending where I add the depth buffer initialization code, it will cause the screen to be solid white.  No idea what's wrong.  This sucks.  Any ideas?  Thanks.


EDIT: Nevermind, I fixed it by initializing the depth buffer last and re-binding the colour buffer.  That solved everything.

Edited by blueshogun96

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement