从 GLKView/GLKit 获取默认帧缓冲区 ID



我在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并dissing GLKit/GLKView,但它是一个很好的框架,我想继续使用它。

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

也许你可以在 bindDrawable 调用之后获取"当前"帧缓冲 ID,方法是调用以下内容:

GLint defaultFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO);
给出的

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

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

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

最新更新