我正在尝试使用glReadPixels在iOS上以原生分辨率的一半从OpenGL视图中捕获屏幕截图。glReadPixels在视网膜屏幕上的速度非常慢,所以我想以某种方式强制每隔一秒像素和每隔一行读取一次,从而产生一个非视网膜屏幕截图(分辨率的1/4)。
我试着设置了这些:
glPixelStorei(GL_PACK_SKIP_PIXELS, 2);
glPixelStorei(GL_PACK_SKIP_ROWS, 2);在调用glReadPixels之前,它似乎并没有完全改变任何东西。相反,它只渲染原始图像的1/4,因为我传递给glReadPixels的宽度和高度是视图的非视网膜大小。
或者,如果你知道任何更好的捕获OpenGL截图的方法,也请随意分享它。
发布于 2014-10-27 14:45:15
我不认为有一种非常直接的方法来做你想要的事情。正如您已经发现的,GL_PACK_SKIP_ROWS和GL_PACK_SKIP_PIXELS没有您想要的功能。它们仅控制在开始时跳过多少行/像素,而不是在每行/像素之后。我相信它们控制着目标内存中的跳转,而不是你正在读取的帧缓冲区中的跳转。
部分解决方案的一种简单方法是每行执行一个单独的glReadPixels()调用,然后可以每隔一行执行一次。您仍然需要从这些行中每隔一秒复制一次像素,但至少可以将读取的数据量减半。而且它确实将额外的内存量减少到近四分之一,因为您将只在全分辨率下存储一行。当然,进行更多的glReadPixels()调用需要额外的开销,因此很难预测总体上是否会更快。
更好的方法是生成一个可以直接读取的半分辨率帧。为此,您可以执行以下任一操作:
glBlitFramebuffer().从默认帧缓冲区复制到这个FBO。
您还可以通过使用像素包缓冲区(参见glBindBuffer()的GL_PACK_BUFFER参数)来使读回成为异步的。这很可能不会使操作更快,但它允许您在等待glReadPixels()结果到达时继续向GPU提供命令。它可能会帮助你截图,同时减少对游戏的干扰。
https://stackoverflow.com/questions/26575971
复制相似问题