我们正在尝试在一个无头的GNU / linux服务器上使用GLU的细分函数。我们想要使用PyOpenGL,但问题是在调用gluNewTess时它会崩溃(段错误)。
gdb回溯显示它出现在glGetError中,这让我想到GLU细分需要GL上下文?还是仅仅是PyOpenGL中的一些复杂性?
我尝试查找有关如何在无头(和虚拟化)机器上初始化GL上下文的信息,但没有成功。任何关于这些主题的信息都将不胜感激。
我们正在尝试在一个无头的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
https://serverfault.com/questions/186805/remote-offscreen-rendering
您可以进行屏幕外渲染。更多信息在这里。
这取决于您的图形卡和操作系统支持什么。 如果您使用的是旧的图形芯片,您可以使用Mesa操作系统库(但会得到软件渲染)。 如果它是较新的,则可以使用Pbuffers。
GLU需要一个有效的OpenGL上下文,是的(即使只使用曲面细分器调用而不使用上下文也应该是可能的)。
如果您没有窗口,这应该是可能的-但很难。请参见opengl wiki(并阅读3次,它很难跟随)。
基本思想是您需要特殊扩展来创建您的特殊无窗口上下文。因此,您必须调用wglGetExtensionsStringARB来获取此扩展。但是要能够调用它,您首先必须拥有上下文!(是的,这是一场噩梦。我曾经问过谁创建了这个API)。因此,按照通常的方式创建上下文(并希望即使没有屏幕也能正常工作),获取您的扩展名,调用wglCreateContextAttribsARB
注意:extension spec说“当支持此扩展时,调用wglCreateContext(hdc)等效于调用wglCreateContextAttribs(hdc,0,NULL)”,因此,也许只需简单地创建上下文即可。