【问题标题】:glCopyTexImage2D as alternative to glReadPixels (OpenGL ES)glCopyTexImage2D 作为 glReadPixels (OpenGL ES) 的替代品
【发布时间】:2011-11-25 11:51:25
【问题描述】:

我目前正在使用glReadPixels 抓取 OpenGL ES 游戏的屏幕截图。屏幕截图很棒,但调用glReadPixels 会导致游戏出现小问题。

glCopyTexImage2D 已被建议作为glReadPixels 的更有效替代品。 glCopyTexImage2D 是如何工作的?在某些情况下,我使用this Apple method

我对 OpenGL 比较陌生,因此非常感谢任何帮助 :-)

【问题讨论】:

    标签: ios performance opengl-es screenshot


    【解决方案1】:

    时间延迟是由于在 GPU 和 CPU 之间传输大量内存造成的。这可以通过分块传输来解决,每帧传输一点点。但是,如果您从帧缓冲区中读取一系列帧,则图像会同时发生变化。

    因此,您将视频 RAM 复制到视频 RAM 中(非常快),然后它不会随着您零碎地传输而改变。

    【讨论】:

    • VRAM 到 VRAM 的复制是如何工作的?它是在复制帧缓冲区的内容吗?也许我可以使用 glCopyTexImage2D?
    • @MrMusic:是的,它正在从帧缓冲区复制到备用缓冲区。根据 OpenGL 版本,您可以使用辅助缓冲区(glDrawBufferglReadBuffer + glCopyPixels 用于 VRAM-VRAM 副本,然后使用 glReadBuffer + glReadPixels 每帧仅将一个块拉回 CPU )。在较新版本的 OpenGL 上,您可以使用 VBO,但由于您使用的是 OpenGL ES,请先尝试旧方法。
    • @TatiOverflow:即使提供了代码,您也必须从字面上更改每个参数以适应您的特定问题。您需要保存屏幕的哪个部分?您使用的是什么位深度?是否有任何辅助缓冲区已在使用?您从代码 sn-p 中得到的只是要调用的函数列表和调用顺序,并且已经给出(在 cmets 中)。
    • 我实际上发现,如果我执行 glReadPixels 并将返回数组的处理移动到另一个线程,我可以加快它的速度......
    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    相关资源
    最近更新 更多