iOS GLKit并返回到默认帧缓冲区

我正在运行XCode为iOS的OpenGL项目创build的锅炉板OpenGL示例代码。 这设置了一个简单的ViewController,并使用GLKit来处理剩下的工作。

应用程序的所有更新/绘制function都在C ++中。 它是跨平台的。

有很多帧缓冲创build正在进行。 绘制阶段渲染到几个帧缓冲区,然后尝试将其设置回默认帧缓冲区。

glBindFramebuffer(GL_FRAMEBUFFER, 0); 

这会生成一个GL_INVALID_ENUM。 只在iOS上。

为什么我完全被难住了。 代码在除iOS之外的所有主要平台上运行良好。 我想要责怪GLKit。 任何不使用GLKit的iOS OpenGL设置示例?

UPDATE

以下代码片段让我看到GLKit正在使用的默认帧缓冲区。 出于某种原因它出现为“2”。 果然,如果我在我所有的glBindFrameBuffer调用中使用“2”,它就可以工作。 这是非常令人沮丧的。

 [view bindDrawable ]; GLint defaultFBO; glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO); LOGI("DEFAULT FBO: %d", defaultFBO); 

究竟是什么原因会导致GLKit在0时不生成内部帧缓冲? 这是OpenGL使用的所有其他语义的语义,0是默认的FBO。

在iOS上,没有默认的帧缓冲区。 请参阅Framebuffer对象是iOS上的唯一呈现目标 。 我对GLKit知之甚less,但是在iOS屏幕上渲染一些东西,需要创buildframebuffer,并附加到renderbuffer,并通知Core Animation Layer这个渲染缓冲区将成为“屏幕”或“默认帧缓冲区”至。 含义 – 你将画到这个帧缓冲区的所有东西都会出现在屏幕上。 请参阅渲染到核心animation层 。

我觉得这里有必要指出,调用glBindFramebuffer(GL_FRAMEBUFFER,0); 不会将渲染返回到主框架缓冲区,尽pipe它似乎适用于运行Windows,Unix(Mac)或Linux的机器。 台式机和笔记本电脑没有主要的默认系统缓冲区的概念。 这个想法从手持设备开始。 当你用0作为参数进行openGL绑定调用时,你正在做的是将这个函数设置为NULL。 这是如何禁用此function。 这跟glBindTexture(GL_TEXTURE_2D,0)是一样的。 在某些手持设备上,当您将帧缓冲区设置为NULL而不激活另一个时,驱动程序会自动激活主系统帧缓冲区。 这将是制造商所做的select,不是你应该指望的,这不是openGL ES规范的一部分。 对于台式机和笔记本电脑,这是绝对必要的,因为禁用帧缓冲区需要返回到正常的OpenGL渲染。

在iOS设备上,您应该进行以下调用:glBindFramebuffer(GL_FRAMEBUFFER,viewFramebuffer);如果您指定了系统帧缓冲区'viewFramebuffer'。 通过你的初始化代码寻找下面的调用,glGenFramebuffers(1,&viewFramebuffer); 无论你在最后写的是什么,当你返回到你的主系统缓冲区时,你都会绑定什么。

如果你正在使用GLKit,那么你可以使用下面的调用,[((GLKView *)self.view)bindDrawable]; 根据您的特定启动代码,“self.view”可能略有不同。
另外,对于iOS,可以使用glBindFramebuffer(GL_FRAMEBUFFER,2); 但苹果发布的未来设备可能不会一致。 他们可能会将“2”的默认值更改为“3”或将来的其他内容,因此您希望使用实际名称而不是整数值。

  • (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {

//使用辅助/离屏帧缓冲来存储渲染结果

  [self.shader drawOffscreenOnFBO]; 

//返回到GLKView的默认帧缓冲区

  [((GLKView *) self.view) bindDrawable]; 

//在主屏幕上绘制[self.shader drawinmainscreen];

}

参考….. http://districtf13.blogspot.com/