首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >glReadPixels指定分辨率

glReadPixels指定分辨率
EN

Stack Overflow用户
提问于 2014-10-27 01:41:58
回答 1查看 615关注 0票数 0

我正在尝试使用glReadPixels在iOS上以原生分辨率的一半从OpenGL视图中捕获屏幕截图。glReadPixels在视网膜屏幕上的速度非常慢,所以我想以某种方式强制每隔一秒像素和每隔一行读取一次,从而产生一个非视网膜屏幕截图(分辨率的1/4)。

我试着设置了这些:

代码语言:javascript
复制
glPixelStorei(GL_PACK_SKIP_PIXELS, 2);
glPixelStorei(GL_PACK_SKIP_ROWS, 2);

在调用glReadPixels之前,它似乎并没有完全改变任何东西。相反,它只渲染原始图像的1/4,因为我传递给glReadPixels的宽度和高度是视图的非视网膜大小。

或者,如果你知道任何更好的捕获OpenGL截图的方法,也请随意分享它。

EN

回答 1

Stack Overflow用户

发布于 2014-10-27 14:45:15

我不认为有一种非常直接的方法来做你想要的事情。正如您已经发现的,GL_PACK_SKIP_ROWSGL_PACK_SKIP_PIXELS没有您想要的功能。它们仅控制在开始时跳过多少行/像素,而不是在每行/像素之后。我相信它们控制着目标内存中的跳转,而不是你正在读取的帧缓冲区中的跳转。

部分解决方案的一种简单方法是每行执行一个单独的glReadPixels()调用,然后可以每隔一行执行一次。您仍然需要从这些行中每隔一秒复制一次像素,但至少可以将读取的数据量减半。而且它确实将额外的内存量减少到近四分之一,因为您将只在全分辨率下存储一行。当然,进行更多的glReadPixels()调用需要额外的开销,因此很难预测总体上是否会更快。

更好的方法是生成一个可以直接读取的半分辨率帧。为此,您可以执行以下任一操作:

  • 如果您的工具包允许,请以一半的分辨率重新渲染帧。您可以使用FBO作为渲染目标,窗口大小的一半。
  • 复制帧,同时在此过程中缩小它的比例。同样,创建一个渲染目标大小减半的FBO,并使用glBlitFramebuffer().

从默认帧缓冲区复制到这个FBO。

您还可以通过使用像素包缓冲区(参见glBindBuffer()GL_PACK_BUFFER参数)来使读回成为异步的。这很可能不会使操作更快,但它允许您在等待glReadPixels()结果到达时继续向GPU提供命令。它可能会帮助你截图,同时减少对游戏的干扰。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26575971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档