2012-03-17 74 views
13

我在我的IOS OpenGL ES 2.0项目中使用GLkit/GLKView来管理我的应用的默认FBO /生命周期。从GLKView/GLKit获取默认帧缓冲区ID

在桌面上的OpenGL为了绑定默认FBO(前缓冲区),我就可以调用glBindFrameBuffer(GL_FRAMEBUFFER,0),但是这不是在iOS应用中的情况下,因为你必须自己创建默认FBO,这将有一个唯一的ID;

问题是GLKit/GLKView编码风格迫使我使用GLKView的“bindDrawable”函数来激活默认的FBO,这使得我的跨平台渲染系统的设计有点难看(必须将GLKView指针存储为void *引擎类和桥梁每次我想要执行默认的FBO绑定时抛出它)

有没有什么办法可以获得GLKit /在我的代码?

在最坏的情况下,我可以恢复自己创建默认的FBO,并且解散GLKit/GLKView,但它是一个很好的框架,我希望继续使用它。

对不起,我的英语不好,并提前感谢任何答复。

回答

22

也许你可以只是你bindDrawable电话后得到的“当前”帧缓冲ID,通过调用类似:

GLint defaultFBO; 
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO); 
+0

这工作很好,感谢您的回答(对不起还不能投票)。 – 2012-03-19 05:12:34

+0

真棒,很高兴它为你工作。 – 2012-03-22 10:15:05

0

是给予肯定的是妥善解决的答案,但它不解决错误在理解嵌入式系统的标准openGL和openGL之间的概念上的区别。 // ----------------------------------------------- 我觉得有必要指出,glBindFramebuffer(GL_FRAMEBUFFER,0) 的调用不会返回渲染到主帧缓冲区,尽管对于运行Windows,Unix(Mac)或Linux的机器似乎是这样。台式机和笔记本电脑没有主要的默认系统帧缓存的概念。这个想法从手持设备开始。当你用零作为参数进行openGL绑定调用时,你所做的就是将这个函数设置为NULL。这是你如何禁用这个功能。这与glBindTexture(GL_TEXTURE_2D,0)相同; 在某些手持设备上,当您将帧缓冲区设置为NULL而不激活另一个时,驱动程序可能会自动激活主系统帧缓冲区。这将是制造商做出的选择,并不是你应该指望的,这不是openGL ES规范的一部分。对于台式机和笔记本电脑来说,这是绝对必要的,因为禁用帧缓冲区需要返回到正常的OpenGL渲染。但要记住!这不是返回到任何主要帧缓冲区,您正在关闭激活的帧缓冲区。

0

在GLKit中绑定默认帧缓冲区的正确方法是在GLKview上调用bindDrawable方法。

[self bindDrawable][myglkview bindDrawable]取决于上下文。