0

一直涉足 OpenGLES 并取得了不同程度的成功。我当前的问题是尝试加载 .obj 文件。我发现了一个很棒的GLOBJLoader,我一直在我当前的项目中实现它,但还没有完全实现。

这是我的代码

- (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;
    }
}
}

createFrameBuffer() 方法显然是为了创建帧缓冲区,而 checkFrameBuffer() 只是为了帮助调试并在我执行每一步后输出帧缓冲区的状态。

我从中得到的输出是:

  1. 检查 1
  2. 错误代码:8cdd -->
  3. 完全的
  4. 检查 2
  5. 错误代码:8cdd -->
  6. 完全的
  7. 检查 3
  8. 错误代码:8cd7 -->
  9. 不完整:缺少附件
  10. 检查 4
  11. 错误代码:8cd7 -->
  12. 不完整:缺少附件
  13. 检查 5
  14. 错误代码:8cd7 -->
  15. 不完整:缺少附件
  16. 检查 6
  17. 错误代码:8cd6 -->
  18. 不完整:附件
  19. 检查 7
  20. 错误代码:8cd6 -->
  21. 不完整:附件
  22. 检查 8
  23. 错误代码:8cd6 -->
  24. 不完整:附件
  25. 检查 9
  26. 错误代码:8cd6 -->
  27. 不完整:附件
  28. 检查 10
  29. 错误代码:8cd6 -->
  30. 不完整:附件
  31. 检查 11
  32. 错误代码:8cd6 -->
  33. 不完整:附件
  34. 检查 12
  35. 错误代码:8cd6 -->
  36. 不完整:附件

这些问题正在阻止它工作,我完全感到困惑。应该说我对 OpenGL 的了解并不多,我只是在拼凑一些东西并尝试边做边学,但我确实浏览了Jeff Lamarche 的“OpenGLES From the Ground Up”,所以了解的很少。

任何帮助将不胜感激,如果您需要更多信息,请随时询问!

谢谢,

马特

4

1 回答 1

3

您是否在此之前的某个时间使用此设置您的上下文:

[EAGLContext setCurrentContext:context];

在您附加所有内容之前,不要费心检查您的帧缓冲区状态。只有这样,它才会注册为完整的。

以下是我用于设置具有深度缓冲区的 OpenGL ES 1.1(鉴于我在您的代码中看到的 OES 后缀)帧缓冲区的代码:

    [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;
    }

让我印象深刻的一个区别是,您输入的是帧缓冲区而不是glFramebufferRenderbufferOES(). 这可能是你问题的根源。此外,您以像素为单位明确设置 FBO 大小,而不是从视图层中获取该大小,我不知道您是否想这样做。

于 2012-05-23T17:32:00.680 回答