PyOpenGL безголовый рендеринг - PullRequest
0 голосов
/ 01 февраля 2019

Я использую 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 голосов
/ 30 марта 2019

Решение состоит в том, чтобы использовать xvfb для виртуального кадрового буфера.

Проблема в том, что glfw, установленный в Ubuntu с использованием apt-get install libglfw3 libglfw3-dev, является старым и непригодным, поэтому нам нужно скомпилировать его из исходного кода.

Вот полный рабочий пример докера:

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)
0 голосов
/ 19 апреля 2019

Если вы хотите использовать OpenGL без среды отображения в linux (например, x server), лучший подход - использовать EGL.что EGL делает, это отделяет управление контекстом OpenGL от оконной системы, поэтому оно позволяет вам создавать контекст без отображаемого окна.

Если вы используете видеокарту Nvidia, вам необходимо установить собственный драйвер, чтобы использовать его.вместе с драйвером есть библиотека под названием GLVND, которая включает в себя EGL, с которой необходимо связать ваше приложение.

Пожалуйста, обратитесь к следующим ссылкам, чтобы узнать, как использовать EGL:

Совет Pro: связывание OpenGL для рендеринга на стороне сервера

EGL Eye: визуализация OpenGL без X Serve

PS.Если ваш EGL API не может найти никаких устройств, вы, вероятно, подключили неверную библиотеку EGL, библиотека EGL должна соответствовать драйверу.

0 голосов
/ 01 февраля 2019

GLFW вообще не поддерживает безголовый OpenGL.

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

GLFW не поддерживает создание контекстов без связанного окна.

Это не необычное ограничение, проблема в том, чточто нормальный способ создания контекста OpenGL - использование X-сервера.В настоящее время есть альтернативы, использующие EGL, который является относительно новым.Вам нужно будет использовать оболочку EGL для Python.

См .: OpenGL без X.org в Linux

...