强制现有的 OpenGL 应用程序在无头机器上渲染屏幕外
Force existing OpenGL application to render offscreen on a headless machine
我想为视频游戏创建一个自动渲染测试框架。
我想测试通常使用 OpenGL 呈现 window 的应用程序。相反,我希望它呈现为图像文件以供进一步评估。我想在没有 GPU 的 Linux 服务器上执行此操作。
如何在对评估的应用程序影响最小的情况下执行此操作?
为了清楚起见,一些备注:
- OpenGL 版本为 2.1,因此应该可以使用 Mesa 进行软件渲染。
- 我最好不想更改任何应用程序代码。如果有一个解决方案可以让我模拟 X 服务器或类似的东西,我会更喜欢它。
- 我不想更改任何渲染代码。如果真的有必要,我可以改变我初始化 OpenGL 的方式,但在那之后,我想执行任意 OpenGL 代码。
理想情况下,您的回答将解释如何在无头 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
也行。
我想为视频游戏创建一个自动渲染测试框架。
我想测试通常使用 OpenGL 呈现 window 的应用程序。相反,我希望它呈现为图像文件以供进一步评估。我想在没有 GPU 的 Linux 服务器上执行此操作。
如何在对评估的应用程序影响最小的情况下执行此操作?
为了清楚起见,一些备注:
- OpenGL 版本为 2.1,因此应该可以使用 Mesa 进行软件渲染。
- 我最好不想更改任何应用程序代码。如果有一个解决方案可以让我模拟 X 服务器或类似的东西,我会更喜欢它。
- 我不想更改任何渲染代码。如果真的有必要,我可以改变我初始化 OpenGL 的方式,但在那之后,我想执行任意 OpenGL 代码。
理想情况下,您的回答将解释如何在无头 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
也行。