3

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

4

3 回答 3

4

在 iOS 上,没有默认的帧缓冲区。请参阅Framebuffer Objects are the Only Rendering Target on iOS。我对 GLKit 不太了解,但是在 iOS 上要在屏幕上渲染某些内容,您需要创建帧缓冲区,并将其附加到渲染缓冲区,并通知核心动画层该渲染缓冲区将是“屏幕”或“默认帧缓冲区”来绘制到。含义 - 您将绘制到此帧缓冲区的所有内容都将出现在屏幕上。请参阅渲染到核心动画层

于 2012-05-26T02:08:32.807 回答
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);,前提是您将系统帧缓冲区命名为“viewFramebuffer”。通过初始化代码查找以下调用 glGenFramebuffers(1, &viewFramebuffer); 不管你最后写了什么,当你返回到你的主系统缓冲区时,你绑定的就是什么。

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

于 2013-05-20T05:02:39.693 回答
0
  • (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {

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

    [self.shader drawOffscreenOnFBO];

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

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

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

}

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

于 2015-08-07T06:03:53.073 回答