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

4
我想创建一个自动化渲染测试视频游戏的框架。
我要测试一个通常使用OpenGL窗口渲染的应用程序。相反,我希望它将渲染到图像文件以进行进一步评估。我想在没有GPU的Linux服务器上执行此操作。
如何在不影响被评估应用程序的情况下完成这个任务?
以下是一些备注:
- OpenGL版本为2.1,因此可以使用Mesa进行软件渲染。 - 最好不要更改应用程序代码。如果有解决方案允许我模拟X服务器或类似的东西,那就更好了。 - 不想更改任何渲染代码。如果真的必须更改,我可以更改初始化OpenGL的方式,但之后,我想执行任意的OpenGL代码。
理想情况下,您的答案将解释如何在无头Linux服务器上设置环境,以便我启动任意的OpenGL二进制文件并将其输出渲染成图像。如果不可能,我会接受任何建议。

作为某种类型的自动化服务器端测试的一部分,我会执行这种精确的操作,该测试强调保持/增强视觉效果(需要人工审核)。我不确定这是否是最直接/简单的方法,但我通过渲染到屏幕外FBO,然后通过glGetTexImage获取结果原始纹理像素来完成。其余部分是标准图像I/O。 - user4842163
你的解决方案能在没有GPU的机器上运行吗?如果可以,你是如何设置的? - Lukas Boersma
我做的就是你所说的...唯一的区别是我使用GPU。我从未尝试过使用MESA。除了这个细节之外,我可以帮助你处理其他所有事情。 - Wagner Patriota
在我的情况下我使用GPU,但我认为如果有渲染FBO的能力,那么你就可以了。 - user4842163
哦,是的,现在我看到了我写评论时出现的另一个评论...哈哈。好吧...我基本上启动X服务器,创建OpenGL上下文,然后打开帧缓冲区...渲染到帧缓冲区,然后下载我创建的纹理。 - Wagner Patriota
相关链接:https://dev59.com/gnA75IYBdhLWcg3wo6le - Ciro Santilli OurBigBook.com
2个回答

2

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


谢谢!这听起来很简单,而且似乎有效。我没想到解决方案会如此简单。 - Lukas Boersma

1

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

另一种选择是只启动没有桌面环境的xserver,使用xinit。该设置使用经过充分测试的代码路径,更适合运行您的测试。miniglx可能存在错误,因为它不是每天都在使用。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接