glCopyTexImage2D作为glReadPixels(OpenGL ES)的替代方法

4
我目前正在使用glReadPixels获取OpenGL ES游戏的屏幕截图。尽管截图效果很好,但调用glReadPixels会导致游戏出现轻微卡顿。
建议使用glCopyTexImage2D来替代glReadPixels,以提高效率。请问glCopyTexImage2D是如何工作的?为了更好地理解,我正在使用this Apple method
由于我对OpenGL相对陌生,所以非常感谢任何帮助 :-)
1个回答

12

时间延迟是由于在GPU和CPU之间传输大量内存所致。这可以通过分批传输来解决,每帧少量传输一点。但如果你在一系列帧上从framebuffer中读取,图像会在此期间不断变化。

因此,你需要复制视频RAM到视频RAM(非常快),然后在逐步传输时它将不会改变。


VRAM到VRAM的复制是如何工作的?它是否复制了帧缓冲区的内容?也许我可以使用glCopyTexImage2D? - SundayMonday
1
@MrMusic:是的,它正在从帧缓冲区复制到备用缓冲区。根据OpenGL版本,您可能会使用辅助缓冲区(glDrawBufferglReadBuffer + glCopyPixels进行VRAM-VRAM复制,然后使用glReadBuffer + glReadPixels每帧从CPU中提取一小块)。在较新版本的OpenGL上,您可以使用VBO,但由于您正在使用OpenGL ES,请先尝试旧方法。 - Ben Voigt
@TatiOverflow:即使提供了代码,你仍然需要更改每个参数以适应你特定的问题。 你需要保存屏幕的哪一部分?你使用的比特深度是多少?是否已经使用了任何辅助缓冲区?从代码片段中,你将得到要调用的功能列表及其顺序,这已在注释中给出。 - Ben Voigt
我实际上发现,如果我使用glReadPixels并将返回的数组的处理移动到另一个线程中,我就能够加快速度... - TatiOverflow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接