【发布时间】:2021-07-22 06:18:32
【问题描述】:
我正在尝试为我正在创建的 OpenGL 游戏录制游戏视频。我能够捕获 3D 场景图形(渲染到自定义帧缓冲区),但无法捕获 GUI 图形(渲染到默认后备缓冲区)。
这种行为与 OBS、Bandicam 和 FRAPS(All on Windows)相同,无论游戏是全屏运行还是窗口运行。切换覆盖捕获不会改变行为。
这是什么原因造成的?
【问题讨论】:
标签: opengl screen-capture
我正在尝试为我正在创建的 OpenGL 游戏录制游戏视频。我能够捕获 3D 场景图形(渲染到自定义帧缓冲区),但无法捕获 GUI 图形(渲染到默认后备缓冲区)。
这种行为与 OBS、Bandicam 和 FRAPS(All on Windows)相同,无论游戏是全屏运行还是窗口运行。切换覆盖捕获不会改变行为。
这是什么原因造成的?
【问题讨论】:
标签: opengl screen-capture
OpenGL 应用程序支持屏幕捕获的标准要求是确保读取的帧缓冲区在交换缓冲区之前指向后缓冲区。代码如下:
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
屏幕捕获软件使用活动帧缓冲区进行读取,理想情况下,该软件不应更改帧缓冲区状态,而是假定目标应用程序在交换缓冲区时已将读取的帧缓冲区设置为所需的捕获缓冲区。
如果读取的帧缓冲区未设置为交换时的后台缓冲区,则将捕获中间图像而不是最终图像。
此要求特定于屏幕捕获和覆盖注入,但不是正常渲染的要求,因为帧缓冲区状态不会影响缓冲区交换,并且渲染管道可能永远不需要从后台缓冲区读取。
【讨论】:
glXSwapBuffers、wglSwapBuffers 等)。值得注意的是,此函数不是 OpenGL 的一部分,也不依赖于 OpenGL 上下文。因此,在最后一次 OpenGL 函数调用(如使用 glBindFramebuffer 设置读取的帧缓冲区)和缓冲区交换函数的调用之间,OpenGL 上下文可能已转移到不同的线程并在那里更改了状态。这是非常不可能的,并且由于 OpenGL 上下文如何工作的晦涩难懂,我敢打赌没有程序会这样做。但这是一种可能。