如何在 iOS 中制作 OpenGL ES 帧缓冲区的副本?

Posted

技术标签:

【中文标题】如何在 iOS 中制作 OpenGL ES 帧缓冲区的副本?【英文标题】:How to make a copy of the OpenGL ES framebuffer in iOS? 【发布时间】:2011-09-12 00:23:49 【问题描述】:

我想在我的 ios 游戏中将 OpenGL ES 帧缓冲区从视频 RAM 复制到视频 RAM。这是怎么做到的?

理想情况下,我每秒会执行 30 次。然后将复制缓冲区的内容分段传输到 CPU(不是一次全部传输,因为这会导致游戏卡顿)。

【问题讨论】:

您是要 VRAM 到 VRAM,还是要 VRAM 到主 RAM?这些是非常非常不同的问题,有着非常非常不同的答案。 好的,只是您提到“将复制缓冲区的内容传输到 CPU”让我认为您实际上希望 VRAM 到主 RAM。 你说得对,我最终会将帧缓冲区副本的内容传输到 RAM。然而,作为第一步,我想将帧缓冲区从 VRAM 复制到 VRAM...然后从 VRAM 分段传输到 RAM 以(希望)避免游戏中的卡顿。 好的,在这种情况下,我会说 JimN 关于 FBO 的回答是一个好方法。根据我的经验,PowerVR 处理 FBO 的方式有点奇怪,因为它的延迟渲染机制,所以如果有一点延迟是可以的,你可能希望将前一帧的数据传输到主 RAM。 【参考方案1】:

编辑:我想说你应该看看帧缓冲区对象(FBO),你可以在下面的帖子中找到一个例子:

https://devforums.apple.com/message/23282#23282

这将允许您将场景渲染为附加到 FBO 的纹理,然后使用该纹理。

PS:感谢 Christian 指出我的错误(我第一次读到 MrMusic 想将 VRAM 复制到 RAM 并错误地建议使用 glReadPixels 确实不适合该目的)。

【讨论】:

他要求 VRAM 到 VRAM 的副本,这使得 glReadPixels 无用。除非您考虑过公益组织,但在这种情况下,答案应该更新。

以上是关于如何在 iOS 中制作 OpenGL ES 帧缓冲区的副本?的主要内容,如果未能解决你的问题,请参考以下文章

iOS OpenGL ES Analyzer 列出“不存在的帧缓冲区附件”和“缺少帧缓冲区附件”,但 FBO 工作

如何在 iPhone OpenGL ES 2.0 中在渲染和呈现帧缓冲区之间切换?

如何在opengl es 3+中获取我的离屏帧缓冲区内的底层对象的像素颜色?

iOS OpenGL ES 逻辑缓冲区加载

在 OpenGL ES 中渲染“层”

清除/释放 OpenGL ES 缓冲区