PyOpenGL无头渲染

时间:2019-02-01 16:59:51

标签: opengl glfw headless pyopengl

我正在使用PyOpenGL + glfw进行渲染。

尝试在无头计算机(例如服务器)上执行相同操作时,glfw.init()失败:

glfw.GLFWError: (65544) b'X11: The DISPLAY environment variable is missing'
Fatal Python error: Couldn't create autoTLSkey mapping
Aborted (core dumped)

我发现了一些有关无头渲染的信息,但仅在直接使用OpenGL而不是通过python时才使用

编辑:我了解到glfw可能不支持它。没有glfw的解决方案,但还有其他解决方案也可能有效...

3 个答案:

答案 0 :(得分:4)

GLFW完全不支持的OpenGL无头。

https://www.glfw.org/docs/latest/context.html#context_offscreen

  

GLFW不支持在没有关联窗口的情况下创建上下文。

这不是一个不寻常的限制,问题在于创建OpenGL上下文的常规方法是使用X服务器。现在有使用EGL的替代方法,这相对较新。您将需要为Python使用EGL包装器。

请参阅:OpenGL without X.org in linux

答案 1 :(得分:1)

解决方案是将xvfb用于虚拟帧缓冲区。

问题是使用apt-get install libglfw3 libglfw3-dev在Ubuntu中安装的glfw很旧且不适合,因此我们需要从源代码进行编译。

这是一个可以正常使用的docker示例:

docker run --name headless_test -ti ubuntu /bin/bash

# Inside the ubuntu shell:
apt update && apt install -y python3 python3-pip git python-opengl xvfb xorg-dev cmake
pip3 install pyopengl glfw
mkdir /projects
git clone https://github.com/glfw/glfw.git /projects/glfw
cd /projects/glfw
cmake -DBUILD_SHARED_LIBS=ON .
make
export PYGLFW_LIBRARY=/projects/glfw/src/libglfw.so
xvfb-run python3 some_script_using_pyopengl_and_glfw.py

这是使用它的PyOpenGL代码的基础:

from OpenGL.GL import *
from OpenGL.GLU import *
import glfw

glfw.init()
# Set window hint NOT visible
glfw.window_hint(glfw.VISIBLE, False)
# Create a windowed mode window and its OpenGL context
window = glfw.create_window(DISPLAY_WIDTH, DISPLAY_HEIGHT, "hidden window", None, None)
# Make the window's context current
glfw.make_context_current(window)

答案 2 :(得分:0)

如果要在Linux(例如x服务器)上不使用显示环境的情况下使用OpenGL,最好的方法是使用EGL。 EGL的作用是将OpenGL上下文管理与窗口系统分开,因此您可以在不显示窗口的情况下创建上下文。

如果使用的是Nvidia图形卡,则必须安装专有驱动程序才能使用它。与驱动程序一起,有一个名为GLVND的库,这是一个包含EGL您的应用程序需要链接到的库。

请参考以下链接以了解如何使用EGL

Pro Tip: Linking OpenGL for Server-Side Rendering

EGL Eye: OpenGL Visualization without an X Serve

PS。如果您的EGL api无法找到任何设备,则可能是链接了错误的EGL库,该EGL库必须与驱动程序匹配。