2010-12-07 123 views
3

我用这个代码:使用深度渲染缓冲区有什么问题? OpenGL ES 2.0的

context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 

    if (!context || ![EAGLContext setCurrentContext:context] || ![self loadShaders]) 
    { 
     [self release]; 
     return nil; 
    } 

    glGenFramebuffers(1, &defaultFramebuffer); 
    glGenRenderbuffers(1, &colorRenderbuffer); 
    glGenRenderbuffers(1, &depthRenderbuffer); 

    glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, colorRenderbuffer); 
    glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); 

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorRenderbuffer); 
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); 

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f); 

但是当我乳宁的应用程序,我看到紫色的屏幕?这段代码有什么问题?

回答

6

我没有看到你将颜色渲染缓冲区绑定到CAEAGLLayer的位置(尽管这可能会在稍后发生),并且我没有看到启用深度测试。另外,如果我没有弄错,你需要绑定颜色渲染缓冲区,为此调用glFramebufferRenderbuffer(),然后绑定深度渲染缓冲区并再次调用它。

以下是我已经用于建立一个类似的显示器上的OpenGL ES 2.0代码:

glEnable(GL_DEPTH_TEST); 

glGenFramebuffers(1, &viewFramebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer); 

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

[context renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; 

glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth); 
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight); 

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer); 

glGenRenderbuffers(1, &depthRenderbuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer); 
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer); 

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
{ 
    NSLog(@"Failure with framebuffer generation"); 
    return NO; 
} 

该申请的完整代码是可用here

1

我意识到这是多少年,但我做了完全相同的结果,所以我想我会贡献。

glGenBuffers(1, &_colorRenderBuffer); 

,而不是这个:

glGenRenderbuffers(1, &_colorRenderBuffer); 

最终的结果建立在渲染缓冲器,致使该怎么在我的项目已经发生的情况是我打的回车键太快的自动完成:紫色屏幕。