【问题标题】:Screen Capture with Open GL using glReadPixels使用 glReadPixels 使用 Open GL 进行屏幕捕获
【发布时间】:2011-02-28 12:57:12
【问题描述】:

我创建了一个 CGRegisterScreenRefreshCallback(refreshCallback, NULL) 并在 refreshCallback 方法中获取已更改的矩形列表。

我正在使用 OpenGL glReadPixels 从 frameBuffer 获取矩形数据。

是否有更好的屏幕捕获方法,无论是否使用 opengl,也可以使用 OpenGL,我可以跳过逐像素读取吗?

我查看了 glGetTexImage 和 glCopyTexSubImage2D。任何可以解释如何使用这些函数来获取更改的矩形数据的简单代码块都会很有帮助吗?

【问题讨论】:

  • 您是要捕获整个屏幕还是单个 OpenGL 窗口的输出? AFAIK,glReadPixels 只会让您捕获与附加到当前上下文的窗口相关联的像素。

标签: macos opengl screen-capture


【解决方案1】:

回读像素的最佳方法是绑定一个像素缓冲区对象(GL_PIXEL_PACK_BUFFER),用glBufferData和一个空数据指针(GL_STREAM_READ,重要!)对其进行初始化以保留内存,然后调用glReadPixels。然后,在 next 帧期间,即在交换缓冲区之后,(最好)glMapBuffer 或(或者)glGetBufferSubData。

此技术可确保 glReadPixels 不会阻塞,并且传输将以可能的最高传输速度异步进行,无需额外的副本。

【讨论】:

    【解决方案2】:

    捕获线程 -> 处理线程

    CaptureThread 运行 CGRegisterScreenRefreshCallback-> 回调通知处理程序线程矩形已更改 -> 如果需要,处理程序线程只会请求矩形数据。

    在这个阶段,我们将使用 glReadPixels 来读取矩形数据。

    是否可以将其更改为任何更快的 API,该 API 可以仅从已更改的矩形中读取数据? 这应该非常快,因为会有大量矩形会被更改,并且会多次检查屏幕更新。

    我们是否需要更改设计以使其更快?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 2017-03-15
      • 1970-01-01
      相关资源
      最近更新 更多