使用OpenGl进行跨平台屏幕抓取有可能吗?如何实现?

使用OpenGl进行跨平台屏幕抓取有可能吗?如何实现?,opengl,cross-platform,Opengl,Cross Platform,所以我觉得这很有趣。这是可悲的 另外,还选中了glGrab,它使用OpenGL抓取屏幕,速度非常快 因此,我想知道我们是否可以在Windows和Linux上使用一些openGl包装器(如SDL)通过openGl抓取desctop屏幕帧?openGl可以(轻松、快速、直接地)抓取它拥有的前/后缓冲区,并且您有一个有效的上下文 换句话说,不是 桌面不属于OpenGL。在Windows下,它由Vista之前的驱动程序和Vista/7下的窗口管理器管理。您需要在此处使用BitBlt函数,该函数既不可移植

所以我觉得这很有趣。这是可悲的

另外,还选中了glGrab,它使用OpenGL抓取屏幕,速度非常快

因此,我想知道我们是否可以在Windows和Linux上使用一些openGl包装器(如SDL)通过openGl抓取desctop屏幕帧?

openGl可以(轻松、快速、直接地)抓取它拥有的前/后缓冲区,并且您有一个有效的上下文

换句话说,不是

桌面不属于OpenGL。在Windows下,它由Vista之前的驱动程序和Vista/7下的窗口管理器管理。您需要在此处使用
BitBlt
函数,该函数既不可移植,也不快速。
在Linux下,桌面至少有时确实属于OpenGL(合成窗口管理器),但您没有上下文句柄


如果你能将你的需求从“桌面”减少到“我的窗口的内容”,那么一切都变得超级简单。在最简单的情况下,这是一个函数调用,如果您想用DMA异步执行,则需要3-4个。

如果我们创建透明的全屏窗口,会发生什么?技巧会起作用吗?不会。如果你创建一个透明的全屏窗口,这个窗口将有它自己的前/后缓冲区,如果你画到它们,它将显示在桌面上。但是,尽管看起来像这样,但这并不意味着透明窗口后面的内容实际上在它的前缓冲区中。你可以把这种情况想象成在背景上放一个塑料薄膜(就像20年前的卡通工作室一样)。这并不会使背景出现在塑料屏幕上(虽然在电影中,它看起来像一个场景)。@Damon:从技术上说,你是对的。然而,如果没有窗口合成发生,您实际上可以滥用OpenGL来获取屏幕的内容。创建全屏单缓冲窗口后,窗口的帧缓冲区(实际上只是屏幕缓冲区中的指针、跨距和长度)将包含创建/映射窗口时窗口下方的图像。你实际上可以阅读这些内容。此外,如果窗口处于最低级别,并且没有对glReadPixels执行像素所有权测试,则可以进行实时捕获。然而,这不是OpenGL的功能,而是操作系统的一个小故障。@datenwolf:你可能是对的,尽管这是一种我个人不愿意依赖的可怕的黑客行为(你怎么知道没有合成发生,甚至连硬件覆盖之类的事情都不想)。另外,我认为另一个必要的先决条件是像素格式是
PFD\u SWAP\u EXCHANGE
(或任何X等价物),否则没有理由说明窗口的缓冲区与帧缓冲区有任何关系。@datenwolf:请以答案的形式向我们展示一些源示例!)我想至少尝试一下。