Potresti essere interessato a un progetto chiamato Wayland
http://en.wikipedia.org/wiki/Wayland_%28display_server%29
Aggiornamento (17 settembre 2017):
NVIDIA ha recentemente pubblicato un articolo che descrive in dettaglio come utilizzare OpenGL su sistemi headless, che è un caso d'uso molto simile a quello descritto dalla domanda.
In sintesi:
- Link a
libOpenGL.so
elibEGL.so
invece dilibGL.so
. (Le opzioni del tuo linker dovrebbero quindi essere-lOpenGL -lEGL
- Chiama
eglGetDisplay
, quindieglInitialize
per inizializzare EGL. - Chiama
eglChooseConfig
con l'attributo di configurazioneEGL_SURFACE_TYPE
seguito daEGL_PBUFFER_BIT
. - Chiama
eglCreatePbufferSurface
, quindieglBindApi(EGL_OPENGL_API);
, quindieglCreateContext
eeglMakeCurrent
.
Da quel momento in poi, esegui il rendering OpenGL come al solito e puoi cancellare la superficie del buffer dei pixel dove preferisci. Questo articolo supplementare di NVIDIA include un esempio di base e un esempio per più GPU. La superficie PBuffer può anche essere sostituita con una superficie finestra o una superficie pixmap, a seconda delle esigenze dell'applicazione.
Mi dispiace di non aver fatto ulteriori ricerche su questo nella mia modifica precedente, ma vabbè. Risposte migliori sono risposte migliori.
Dalla mia risposta nel 2010, ci sono stati una serie di importanti cambiamenti nello spazio grafico di Linux. Quindi, una risposta aggiornata:
Oggi, nouveau e gli altri driver DRI sono maturati al punto in cui il software OpenGL è stabile e funziona abbastanza bene in generale. Con l'introduzione dell'API EGL in Mesa, è ora possibile scrivere applicazioni OpenGL e OpenGL ES anche su desktop Linux.
Puoi scrivere la tua applicazione per indirizzare EGL e può essere eseguita senza la presenza di un gestore di finestre o persino di un compositore. Per farlo, devi chiamare eglGetDisplay
, eglInitialize
e infine eglCreateContext
e eglMakeCurrent
, invece delle solite chiamate glx per fare lo stesso.
Non conosco il percorso del codice specifico per lavorare senza un server di visualizzazione, ma EGL accetta sia i display X11 che i display Wayland e so che è possibile che EGL funzioni senza uno. È possibile creare contesti GL ES 1.1, ES 2.0, ES 3.0 (se si dispone di Mesa 9.1 o versioni successive) e OpenGL 3.1 (Mesa 9.0 o versioni successive). Mesa non ha (a partire da settembre 2013) ancora implementato OpenGL 3.2 Core.
In particolare, su Raspberry Pi e su Android, EGL e GL ES 2.0 (1.1 su Android <3.0) sono supportati per impostazione predefinita. Sul Raspberry Pi, non credo che Wayland funzioni ancora (a partire da settembre 2013), ma ottieni EGL senza un server di visualizzazione utilizzando i driver binari inclusi. Il tuo codice EGL dovrebbe anche essere portabile (con modifiche minime) su iOS, se questo ti interessa.
Di seguito è riportato il post obsoleto precedentemente accettato:
Mi piacerebbe aprire un contesto OpenGL senza X in Linux. C'è un modo per farlo?
Credo che Mesa fornisca un obiettivo framebuffer. Se fornisce un'accelerazione hardware, sarà solo con hardware per il quale esistono driver open source che sono stati adattati per supportare tale utilizzo.
Anche Gallium3D è immaturo e il supporto per questo non è nemmeno sulla tabella di marcia, per quanto ne so.
Mi piacerebbe avere una soluzione che funzioni con le schede nvidia.
Non ce n'è uno. Punto.
NVIDIA fornisce solo un driver X e il progetto Nouveau è ancora immaturo e non supporta il tipo di utilizzo che stai cercando, poiché attualmente sono focalizzati solo sul driver X11.