我正在运行XCode为iOS的OpenGL项目创建的样板代码的OpenGL示例代码。这将设置一个简单的ViewController并使用GLKit来处理其余的工作。
应用程序的所有更新/绘制功能都是用C ++编写的。它是跨平台的。
正在进行大量的帧缓冲创建。绘制阶段渲染到几个帧缓冲区,然后尝试将其设置回默认的帧缓冲区。
glBindFramebuffer(GL_FRAMEBUFFER, 0);
这会生成GL_INVALID_ENUM。仅限iOS。
我完全不知道为什么。代码在除iOS之外的所有主要平台上运行良好。我想责怪GLKit。任何不使用GLKit的iOS OpenGL设置示例?
更新
以下代码片段让我看到了GLKit正在使用的默认帧缓冲区。出于某种原因,它出现为“2”。果然,如果我在所有glBindFrameBuffer调用中使用“2”,它就可以工作。这非常令人沮丧。
[view bindDrawable ];
GLint defaultFBO;
glGetIntegerv(GL_FRAMEBUFFER_BINDING_OES, &defaultFBO);
LOGI("DEFAULT FBO: %d", defaultFBO);
究竟是什么原因会导致GLKit在0时不生成内部帧缓冲?这是OpenGL使用的所有其他实现的语义,0是默认的FBO。
答案 0 :(得分:3)
在iOS上没有默认的帧缓冲区。见Framebuffer Objects are the Only Rendering Target on iOS。我对GLKit了解不多,但是在iOS上要在屏幕上渲染一些东西你需要创建帧缓冲区,并附加到它渲染缓冲区,并通知Core Animation Layer这个渲染缓冲区将是“屏幕”或“默认帧缓冲区”来绘制至。含义 - 您将绘制到此帧缓冲区的所有内容都将显示在屏幕上。请参阅Rendering to a Core Animation Layer。
答案 1 :(得分:1)
我觉得有必要在这里指出调用glBindFramebuffer(GL_FRAMEBUFFER,0); 不会将渲染返回到主帧缓冲区,尽管它似乎适用于运行Windows,Unix(Mac)或Linux的计算机。台式机和笔记本电脑没有主要默认系统缓冲区的概念。这个想法始于手持设备。当您使用零作为参数进行openGL绑定调用时,您正在做的是将此函数设置为NULL。这是你禁用这个功能的方法。与glBindTexture(GL_TEXTURE_2D,0)相同; 在某些手持设备上,当您将帧缓冲区设置为NULL而不激活另一个帧缓冲区时,驱动程序可能会自动激活主系统帧缓冲区。这将是制造商做出的选择,而不是您应该依赖的东西,这不是openGL ES规范的一部分。对于台式机和笔记本电脑,这是绝对必要的,因为需要禁用帧缓冲区才能恢复正常的openGL渲染。
在iOS设备上,您应拨打以下电话, glBindFramebuffer(GL_FRAMEBUFFER,viewFramebuffer); 假设您将系统命名为framebuffer'viewFramebuffer'。通过初始化代码查找以下调用, glGenFramebuffers(1,& viewFramebuffer); 无论你最后写的是什么,当你返回主系统缓冲区时都会绑定它。
如果您正在使用GLKit,那么您可以使用以下呼叫, [((GLKView *)self.view)bindDrawable];根据您的特定启动代码,“self.view”可能略有不同 另外,对于iOS,你可以使用glBindFramebuffer(GL_FRAMEBUFFER,2);但这可能不会与Apple发布的未来设备保持一致。他们可能会将默认值'2'更改为'3'或将来的其他内容,因此您需要使用实际名称而不是整数值。
答案 2 :(得分:0)
//使用辅助/屏幕外帧缓冲区来存储渲染结果
[self.shader drawOffscreenOnFBO];
//返回GLKView的默认帧缓冲区
[((GLKView *) self.view) bindDrawable];
//在主屏幕上绘图 [self.shader drawinmainscreen];
}
refernece ..... http://districtf13.blogspot.com/