Update (17. Sep. 2017):
NVIDIA veröffentlichte kürzlich einen Artikel Detaillierte Beschreibung der Verwendung von OpenGL auf Headless-Systemen Das ist ein sehr ähnlicher Anwendungsfall wie in der Frage beschrieben.
Zusammengefasst:
- Link zu
libOpenGL.so
y libEGL.so
anstelle von libGL.so
. (Ihre Linker-Optionen sollten daher sein -lOpenGL -lEGL
- Rufen Sie an.
eglGetDisplay
entonces eglInitialize
um EGL zu initialisieren.
- Rufen Sie an.
eglChooseConfig
mit dem Attribut config EGL_SURFACE_TYPE
gefolgt von EGL_PBUFFER_BIT
.
- Rufen Sie an.
eglCreatePbufferSurface
entonces eglBindApi(EGL_OPENGL_API);
entonces eglCreateContext
y eglMakeCurrent
.
Von diesem Zeitpunkt an können Sie Ihr OpenGL-Rendering wie gewohnt durchführen und Ihre Pixelpufferoberfläche nach Belieben überblenden. Dieser ergänzende Artikel von NVIDIA enthält ein grundlegendes Beispiel und ein Beispiel für mehrere GPUs. Die PBuffer-Oberfläche kann auch durch eine Fensteroberfläche oder eine Pixmap-Oberfläche ersetzt werden, je nach den Bedürfnissen der Anwendung.
Ich bedaure, dass ich bei meiner letzten Bearbeitung nicht mehr darüber recherchiert habe, aber nun gut. Bessere Antworten sind bessere Antworten.
Seit meiner Antwort im Jahr 2010 gab es eine Reihe größerer Umwälzungen im Bereich der Linux-Grafik. Also, eine aktualisierte Antwort:
Heute sind Nouveau und die anderen DRI-Treiber so weit ausgereift, dass die OpenGL-Software stabil ist und im Allgemeinen recht gute Leistungen erbringt. Mit der Einführung der EGL-API in Mesa ist es nun möglich, OpenGL- und OpenGL ES-Anwendungen sogar auf Linux-Desktops zu schreiben.
Sie können Ihre Anwendung so schreiben, dass sie auf EGL abzielt, und sie kann ohne einen Fenstermanager oder sogar einen Compositor ausgeführt werden. Um dies zu tun, würden Sie eglGetDisplay
, eglInitialize
und schließlich eglCreateContext
y eglMakeCurrent
anstelle der üblichen glx-Aufrufe, um das Gleiche zu tun.
Ich weiß nicht, den spezifischen Code-Pfad für die Arbeit ohne einen Display-Server, aber EGL akzeptiert sowohl X11-Displays und Wayland-Displays, und ich weiß, dass es möglich ist, für EGL zu arbeiten, ohne eine. Sie können GL ES 1.1, ES 2.0, ES 3.0 (wenn Sie Mesa 9.1 oder später haben) und OpenGL 3.1 (Mesa 9.0 oder später) Kontexte erstellen. Mesa hat (Stand Sep. 2013) noch nicht OpenGL 3.2 Core implementiert.
Auf dem Raspberry Pi und auf Android werden standardmäßig EGL und GL ES 2.0 (1.1 auf Android < 3.0) unterstützt. Auf dem Raspberry Pi funktioniert Wayland noch nicht (Stand: September 2013), aber mit den mitgelieferten Binärtreibern erhalten Sie EGL ohne einen Display-Server. Ihre EGL-Code sollte auch portabel sein (mit minimalen Änderungen) zu iOS, wenn das Sie interessiert.
Nachstehend finden Sie den veralteten, zuvor akzeptierten Beitrag:
Ich würde gerne einen OpenGL-Kontext ohne X in Linux öffnen. Gibt es überhaupt eine Möglichkeit, dies zu tun?
Ich glaube, Mesa bietet ein Framebuffer-Ziel. Wenn es überhaupt Hardware-Beschleunigung bietet, dann nur mit Hardware, für die es Open-Source-Treiber gibt, die so angepasst wurden, dass sie eine solche Verwendung unterstützen.
Gallium3D ist auch unausgereift, und Unterstützung für diese ist nicht einmal auf der Roadmap, so weit ich weiß.
Ich würde gerne eine Lösung finden, die mit Nvidia-Karten funktioniert.
Es gibt keins. Punkt.
NVIDIA stellt nur einen X-Treiber zur Verfügung, und das Nouveau-Projekt ist noch nicht ausgereift und unterstützt nicht die Art der Nutzung, die Sie suchen, da sie sich derzeit nur auf den X11-Treiber konzentrieren.