Actualización (17 de Sep. de, 2017):
NVIDIA ha publicado recientemente un artículo detailing how to use OpenGL on headless systems, que es un caso de uso muy similar a la pregunta describe.
En resumen:
- Enlace a
libOpenGL.so
y libEGL.so
en lugar de libGL.so
. (Las opciones de enlazador deben por lo tanto ser -lOpenGL -lEGL
- llamada
eglGetDisplay
, a continuación, eglInitialize
para inicializar EGL.
- llamada
eglChooseConfig
con el atributo de configuración EGL_SURFACE_TYPE
siguió con EGL_PBUFFER_BIT
.
- llamada
eglCreatePbufferSurface
, entonces eglBindApi(EGL_OPENGL_API);
, entonces eglCreateContext
y eglMakeCurrent
.
A partir de ese momento, haga su renderizado OpenGL como de costumbre, y puede modificar la superficie de su búfer de píxeles donde desee. This supplementary article from NVIDIA incluye un ejemplo básico y un ejemplo para múltiples GPU. La superficie de PBuffer también se puede reemplazar con una superficie de ventana o una superficie de mapa de píxeles, de acuerdo con 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 el año 2010, se han producido una serie de importantes reorganizaciones en el espacio de gráficos de Linux. Entonces, una respuesta actualizada:
Hoy en día, nouveau y los otros 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 en EGL objetivo, y puede ejecutarse sin la presencia de un administrador de ventanas o incluso un compositor.Para hacerlo, debe llamar al eglGetDisplay
, eglInitialize
y finalmente a eglCreateContext
y eglMakeCurrent
, en lugar de las llamadas glx habituales para hacer lo mismo.
No conozco la ruta de código específica para trabajar sin un servidor de pantalla, pero EGL acepta ambas pantallas X11 y 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 no (hasta septiembre de 2013) implementó OpenGL 3.2 Core.
Notablemente, en la Raspberry Pi y en Android, EGL y GL ES 2.0 (1.1 en Android < 3.0) son compatibles por defecto. En Raspberry Pi, no creo que Wayland funcione (a partir de septiembre de 2013), pero obtienes EGL sin un servidor de visualización con los controladores binarios incluidos. Su código EGL también debe ser portátil (con modificaciones mínimas) para iOS, si eso le interesa.
A continuación se muestra la obsoleta, puesto previamente aceptada:
Me gustaría abrir un contexto OpenGL sin X en Linux. ¿Hay alguna forma de hacerlo?
Creo que Mesa proporciona un objetivo framebuffer. Si proporciona alguna aceleración de hardware, solo será con hardware para el que haya controladores de código abierto que se hayan adaptado para admitir tal uso.
Gallium3D también es inmaduro, y el soporte para esto ni siquiera está en la hoja de ruta, hasta donde yo sé.
Me gustaría obtener una solución que funcione con tarjetas nvidia.
No hay ninguna. Período.
NVIDIA solo proporciona un controlador X, y el proyecto Nouveau sigue siendo inmaduro, y no admite el tipo de uso que está buscando, ya que actualmente se centran solo en el controlador X11.
¿Por qué necesita para hacer frente a X11? La mayoría de los kits de herramientas y bibliotecas (como, por ejemplo, libSDL) se ocupan de todos los aspectos básicos de bajo nivel para usted. – nos
@nos: libSDL adopta las mismas limitaciones que X11 impone.Por ejemplo: ¡la tableta wacom se limita a la resolución de la pantalla, mientras que la tableta tiene una resolución diez veces mayor que la que tiene la pantalla! Ratones grandes de dpi tienen problemas similares que he escuchado. – Cheery
@nos: Además, me gustaría hacer un entorno de escritorio. No estoy interesado en escribir programas. Veo que X11 es una interfaz excedente que no ayuda a mis objetivos al escribir un entorno de escritorio. Me da una interfaz grande y desordenada a cambio de muy pocas características útiles. – Cheery