J'utilise PyOpenGL + glfw pour le rendu.
En essayant de faire la même chose sur une machine sans tête (par exemple un serveur) glfw.init ()
échoue:
J'ai trouvé des informations sur le rendu sans tête, mais uniquement en utilisant OpenGL directement et non via python
EDIT: Je comprends que peut-être glfw ne peut pas le supporter. Une solution sans glfw, mais avec autre chose pourrait aussi fonctionner ...
3 Réponses :
GLFW ne prend pas du tout en charge OpenGL headless.
https://www.glfw.org/docs/latest/context .html # context_offscreen
GLFW ne prend pas en charge la création de contextes sans fenêtre associée.
Ce n’est pas une limitation inhabituelle, le problème est que la manière normale de créer un contexte OpenGL consiste à utiliser le serveur X. Il existe maintenant des alternatives utilisant EGL, ce qui est relativement nouveau. Vous devrez utiliser un wrapper EGL pour Python.
La solution consiste à utiliser xvfb pour un framebuffer virtuel.
Le problème est que le glfw qui est installé dans Ubuntu en utilisant apt-get install libglfw3 libglfw3-dev
est ancien et inapte, donc nous devons le compiler à partir des sources.
Voici un exemple de docker complet:
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)
Et voici la base du code PyOpenGL pour l'utiliser:
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
Si vous souhaitez utiliser OpenGL sans environnement d'affichage sous Linux (par exemple, serveur x), la meilleure approche est d'utiliser EGL
. ce que fait EGL est de séparer la gestion du contexte OpenGL du système de fenêtrage, donc il vous permet de créer un contexte sans fenêtre d'affichage.
Si vous utilisez une carte graphique Nvidia, vous devez installer un pilote propriétaire pour pouvoir l'utiliser. avec le pilote, il y a une bibliothèque appelée GLVND
c'est une bibliothèque qui inclut EGL
votre application doit être liée.
Veuillez vous référer aux liens suivants pour savoir comment utiliser EGL
:
Conseil de pro: Lier OpenGL pour le rendu côté serveur
EGL Eye: visualisation OpenGL sans service X < / a>
PS. Si votre API EGL ne trouve aucun périphérique, vous avez probablement lié une mauvaise bibliothèque EGL, la bibliothèque EGL doit correspondre au pilote.