15

我们正在尝试在无头的 GNU/linux 服务器上使用 GLU 的曲面细分功能。我们想为此使用 PyOpenGL,但问题是它在调用 gluNewTess 时崩溃(分段错误)

gdb backtrace 说它在 glGetError 中,这让我认为 GLU tesselation 需要 GL 上下文?或者它只是 PyOpenGL 中的一些错综复杂的东西?

我试图找到一些关于如何在无头(和虚拟化)机器上初始化 GL 上下文的信息,但没有运气。感谢您提供有关这些主题的任何信息。

4

6 回答 6

14

最简单的:

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

而不是 glxgears,替换为您的程序,并将“glutInit()”粘贴到您的 python 代码中以获得基本的 GL 窗口。

更难:

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

最难的:

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

于 2012-01-22T14:10:44.243 回答
2

VJovic 链接上的大多数选项都不是硬件加速的,并且所有这些选项都被弃用,以支持 OpenGL 帧缓冲区对象扩展(注意日期:1997 年!)。此外,屏幕外渲染并不是完整的解决方案,正如 Calvin1602 所指出的,您需要一个 openGL 上下文(OSMesa 除外,它使用软件渲染)。

我们的研究实验室已经做了大约一年的无头 opengl 渲染(你可以在这里查看我的相关 serverfault 问题),我们发现最简单的事情就是让用户远程访问服务器的本地 X 屏幕。缺点:(a)如果操作不当,某些人认为远程访问 x-server 是一种不好的安全做法,并且(b)它会打开一个虚拟窗口,会在服务器的显示屏上弹出,但如果它是无头的,这应该没关系。如果您有兴趣,ServerFault 链接中也描述了一些其他选项。

您需要在服务器上运行 x-screen,并且应该注意,如果您想启动 x-screen,某些视频卡需要连接物理监视器。NVidia 驱动程序允许您使用xorg.conf 中的 ConnectedMonitor 选项解决此问题。. 我过去使用的另一个选项是构建一个虚拟监视器插件。这使系统认为连接了 CRT 显示器。可能还有其他解决方案。

祝你好运!

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

于 2012-01-13T16:55:43.927 回答
2

我对此进行了实验,是的,看来您可以。我设法让它在 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

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

于 2018-11-04T14:24:03.547 回答
1

You can do off-screen rendering. More about it here.

It depends what is supported by your graphical card and the OS. If you got old graphical chip, you can use mesa OS library (but you get software rendering). If it is newer, you can use pbuffers.

于 2011-06-08T17:31:56.500 回答
1

我一直在使用没有 OpenGL 上下文的 glu tesselator,这适用于 Windows 和 Linux(不是使用 python,而是使用 C++),所以理论上是可能的。如果您在 gluTessCallback() 中设置错误回调,请参阅红皮书,它可能不会调用 glGetError。

于 2014-02-10T15:16:34.623 回答
0

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),所以也许,也许你可以赌一个简单的上下文创建。

于 2011-06-09T08:06:35.627 回答