iOS OpenGL ES:何时应该绑定帧缓冲区和渲染缓冲区?

时间:2011-03-08 13:41:07

标签: ios opengl-es

我有一些看起来像这样的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是否有意义?

1 个答案:

答案 0 :(得分:2)

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

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

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

在我的示例应用程序中,我发现在每个帧中glBindRenderbufferOES()之前需要使用-presentRenderbuffer:,否则不会显示任何内容。不过,我可能只是在错误的时间设置了一些东西。

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