强制现有的 OpenGL 应用程序在无头机器上渲染屏幕外

Force existing OpenGL application to render offscreen on a headless machine

我想为视频游戏创建一个自动渲染测试框架。

我想测试通常使用 OpenGL 呈现 window 的应用程序。相反,我希望它呈现为图像文件以供进一步评估。我想在没有 GPU 的 Linux 服务器上执行此操作。

如何在对评估的应用程序影响最小的情况下执行此操作?

为了清楚起见,一些备注:

理想情况下,您的回答将解释如何在无头 Linux 服务器上设置环境,使我能够启动任意 OpenGL 二进制文件并将其输出渲染为图像。如果那不可能,我愿意接受任何建议。

fbdev/miniglx 可能是您正在寻找的东西。 http://www.mesa3d.org/fbdev-dri.html 我没有使用过它,所以我不知道它是否适合你的目的。

另一种方法是只启动 xserver,而无需使用 xinit 的任何桌面环境。该设置使用经过良好测试的代码路径,使其更适合 运行 您的测试。 miniglx 可能有 none 注意到的错误,因为它不是每天都使用。

要将渲染输出捕获到图像,可以使用 LD_PRELOAD 技巧来包装 glXSwapBuffers。基本思想是在您的应用程序和 gl 库之间添加您自己的 swapbuffers 函数,您可以在其中使用 glReadPixels 下载渲染帧,然后使用您最喜欢的图像库将该数据写入 image/video 文件。 glReadPixels 完成后,您可以调用库 glXSwapBuffers 进行交换,就像在真实桌面中发生的那样。

prog 子目录已从主 git 存储库中删除,您可以从 git://anongit.freedesktop.org/git/mesa/demos 找到它。

为您的 X 服务器使用 Xvfb。如果未找到受支持的 GPU,则部署在任何现代 Linux 发行版上的 Mesa 安装应自动回退到软件光栅化。您可以使用任何 X11 屏幕抓取程序截取屏幕截图;见鬼 ffmpeg -i x11grab 也行。