微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

然而有许多缺点:

DWM和Aero会导致大幅的减速(3ms – > 35ms只是为了调用BitBlt ) – 要解决这个问题,需要禁用Aero,我不想这样做。 屏幕闪烁,事情转移。

必须将数据重新传输到GPU,才能将数据作为纹理加载

没有CAPTUREBLT标志不能捕获分层的Windows。 启用时,捕捉时鼠标光标闪烁。 这可能看起来像一个小问题,但当应用程序没有错误时,这是​​非常烦人的。 作为解决这个问题的方法,我打算将一个分层窗口渲染为一个额外的游标。

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

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

如何使batch file全屏?

显示全屏图像的EXE

如何在Linux中创buildAlt + Tab友好的全屏程序(如游戏)?

Java全屏jframe与双显示

后期处理Windowsvideo输出

Java全屏模式不能在Ubuntu上工作

如何获取dxgi显示器/输出的当前显示模式(分辨率,刷新率)?

在Gnome 3,Xfce和Unity下的Qt中,带有子窗口的全屏窗口并不能保持最佳状态

你能全屏运行一个VB应用程序吗?

使用WinAPI进行全屏pipe理

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

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐