我可以在无头服务器上运行GLU(OpenGL)吗



我们正试图在无头GNU/linux服务器上使用GLU的镶嵌函数。我们想使用PyOpenGL来实现这一点,但问题是它在调用gluNewTess(分段故障)时崩溃

gdb回溯说它在glGetError中,这让我认为GLU镶嵌需要一个GL上下文?或者它只是PyOpenGL中的一些复杂之处?

我试图找到一些关于如何在无头(和虚拟化)机器上初始化GL上下文的信息,但没有成功。如有关于这些主题的任何信息,我们将不胜感激。

最简单:

Xvfb :5 -screen 0 800x600x24 &
export DISPLAY=:5
glxgears 

代替glxgears,替换为您的程序,并在python代码中插入一个"glutInit()"以获得一个基本的GL窗口。

更难:

使用OSMesa库重写程序以创建GL上下文

最难:

从GLU tesselator中取出内脏并将其粘贴到您的项目中(下载MesaLib源代码)

我对此进行了实验,是的,看起来你可以。我设法让它在Docker下工作。

对我来说,诀窍是运行以下程序:

RUN apt-get update && apt-get -y install libgl1 freeglut3-dev xvfb
RUN pip install -r requirements.txt
ENTRYPOINT xvfb-run -s '-screen 0 1024x768x24' ./main.py

请注意,这只允许软件渲染——虽然它可能对我的项目足够好,但对你的项目可能不够好。

VJovic链接中的大多数选项都不是硬件加速的,所有都不赞成使用OpenGL Framebuffer Object扩展(请注意日期:1997!)。此外,屏幕外渲染并不是全部解决方案,正如Calvin1602所指出的,您需要一个openGL上下文(OSMesa除外,它使用软件渲染)。

我们的研究实验室已经进行了大约一年的无头opengl渲染(你可以在这里看到我的相关服务器故障问题),我们发现最简单的事情就是让用户远程访问服务器的本地X屏幕。缺点是:(a)如果做得不对,远程访问x服务器被一些人认为是一种糟糕的安全做法,(b)它打开了一个虚拟窗口,会在服务器的显示器上弹出,但如果它是无头的,这应该无关紧要。如果您感兴趣,ServerFault链接中也介绍了一些其他选项。

您需要在服务器上运行x屏幕,需要注意的是,如果您想启动x屏幕,某些视频卡需要连接物理监视器。英伟达驱动程序允许您使用xorg.conf.中的ConnectedMonitor选项来解决这一问题。我过去使用的另一个选项是构建一个伪监视器插头。这让系统认为有一个CRT监视器。可能还有其他解决方案。

祝你好运!

https://serverfault.com/questions/186805/remote-offscreen-rendering

您可以进行屏幕外渲染。点击此处了解更多信息。

这取决于您的图形卡和操作系统支持什么。如果你有旧的图形芯片,你可以使用台面操作系统库(但你可以得到软件渲染)。如果更新,则可以使用pbuffer。

我在没有OpenGL上下文的情况下使用glu tesselator已经有一段时间了,这在Windows和Linux上都可以使用(不是python,而是C++),所以理论上是可能的。如果你在gluTessCallback()中设置错误回调,请参阅红皮书,它可能不会调用glGetError。

GLU需要一个有效的openGL上下文,是的(即使应该可以在没有上下文的情况下单独调用tesselator)。

如果你没有窗户,这应该是可能的,但很难。请参阅opengl wiki(阅读3遍,很难理解)。

基本思想是,您需要一个特殊的扩展来创建特殊的、无窗口的上下文。因此,您必须调用wglGetExtensionsStringARB才能获得此扩展。但要想命名它,你首先必须有一个上下文!(是的,这是一场噩梦。我有创建这个api的人)。因此,以通常的方式创建一个上下文(并希望它在没有屏幕的情况下也能工作),获取您的扩展,调用wglCreateContextAttribsARB

注意:扩展规范说When this extension is supported, calling wglCreateContext(hdc) is equivalent to calling wglCreateContextAttribs(hdc,0,NULL),所以也许,也许你可以用一个简单的上下文创建来打赌。

最新更新