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

时间:2015-11-18 18:25:44

标签: linux opengl x11 mesa

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

我想测试一个通常渲染到OpenGL窗口的应用程序。相反,我希望它渲染到图像文件中以供进一步评估。我想在没有GPU的Linux服务器上执行此操作。

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

为清晰起见,有些评论:

  • OpenGL版本为2.1,因此可以使用Mesa进行软件渲染。
  • 最好,我不想更改任何应用程序代码。如果有一个解决方案允许我模拟X服务器或类似的东西,我宁愿这样做。
  • 我不想更改任何渲染代码。如果确实有必要,我可以改变初始化OpenGL的方式,但之后,我想执行任意OpenGL代码。

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

替代方案是在没有任何带有xinit的桌面环境的情况下启动和xserver。该设置使用经过良好测试的代码路径,使其更适合运行测试。 miniglx可能有没有注意到的错误,因为它不是每天都使用的。

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

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