我在IOS OpenGL ES 2.0项目中使用GLkit / GLKView来管理我的应用程序的默认FBO /生命周期。
在桌面OpenGL中为了绑定默认FBO(前缓冲区)我可以调用glBindFrameBuffer(GL_FRAMEBUFFER,0),但在IOS应用程序中不是这种情况,因为你必须自己创建默认的FBO并且它将有一个唯一ID;
问题是GLKit / GLKView编码风格迫使我使用GLKView的“bindDrawable”函数激活默认FBO,这使得我的跨平台渲染系统的设计有点难看(必须在我的c ++引擎中将GLKView指针存储为void *每次我想执行默认的FBO绑定时,类和桥都会抛出它)
有没有办法获得GLKit / GLKView创建的默认FBO ID,以便我可以存储并使用它来绑定我的代码中的任何位置的默认帧缓冲区?
在最坏的情况下,我可以恢复自己创建默认的FBO并且放弃GLKit / GLKView,但它是一个很好的框架,我想继续使用它。
抱歉我的英文不好,并提前感谢您的回复。
答案 0 :(得分:23)
也许你可以在bindDrawable调用之后通过调用类似的东西来获取“当前”帧缓冲区ID:
GLint defaultFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO);
答案 1 :(得分:0)
给出的答案肯定是正确的解决方案,但是它并没有解决您对嵌入式系统的标准openGL和openGL之间的概念差异的理解中的错误。 // ----------------------------------------------- 我觉得有必要在这里指出调用glBindFramebuffer(GL_FRAMEBUFFER,0) 不会将渲染返回到主帧缓冲区,尽管对于运行Windows,Unix(Mac)或Linux的计算机来说似乎是这样。台式机和笔记本电脑没有主要默认系统帧缓冲的概念。这个想法始于手持设备。当您使用零作为参数进行openGL绑定调用时,您正在做的是将此函数设置为NULL。这是你禁用这个功能的方法。与glBindTexture(GL_TEXTURE_2D,0)相同; 在某些手持设备上,当您将帧缓冲区设置为NULL而不激活另一个帧缓冲区时,驱动程序可能会自动激活主系统帧缓冲区。这将是制造商做出的选择,而不是您应该依赖的东西,这不是openGL ES规范的一部分。对于台式机和笔记本电脑,这是绝对必要的,因为需要禁用帧缓冲区才能恢复正常的openGL渲染。但要记住!这不是返回任何主帧缓冲区,而是关闭激活的帧缓冲区。
答案 2 :(得分:0)
在GLKit中绑定默认帧缓冲区的正确方法是在bindDrawable
上调用GLKview
方法。
[self bindDrawable]
或[myglkview bindDrawable]
取决于具体情况。