iOS GLKit并返回默认帧缓冲区

时间:2012-05-25 22:09:38

标签: ios xcode opengl-es framebuffer

我正在运行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。

3 个答案:

答案 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)

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

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

    [self.shader drawOffscreenOnFBO];

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

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

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

}

refernece ..... http://districtf13.blogspot.com/