【问题标题】:Supporting OpenGL Screen Capture by Third Party Applications支持第三方应用程序的 OpenGL 屏幕捕获
【发布时间】:2021-07-22 06:18:32
【问题描述】:

我正在尝试为我正在创建的 OpenGL 游戏录制游戏视频。我能够捕获 3D 场景图形(渲染到自定义帧缓冲区),但无法捕获 GUI 图形(渲染到默认后备缓冲区)。

这种行为与 OBS、Bandicam 和 FRAPS(All on Windows)相同,无论游戏是全屏运行还是窗口运行。切换覆盖捕获不会改变行为。

这是什么原因造成的?

【问题讨论】:

    标签: opengl screen-capture


    【解决方案1】:

    OpenGL 应用程序支持屏幕捕获的标准要求是确保读取的帧缓冲区在交换缓冲区之前指向后缓冲区。代码如下:

    glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
    

    屏幕捕获软件使用活动帧缓冲区进行读取,理想情况下,该软件不应更改帧缓冲区状态,而是假定目标应用程序在交换缓冲区时已将读取的帧缓冲区设置为所需的捕获缓冲区。

    如果读取的帧缓冲区未设置为交换时的后台缓冲区,则将捕获中间图像而不是最终图像。

    此要求特定于屏幕捕获和覆盖注入,但不是正常渲染的要求,因为帧缓冲区状态不会影响缓冲区交换,并且渲染管道可能永远不需要从后台缓冲区读取。

    【讨论】:

    • 有趣。不知道为什么他们不能手动切换帧缓冲区,然后恢复原来的。
    • @HolyBlackCat:第三方应用程序可以更改帧缓冲区,但理想情况下它们应该尽可能不引人注目,特别是当多个应用程序注入同一个渲染进程时。 OpenGL 使用单线程模型,但它不会阻止所有竞争条件。
    • 会有哪些竞争条件?
    • @HolyBlackCat:屏幕捕获程序通常会挂接到缓冲区交换函数(glXSwapBufferswglSwapBuffers 等)。值得注意的是,此函数不是 OpenGL 的一部分,也不依赖于 OpenGL 上下文。因此,在最后一次 OpenGL 函数调用(如使用 glBindFramebuffer 设置读取的帧缓冲区)和缓冲区交换函数的调用之间,OpenGL 上下文可能已转移到不同的线程并在那里更改了状态。这是非常不可能的,并且由于 OpenGL 上下文如何工作的晦涩难懂,我敢打赌没有程序会这样做。但这是一种可能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2013-03-30
    相关资源
    最近更新 更多