【问题标题】:Can I run GLU (OpenGL) on a headless server?我可以在无头服务器上运行 GLU (OpenGL) 吗?
【发布时间】:2011-09-11 00:56:38
【问题描述】:

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

gdb backtrace 说它在 glGetError 中,这让我认为 GLU tesselation 需要 GL 上下文?还是只是 PyOpenGL 中的一些复杂问题?

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

【问题讨论】:

  • 嘿,这是我的头像:D

标签: python opengl graphics triangulation glu


【解决方案1】:

最简单:

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

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

更难:

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

最难的:

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

【讨论】:

  • 我可能应该更新这个,我认为人们已经淘汰了 GLU tessellator,如果我没记错的话,它被称为 libtess。 Mapbox 组织还有一个更简单的镶嵌器,称为“earcut”。
【解决方案2】:

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

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

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

祝你好运!

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      您可以进行离屏渲染。更多相关信息here

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 2023-03-17
            • 2018-11-06
            • 1970-01-01
            • 2019-01-15
            • 1970-01-01
            • 1970-01-01
            • 2012-12-28
            • 1970-01-01
            • 2014-04-03
            相关资源
            最近更新 更多