【问题标题】:Crossplatform screen grabbing with OpenGl is it possible and how to do it?使用 OpenGL 进行跨平台屏幕抓取是否可行以及如何实现?
【发布时间】:2011-07-08 03:04:58
【问题描述】:

所以我发现这很有趣file(ref to it I found in here)。好难过

还有 glGrab,它使用 OpenGL 来抓取屏幕并且非常快。

所以我想知道我们能否在 Windows 和 Linux 上使用诸如 SDL 之类的 openGL 包装器通过 openGl 抓取桌面屏幕帧?

【问题讨论】:

    标签: opengl cross-platform


    【解决方案1】:

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

    换句话说:没有。

    桌面不属于 OpenGL。在Windows下,pre-Vista下由驱动管理,Vista/7下由窗口管理器管理。您需要在此处使用 BitBlt 函数,它既不便携,也不快速。
    在 Linux 下,桌面至少有时可能确实归 OpenGL(合成窗口管理器)所有,但您没有相应的上下文句柄。

    如果您可以将您的需求从“桌面”减少到“我的窗口内容”,那么一切都会变得超级简单。最简单的情况是一个函数调用,如果你想用 DMA 异步做的话,还要多 3-4 个。

    【讨论】:

    • 如果我们创建透明的全屏窗口会发生什么?诡计会奏效吗?
    • 没有。如果您创建一个透明的全屏窗口,该窗口将有自己的前/后缓冲区,如果您向它们绘图,它们将出现在桌面上。但是虽然它看起来像,但这并不意味着透明窗口后面的内容实际上是在它的前端缓冲区中。你可以把这种情况想象成在背景上放了一层塑料薄膜(就像 20 年前的卡通工作室一样)。这不会使背景出现在塑料屏幕上(尽管在电影中,它看起来像一个场景)。
    • @Damon:技术上你是对的。但是,如果没有发生窗口合成,您实际上可以滥用 OpenGL 来抓取屏幕的内容。创建全屏单缓冲窗口后,窗口的帧缓冲区(实际上只是指向屏幕缓冲区的指针、步幅和长度)将包含创建/映射时窗口下方的图像。您实际上可以阅读此内容。此外,如果窗口处于最低级别并且未在 glReadPixels 上执行像素所有权测试,您可以进行实时捕获。但是,这不是 OpenGL 功能,而是操作系统故障。
    • @datenwolf:你可能是对的,尽管那将是一种我个人不喜欢依赖的可怕黑客(你怎么知道没有合成发生,甚至没有想到诸如硬件覆盖之类的东西)。另外,我认为另一个必要的先决条件是像素格式为PFD_SWAP_EXCHANGE(或任何等效的X),否则没有理由说明任何一个窗口的缓冲区都应该与帧缓冲区有任何关系。
    • @datenwolf:请以答案的形式向我们展示一些源示例!)我希望至少尝试一下。
    猜你喜欢
    • 1970-01-01
    • 2011-01-12
    • 2013-12-31
    • 2013-01-12
    • 2017-02-25
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    相关资源
    最近更新 更多