我们试图在无头的GNU / linux服务器上使用GLU的tesselation函数。我们想使用PyOpenGL,但问题是它在调用gluNewTess时出现崩溃(分段错误)
gdb backtrace说它在glGetError中,这让我觉得GLU tesselation需要一个GL上下文?或者它只是PyOpenGL中的一些复杂性?
我试图找到一些关于如何在无头(和虚拟化)机器上初始化GL上下文的信息,没有运气。有关这些主题的任何信息表示赞赏。
答案 0 :(得分:10)
最简单的:
Xvfb :5 -screen 0 800x600x24 &
export DISPLAY=:5
glxgears
代替glxgears,替换为你的程序,并将'glutInit()'粘贴到你的python代码中以获得一个基本的GL窗口。
更难:
使用OSMesa库重写程序以创建GL上下文
最难:
从GLU tesselator中删除它并将其粘贴到您的项目中(下载MesaLib源代码)
答案 1 :(得分:2)
VJovic链接中的大多数选项都不是硬件加速的,而且所有中的选项都不赞成使用OpenGL Framebuffer Object扩展(注意日期:1997!)。此外,屏幕外渲染并不是整个解决方案,正如Calvin1602所说,你需要一个openGL上下文(OSMesa除外,它使用软件渲染)。
我们的研究实验室已经进行了大约一年的无头opengl渲染(you can see my related serverfault question here),我们发现最简单的事情就是让用户远程访问服务器的本地X屏幕。缺点:(a)如果做错了,某些人认为远程访问x-server是一种糟糕的安全措施,并且(b)它会在服务器的显示屏上弹出一个虚拟窗口,但是如果它是无头的,这个不应该。如果您有兴趣,还可以在ServerFault链接中描述一些其他选项。
您需要在服务器上运行x屏幕,并且应该注意,如果要启动x屏幕,某些视频卡需要连接物理监视器。 NVidia驱动程序可让您使用ConnectedMonitor option in xorg.conf.解决此问题。我过去使用的另一个选项是构建一个dummy monitor plug.,使系统认为附加了一个CRT监视器。可能还有其他解决方案。
祝你好运!
https://serverfault.com/questions/186805/remote-offscreen-rendering
答案 2 :(得分:1)
您可以进行离屏渲染。关于它的更多信息here。
这取决于您的图形卡和操作系统所支持的内容。 如果你有旧的图形芯片,你可以使用mesa OS库(但你得到软件渲染)。 如果它更新,你可以使用pbuffers。
答案 3 :(得分:1)
我一直在使用没有OpenGL上下文的glu tesselator,这适用于Windows和Linux(不是python,而是C ++),因此理论上可行。如果你在gluTessCallback()see red book中设置错误回调,它可能不会调用glGetError。
答案 4 :(得分:1)
我对此进行了试验,是的,看来可以。我设法使其在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
请注意,这仅允许软件渲染-虽然这对我的项目可能已经足够好了,但对您的项目可能并不适合。
答案 5 :(得分:0)
GLU需要一个有效的openGL上下文,是的(即使它应该可以单独使用上下文调用tesselator)。
如果你没有窗户,那应该是可能的 - 但很难。请参阅opengl wiki(并阅读3次,很难遵循)。
基本思想是您需要一个特殊的扩展来创建特殊的无窗口上下文。因此,您必须调用wglGetExtensionsStringARB来获取此扩展名。但是为了能够调用它,你必须首先拥有一个上下文! (是的,这是一场噩梦。我有谁创造了这个api)。因此,以通常的方式创建一个上下文(并希望它即使你没有屏幕就可以工作),获取你的扩展,调用wglCreateContextAttribsARB
注意:extension spec表示When this extension is supported, calling wglCreateContext(hdc) is equivalent to calling wglCreateContextAttribs(hdc,0,NULL)
,所以也许,也许你可以打赌简单的上下文创建。