我有一些看起来像这样的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];
}
我的问题是:我应该何时致电glBindFramebufferOES
和glBindRenderbufferOES
?说实话,我不记得为什么我在上面的示例中编写代码(几个月前),我开始回到iOS上的OpenGL ES,我正在尝试计算帧缓冲和渲染缓冲如何工作。
我应该每帧调用这些功能吗?或者我应该在任何帧开始绘制之前只调用它们一次?
修改:我是否应该逐帧调用glViewport
?在draw
被调用之前,我在一个单独的函数中设置了我的视口 - 每帧连续调用glViewPort
是否有意义?
答案 0 :(得分:2)
我倾向于忘记哪些电话是多余的,但我可以评论我在这里的有限测试中看到的内容。
您只需在设置场景时调用glViewport()
一次,除非您将屏幕外渲染到不同大小的FBO。在这种情况下,当您在帧缓冲区之间切换时,可以使用glViewport()
重置大小。
同样,您只需在设置时使用glBindFramebufferOES()
一次,除非您要切换正在渲染的FBO或由于视图大小的变化而重建当前的FBO。
在我的示例应用程序中,我发现在每个帧中glBindRenderbufferOES()
之前需要使用-presentRenderbuffer:
,否则不会显示任何内容。不过,我可能只是在错误的时间设置了一些东西。
我会告诉你,你可能想要查看Xcode 4,其中可能有或没有新仪器可能有助于指出这些冗余的OpenGL ES调用。可以想像。