使用glReadPixels使用Open GL进行屏幕捕获

时间:2011-02-28 12:57:13

标签: macos opengl screen-capture

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

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

使用/不使用opengl是否有更好的屏幕捕获方式,并且使用OpenGL可以跳过逐像素读取吗?

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

2 个答案:

答案 0 :(得分:0)

读取像素的最佳方法是绑定像素缓冲区对象(GL_PIXEL_PACK_BUFFER),使用glBufferData初始化它,使用空数据指针(GL_STREAM_READ,重要!)来保留内存,然后调用glReadPixels。然后,在 next 帧期间,即在交换缓冲区之后,(最好)glMapBuffer或(可选)glGetBufferSubData。

此技术可确保glReadPixels不会阻塞,并且传输将以尽可能高的传输速度异步发生,不会有超出必要的额外副本。

答案 1 :(得分:0)

捕捉线程 - > HandlerThread

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

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

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

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