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

17

我们正在尝试在一个无头的GNU / linux服务器上使用GLU的细分函数。我们想要使用PyOpenGL,但问题是在调用gluNewTess时它会崩溃(段错误)。

gdb回溯显示它出现在glGetError中,这让我想到GLU细分需要GL上下文?还是仅仅是PyOpenGL中的一些复杂性?

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

6个回答

16

最简单的方法:

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

不要使用glxgears,用你的程序替换它,并在你的Python代码中添加'glutInit()'以获得基本的GL窗口。

更难的方法:

重新编写你的程序,使用OSMesa库创建一个GL上下文。

最难的方法:

从GLU tesselator中提取核心部分并将其插入到你的项目中(下载MesaLib源代码)。


我应该更新一下,因为人们已经剥离了GLU镶嵌器,如果我没记错的话,它被称为libtess。还有一个更简单的镶嵌器叫做“earcut”,来自Mapbox组织。 - don bright

4

我尝试过,可以实现。我在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

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

3
VJovic的链接中大部分选项都不支持硬件加速,所有这些选项都已经过时,推荐使用OpenGL Framebuffer Object扩展(请注意日期:1997年!)。而且,离屏渲染并不是完整的解决方案,正如Calvin1602所指出的那样,你需要一个OpenGL上下文(除了使用软件渲染的OSMesa外)。
我们的研究实验室已经进行了大约一年的无头OpenGL渲染(您可以在这里看到我的相关serverfault问题),我们发现最简单的方法就是给用户远程访问服务器的本地X屏幕。缺点是:(a)如果操作不当,给x-server远程访问被认为是不良的安全做法,(b)会在服务器的显示器上弹出一个虚拟窗口,但如果是无头的话,这应该不重要。如果您感兴趣,ServerFault链接中还有其他几个选项。
您需要在服务器上运行一个X屏幕,需要注意的是,如果您想启动X屏幕,则某些视频卡需要连接物理监视器。 NVidia驱动程序允许您使用xorg.conf中的ConnectedMonitor选项来解决此问题。 我过去使用的另一种选择是构建一个虚拟监视器插头,使系统认为已连接了CRT监视器。 这里可能还有其他解决方案。祝好运!

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


1

您可以进行屏幕外渲染。更多信息在这里

这取决于您的图形卡和操作系统支持什么。 如果您使用的是旧的图形芯片,您可以使用Mesa操作系统库(但会得到软件渲染)。 如果它是较新的,则可以使用Pbuffers。


1
我已经使用了没有OpenGL上下文的glu tesselator一段时间,在Windows和Linux上可以工作(不是用Python,而是C++),因此在理论上是可能的。如果在gluTessCallback()中设置错误回调请参阅红色书,它可能不会调用glGetError。

0

GLU需要一个有效的OpenGL上下文,是的(即使只使用曲面细分器调用而不使用上下文也应该是可能的)。

如果您没有窗口,这应该是可能的-但很难。请参见opengl wiki(并阅读3次,它很难跟随)。

基本思想是您需要特殊扩展来创建您的特殊无窗口上下文。因此,您必须调用wglGetExtensionsStringARB来获取此扩展。但是要能够调用它,您首先必须拥有上下文!(是的,这是一场噩梦。我曾经问过谁创建了这个API)。因此,按照通常的方式创建上下文(并希望即使没有屏幕也能正常工作),获取您的扩展名,调用wglCreateContextAttribsARB

注意:extension spec说“当支持此扩展时,调用wglCreateContext(hdc)等效于调用wglCreateContextAttribs(hdc,0,NULL)”,因此,也许只需简单地创建上下文即可。


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