Update (17. September 2017):
NVIDIA vor kurzem einen Artikel detailing how to use OpenGL on headless systems veröffentlicht, die ein sehr ähnlicher beschreibt Anwendungsfall, wie die Frage.
Zusammengefasst:
- Link zu
libOpenGL.so
und libEGL.so
statt libGL.so
. (Ihre Linker-Optionen sollten daher -lOpenGL -lEGL
- Anruf
eglGetDisplay
, werden dann eglInitialize
EGL zu initialisieren.
- Anruf
eglChooseConfig
mit dem Config-Attribute EGL_SURFACE_TYPE
mit EGL_PBUFFER_BIT
gefolgt.
- Anruf
eglCreatePbufferSurface
, dann eglBindApi(EGL_OPENGL_API);
, dann eglCreateContext
und eglMakeCurrent
.
Von diesem Punkt an, machen Sie Ihre OpenGL-Rendering wie gewohnt, und Sie können Ihre Pixel-Puffer-Oberfläche, wo immer Sie möchten, blit This supplementary article from NVIDIA enthält ein grundlegendes Beispiel und ein Beispiel für mehrere GPUs. Die PBuffer-Oberfläche kann je nach den Anforderungen der Anwendung auch durch eine Fensteroberfläche oder eine Pixmap-Oberfläche ersetzt werden.
Ich bereute, dass nicht mehr Forschung zu diesem auf meinem vorherigen Schnitt, aber oh gut. Bessere Antworten sind bessere Antworten.
Seit meiner Antwort im Jahr 2010 gab es eine Reihe von größeren Umbrüchen in der Linux-Grafik-Bereich. Also, eine aktualisierte Antwort:
Heute sind Nouveau und die anderen DRI-Treiber zu dem Punkt gereift, wo OpenGL-Software stabil ist und im Allgemeinen recht gut funktioniert. Mit der Einführung der EGL-API in Mesa ist es jetzt möglich, OpenGL- und OpenGL-ES-Anwendungen sogar auf Linux-Desktops zu schreiben.
Sie können Ihre Anwendung in Ziel-EGL schreiben und sie kann ohne den Vorhandensein eines Fenstermanagers oder sogar eines Compositors ausgeführt werden.Um dies zu tun, würden Sie eglGetDisplay
, eglInitialize
und schließlich eglCreateContext
und eglMakeCurrent
statt der üblichen glx aufrufen, um das gleiche zu tun.
Ich kenne 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 EGL ohne eine funktionieren kann. Sie können GL ES 1.1, ES 2.0, ES 3.0 (wenn Sie über Mesa 9.1 oder höher verfügen) und OpenGL 3.1 (Mesa 9.0 oder höher) Kontexte erstellen. Mesa hat den OpenGL 3.2 Core (Stand September 2013) noch nicht implementiert.
Insbesondere auf dem Raspberry Pi und auf Android werden EGL und GL ES 2.0 (1.1 auf Android < 3.0) standardmäßig unterstützt. Auf dem Raspberry Pi glaube ich nicht, dass Wayland noch funktioniert (Stand September 2013), aber Sie erhalten EGL ohne einen Display-Server, der die enthaltenen Binärtreiber verwendet. Ihr EGL-Code sollte auch portabel (mit minimaler Änderung) auf iOS sein, wenn Sie das interessiert.
Unten ist der veraltete, zuvor akzeptiert Beitrag:
Ich mag würde einen OpenGL-Kontext unter Linux ohne X zu öffnen. Gibt es überhaupt einen Weg dies zu tun?
Ich glaube, Mesa bietet ein Framebuffer-Ziel. Wenn es überhaupt eine Hardwarebeschleunigung gibt, wird es nur mit Hardware sein, für die es Open-Source-Treiber gibt, die angepasst wurden, um eine solche Verwendung zu unterstützen.
Gallium3D ist auch unreif, und die Unterstützung dafür ist nicht einmal auf der Roadmap, soweit ich weiß.
Ich möchte eine Lösung, die mit Nvidia-Karten funktioniert.
Es gibt keins. Zeitraum.
NVIDIA stellt nur einen X-Treiber zur Verfügung, und das Nouveau-Projekt ist immer noch unausgereift und unterstützt nicht die Art von Verwendung, die Sie suchen, da sie sich derzeit nur auf den X11-Treiber konzentrieren.
Warum Sie mit X11 zu tun brauchen? Die meisten Toolkits und Bibliotheken (wie zum Beispiel libSDL) kümmern sich um alle Low-Level-Goo für Sie. – nos
@nos: libSDL nimmt die gleichen Einschränkungen an, die X11 auferlegt.Zum Beispiel: Das wacom Tablet wird auf die Bildschirmauflösung beschränkt, während das Tablet selbst eine zehnmal größere Auflösung als das Display hat! Große dpi-Mäuse haben ähnliche Probleme, die ich gehört habe. – Cheery
@nos: Ich würde auch gerne eine Desktop-Umgebung machen. Nicht daran interessiert, Programme zu schreiben. Ich sehe X11 ist eine überschüssige Schnittstelle, die meine Ziele beim Schreiben einer Desktop-Umgebung nicht hilft. Es gibt mir eine große und überladene Schnittstelle im Austausch mit zu wenigen nützlichen Funktionen. – Cheery