2011-03-08 276 views
1

我有一些OpenGL ES的代码看起来像这样:iOS OpenGL ES:何时应该绑定帧缓冲区和渲染缓冲区?

- (void)drawView { 
    [EAGLContext setCurrentContext:context]; 

    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer); 
    glViewport(0, 0, backingWidth, backingHeight); 

    [game drawFrame]; 

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer); 
    [context presentRenderbuffer:GL_RENDERBUFFER_OES]; 

    [self checkGLError:NO]; 
} 

我的问题是这样的:当我应该叫glBindFramebufferOESglBindRenderbufferOES?老实说,我不记得为什么我以这种方式编写代码(这是几个月前的版本),并且我开始回到iOS上的OpenGL ES中,并试图了解帧缓冲区和渲染缓冲区如何工作。

我应该每帧调用这些函数吗?还是应该在任何框架开始绘制之前只调用一次?

编辑:我应该甚至在每帧的基础上调用glViewport?在draw有人被称为之前,我在一个单独的函数中设置了我的视口 - 每帧连续呼叫glViewPort是否有意义?

回答

2

我倾向于忘记哪些调用是多余的,但我可以评论我在我的有限测试中看到的内容。

设置场景时,只需要调用glViewport()一次,除非您将屏幕外渲染到不同大小的FBO。在这种情况下,当您在帧缓冲区之间切换时,您将使用glViewport()来重置大小。

同样,在设置时只需要使用glBindFramebufferOES()一次,除非您要切换渲染到的FBO或者由于视图大小的改变而重建当前的FBO。

在我的示例应用程序中,我发现glBindRenderbufferOES()需要在每帧中的-presentRenderbuffer:之前使用,或者什么也没有显示。不过,我可能只是在错误的时间设置了一些东西。

我会告诉你,你可能想看看Xcode 4,其中可能有或可能没有仪器中的新仪器,可能有助于指出这些冗余的OpenGL ES调用。可以想像。

+0

你是对的,你必须绑定渲染缓冲区_every_框架,或者什么都不显示。 – bobobobo 2013-01-10 19:02:07