Puede que te interese un proyecto llamado Wayland
http://en.wikipedia.org/wiki/Wayland_%28display_server%29
Actualización (17 de septiembre de 2017):
NVIDIA publicó recientemente un artículo que detalla cómo usar OpenGL en sistemas sin periféricos, que es un caso de uso muy similar al que describe la pregunta.
En resumen:
- Enlace a
libOpenGL.so
ylibEGL.so
en lugar delibGL.so
. (Por lo tanto, sus opciones de enlace deben ser-lOpenGL -lEGL
- Llamar
eglGetDisplay
, luegoeglInitialize
para inicializar EGL. - Llamar
eglChooseConfig
con el atributo de configuraciónEGL_SURFACE_TYPE
seguido deEGL_PBUFFER_BIT
. - Llamar
eglCreatePbufferSurface
, luegoeglBindApi(EGL_OPENGL_API);
, luegoeglCreateContext
yeglMakeCurrent
.
A partir de ese momento, haga su renderizado OpenGL como de costumbre, y puede eliminar la superficie de su búfer de píxeles donde lo desee. Este artículo complementario de NVIDIA incluye un ejemplo básico y un ejemplo para varias GPU. La superficie PBuffer también se puede reemplazar con una superficie de ventana o una superficie de mapa de píxeles, según las necesidades de la aplicación.
Lamento no haber investigado más sobre esto en mi edición anterior, pero bueno. Mejores respuestas son mejores respuestas.
Desde mi respuesta en 2010, ha habido una serie de cambios importantes en el espacio de gráficos de Linux. Entonces, una respuesta actualizada:
Actualmente, nouveau y los demás controladores DRI han madurado hasta el punto en que el software OpenGL es estable y funciona razonablemente bien en general. Con la introducción de la API EGL en Mesa, ahora es posible escribir aplicaciones OpenGL y OpenGL ES incluso en escritorios Linux.
Puede escribir su aplicación para apuntar a EGL, y puede ejecutarse sin la presencia de un administrador de ventanas o incluso un compositor. Para hacerlo, llamarías a eglGetDisplay
, eglInitialize
y finalmente eglCreateContext
y eglMakeCurrent
, en lugar de las habituales llamadas glx para hacer lo mismo.
No conozco la ruta de código específica para trabajar sin un servidor de pantalla, pero EGL acepta pantallas X11 y pantallas Wayland, y sé que es posible que EGL funcione sin una. Puede crear contextos GL ES 1.1, ES 2.0, ES 3.0 (si tiene Mesa 9.1 o posterior) y OpenGL 3.1 (Mesa 9.0 o posterior). Mesa aún no ha implementado (hasta septiembre de 2013) OpenGL 3.2 Core.
En particular, en Raspberry Pi y en Android, EGL y GL ES 2.0 (1.1 en Android <3.0) son compatibles de forma predeterminada. En Raspberry Pi, no creo que Wayland funcione todavía (a partir de septiembre de 2013), pero obtienes EGL sin un servidor de visualización usando los controladores binarios incluidos. Su código EGL también debe ser portátil (con modificaciones mínimas) a iOS, si le interesa.
A continuación se muestra la publicación desactualizada y aceptada anteriormente:
Me gustaría abrir un contexto OpenGL sin X en Linux. ¿Hay alguna forma de hacerlo?
Creo que Mesa proporciona un objetivo de framebuffer. Si proporciona alguna aceleración de hardware, será solo con hardware para el que haya controladores de código abierto que se hayan adaptado para admitir dicho uso.
Gallium3D también es inmaduro, y el soporte para esto ni siquiera está en la hoja de ruta, que yo sepa.
Me gustaría obtener una solución que funcione con tarjetas nvidia.
No hay uno. Punto.
NVIDIA solo proporciona un controlador X, y el proyecto Nouveau aún está inmaduro y no es compatible con el tipo de uso que está buscando, ya que actualmente se centran solo en el controlador X11.