PyOpenGL 无头渲染
PyOpenGL headless rendering
我正在使用 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 但有其他东西的解决方案也可能有效...
GLFW 根本不支持无头 OpenGL。
https://www.glfw.org/docs/latest/context.html#context_offscreen
GLFW doesn't support creating contexts without an associated window.
这不是一个不寻常的限制,问题是创建 OpenGL 上下文的正常方法是使用 X 服务器。现在有使用 EGL 的替代方案,这是相对较新的。您将需要为 Python 使用 EGL 包装器。
参见:OpenGL without X.org in linux
解决方案是将 xvfb 用于虚拟帧缓冲区。
问题是Ubuntu中使用apt-get install libglfw3 libglfw3-dev
安装的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)
如果您想在 linux(例如 x 服务器)上使用没有显示环境的 OpenGL,最好的方法是使用 EGL
。 EGL 所做的是将 OpenGL 上下文管理与 windowing 系统分开,因此它允许您创建上下文而不显示 window.
如果您使用的是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 库必须与驱动程序匹配。
我正在使用 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 但有其他东西的解决方案也可能有效...
GLFW 根本不支持无头 OpenGL。
https://www.glfw.org/docs/latest/context.html#context_offscreen
GLFW doesn't support creating contexts without an associated window.
这不是一个不寻常的限制,问题是创建 OpenGL 上下文的正常方法是使用 X 服务器。现在有使用 EGL 的替代方案,这是相对较新的。您将需要为 Python 使用 EGL 包装器。
参见:OpenGL without X.org in linux
解决方案是将 xvfb 用于虚拟帧缓冲区。
问题是Ubuntu中使用apt-get install libglfw3 libglfw3-dev
安装的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)
如果您想在 linux(例如 x 服务器)上使用没有显示环境的 OpenGL,最好的方法是使用 EGL
。 EGL 所做的是将 OpenGL 上下文管理与 windowing 系统分开,因此它允许您创建上下文而不显示 window.
如果您使用的是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 库必须与驱动程序匹配。