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

时间:2011-06-28 20:14:14

标签: windows opengl screenshot fullscreen

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

但是有许多缺点:

  1. DWM和Aero导致大幅减速(3ms - > 35ms只是为了调用BitBlt) - 要解决这个问题需要禁用Aero,我只是不愿意这样做。屏幕闪烁,事物转移。
  2. 必须将数据重新传输到GPU才能将数据加载为纹理
  3. 如果没有CAPTUREBLT标记,则无法捕获分层Windows。启用后,捕获时鼠标光标会闪烁。这似乎是一个小问题,但当应用程序无其他错误时,它非常烦人。作为解决方法,我打算将分层窗口渲染为附加光标。
  4. 我已经在使用OpenGL显示和操作捕获的屏幕数据。 BitBlt为我提供像素数据,将其加载到纹理中相对容易。然而,这有点荒谬,因为我手动将数据重新发送回GPU,因为它应该可以在GPU上开始使用。数据肯定存在,但尝试访问它是另一回事。

    我认为供应商的待办事项列表(或可能在任何列表中)的此功能并不高,但我想问一下知道AMD是否有任何条款( ATI)或NVidia在其驱动程序中用于读取屏幕缓冲区(例如,进入OpenGL上下文)。我对现代GPU架构知之甚少,不知道从哪里开始挖掘答案。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

这是一个有趣的问题。不幸的是,我不认为这是真的支持。我发现创建全屏不可见窗口并使用glReadPixels读取像素数据有一定程度的成功报告:

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

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

但是,我认为执行此操作时的行为未定义,仅适用于特定的硬件/操作系统配置。