Matthew Hallatt
Matthew Hallatt

Reputation: 1380

OpenGLES issues with framebuffer

Been dabbling with OpenGLES and having varying levels of success. My current problem is trying to load a .obj file. I found a great GLOBJLoader that I've been to implement in my current project but am not quite there yet.

Here is my code

- (void)createFramebuffer
{

glGenFramebuffersOES(1, &viewFrameBuffer);
NSLog(@"Check 1");
[self checkFrameBuffer];
glGenRenderbuffersOES(1, &viewRenderBuffer);
NSLog(@"Check 2");
[self checkFrameBuffer];

glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFrameBuffer);
NSLog(@"Check 3");
[self checkFrameBuffer];
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderBuffer);
NSLog(@"Check 4");
[self checkFrameBuffer];
[context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];
NSLog(@"Check 5");
[self checkFrameBuffer];
glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewFrameBuffer);
NSLog(@"Check 6");
[self checkFrameBuffer];

GLint wide = 320;
GLint high = 480;

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &wide);
NSLog(@"Check 7");
[self checkFrameBuffer];
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &high);
NSLog(@"Check 8");
[self checkFrameBuffer];

if(USE_DEPTH_BUFFER)
{
    glGenRenderbuffersOES(1, &depthRenderBuffer);
    NSLog(@"Check 9");
    [self checkFrameBuffer];
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderBuffer);
    NSLog(@"Check 10");
    [self checkFrameBuffer];
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, glWidth, glHeight);
    NSLog(@"Check 11");
    [self checkFrameBuffer];
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderBuffer);
    NSLog(@"Check 12");
    [self checkFrameBuffer];
}
}

-(void)checkFrameBuffer
{
GLuint returned = (glCheckFramebufferStatus(GL_FRAMEBUFFER_OES));

if(returned != GL_FRAMEBUFFER_COMPLETE_OES)
{
    NSLog(@"Error code: %x -->", returned);
    switch (returned) {
        case GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES:
            NSLog(@"Incomplete: Dimensions");
            break;

        case GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES:
            NSLog(@"Incomplete: Formats");
            break;

        case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES:
            NSLog(@"Incomplete: Missing Attachment");
            break;

        case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES:
            NSLog(@"Incomplete: Attachment");
            break;

        default:
            NSLog(@"Complete");
            break;
    }
}
}

The createFrameBuffer() method is obviously to create the frame buffer, the checkFrameBuffer() is simply to help debug and outputs the state of the frame buffer after each step I take.

The output I get from this is:

  1. Check 1
  2. Error code: 8cdd -->
  3. Complete
  4. Check 2
  5. Error code: 8cdd -->
  6. Complete
  7. Check 3
  8. Error code: 8cd7 -->
  9. Incomplete: Missing Attachment
  10. Check 4
  11. Error code: 8cd7 -->
  12. Incomplete: Missing Attachment
  13. Check 5
  14. Error code: 8cd7 -->
  15. Incomplete: Missing Attachment
  16. Check 6
  17. Error code: 8cd6 -->
  18. Incomplete: Attachment
  19. Check 7
  20. Error code: 8cd6 -->
  21. Incomplete: Attachment
  22. Check 8
  23. Error code: 8cd6 -->
  24. Incomplete: Attachment
  25. Check 9
  26. Error code: 8cd6 -->
  27. Incomplete: Attachment
  28. Check 10
  29. Error code: 8cd6 -->
  30. Incomplete: Attachment
  31. Check 11
  32. Error code: 8cd6 -->
  33. Incomplete: Attachment
  34. Check 12
  35. Error code: 8cd6 -->
  36. Incomplete: Attachment

These issues are stopping it from working and I am completely baffled. It should be said that I don't really know much about OpenGL, I've just been patching things together and trying to learn as I go, but I did run through Jeff Lamarche's "OpenGLES From the Ground Up" so know small amounts.

Any help would be massively appreciated and if you need more information, please don't hesitate to ask!

Thanks,

Matt

Upvotes: 0

Views: 4642

Answers (1)

Brad Larson
Brad Larson

Reputation: 170309

Are you setting your context at some point before this by using this:

[EAGLContext setCurrentContext:context];

Don't bother checking your framebuffer status until after you've attached everything. Only then will it register as complete.

The following is code that I've used for setting up OpenGL ES 1.1 (given the OES suffix I see in your code) framebuffers with a depth buffer:

    [EAGLContext setCurrentContext:context];

    glGenFramebuffersOES(1, &viewFramebuffer);
    glGenRenderbuffersOES(1, &viewRenderbuffer);

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);

    [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:glLayer];
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_RENDERBUFFER_OES, viewRenderbuffer);

    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
    glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

    glGenRenderbuffersOES(1, &viewDepthBuffer);
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewDepthBuffer);
    glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight);
    glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, viewDepthBuffer);

    if(glCheckFramebufferStatusOES(GL_FRAMEBUFFER_OES) != GL_FRAMEBUFFER_COMPLETE_OES) 
    {
        return;
    }

One difference that leaps out at me is that you're feeding in the framebuffer instead of the render buffer in glFramebufferRenderbufferOES(). That might be the source of your problems. Also, you're explicitly setting the FBO size in pixels, rather than grabbing that size from your view's layer, and I don't know if you want to do that.

Upvotes: 3

Related Questions