从GPU获取完整的桌面屏幕截图

我一直在使用Windows API的BitBlt函数来执行屏幕抓取。

然而有许多缺点:

  1. DWM和Aero会导致大幅的减速(3ms – > 35ms只是为了调用BitBlt ) – 要解决这个问题,需要禁用Aero,我不想这样做。 屏幕闪烁,事情转移。
  2. 必须将数据重新传输到GPU,才能将数据作为纹理加载
  3. 没有CAPTUREBLT标志不能捕获分层的Windows。 启用时,捕捉时鼠标光标闪烁。 这可能看起来像一个小问题,但当应用程序没有错误时,这是​​非常烦人的。 作为解决这个问题的方法,我打算将一个分层窗口渲染为一个额外的游标。

我已经在使用OpenGL来显示和处理捕获的屏幕数据。 BitBlt给我的像素数据,它是相对容易加载到纹理。 然而,这有点荒谬,因为我手动将数据重新发送回GPU时,它应该在GPU上可用开始。 数据当然是存在的,但试图访问是另一回事。

我认为,供应商的待办事项清单(或可能在任何清单上)的这个function并不高,但我想问问那些知道AMD(ATI)或NVidia在读取屏幕缓冲区的驱动程序中(例如在OpenGL环境中)。 我对现代GPU架构知之甚less,不知道从哪里开始寻找答案。

Solutions Collecting From Web of "从GPU获取完整的桌面屏幕截图"

OpenGL只能读取上下文framebuffer(一个窗口)以及任何已经创建的帧缓冲区或pbuffers。 OpenGL无法触摸桌面或任何其他窗口。

这是个有趣的问题。 不幸的是,我不认为这是真的支持。 我发现在创建一个全屏幕不可见窗口和用glReadPixels读取像素数据方面取得了一些成功的报告:

http://www.virtualdub.org/blog/pivot/entry.php?id=142

http://www.opentk.com/node/2430

但是,我相信这样做的行为是未定义的,只能在特定的硬件/操作系统配置上工作。