c++ - figuras - Sin ventanas OpenGL
opengl ejemplos c++ (5)
Con GLFW , puede hacer esto estableciendo una sola sugerencia de ventana <VISIBLE: FALSE>
Me gustaría tener un contexto OpenGL sin ventanas (en GNU / linux con Xorg y Windows). No voy a renderizar nada, solo llamaré funciones como glGetString
, glCompileShader
y similares.
He hecho algunas glosas pero no he encontrado nada útil, excepto crear una ventana oculta; que me parece un truco.
Entonces, ¿alguien tiene una mejor idea (para cualquier plataforma)?
EDITAR: Con Xorg pude crear y adjuntar un contexto OpenGL a la ventana raíz:
#include<stdio.h>
#include<stdlib.h>
#include<X11/X.h>
#include<X11/Xlib.h>
#include<GL/gl.h>
#include<GL/glx.h>
int main(int argc, const char* argv[]){
Display *dpy;
Window root;
GLint att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None };
XVisualInfo *vi;
GLXContext glc;
dpy = XOpenDisplay(NULL);
if ( !dpy ) {
printf("/n/tcannot connect to X server/n/n");
exit(0);
}
root = DefaultRootWindow(dpy);
vi = glXChooseVisual(dpy, 0, att);
if (!vi) {
printf("/n/tno appropriate visual found/n/n");
exit(0);
}
glc = glXCreateContext(dpy, vi, NULL, GL_TRUE);
glXMakeCurrent(dpy, root, glc);
printf("vendor: %s/n", (const char*)glGetString(GL_VENDOR));
return 0;
}
EDIT2: He escrito un breve artículo sobre opengl sin ventana (con código de muestra) basado en la respuesta aceptada.
En realidad, es necesario tener un identificador de ventana para crear un contexto de representación "tradicional" (la ventana raíz en X11 o la ventana del escritorio en Windows son buenas para esto). Se usa para obtener información de OpenGL y disponibilidad de extensiones.
Una vez que obtuviste esa información, puedes destruir el contexto de renderizado y liberar la ventana "ficticia".
Debe probar las extensiones ARB_extensions_string y ARB_create_context_profile , (descritas en estas páginas: ARB_create_context ). A continuación, puede crear un contexto de representación llamando a CreateContextAttribs , de una manera independiente de la plataforma, sin tener asociada una ventana del sistema y que solo requiera el contexto del dispositivo del sistema :
int[] mContextAttrib = new int[] {
Wgl.CONTEXT_MAJOR_VERSION, REQUIRED_OGL_VERSION_MAJOR,
Wgl.CONTEXT_MINOR_VERSION, REQUIRED_OGL_VERSION_MINOR,
Wgl.CONTEXT_PROFILE_MASK, (int)(Wgl.CONTEXT_CORE_PROFILE_BIT),
Wgl.CONTEXT_FLAGS, (int)(Wgl.CONTEXT_FORWARD_COMPATIBLE_BIT),
0
};
if ((mRenderContext = Wgl.CreateContextAttribs(mDeviceContext, pSharedContext, mContextAttrib)) == IntPtr.Zero)
throw new Exception("unable to create context");
Luego, puede asociar un objeto de búfer de cuadros o una ventana del sistema al contexto de renderizado creado, si desea renderizar (pero, según tengo entendido, solo desea compilar sombreadores).
Usar CreateContextAttribs tiene muchas ventajas:
- Es plataforma independiente
- Es posible solicitar una implementación de OpenGL específica
- Es posible solicitar una implementación OpenGL> 3.2
- Es posible forzar la opción de compatibilidad hacia adelante (el shader solo representa, ese es el camino futuro)
- Es posible seleccionar (en un contexto compatible hacia adelante solamente) un perfil de implementación de OpenGL específico (en realidad solo existe el perfil CORE, pero podría haber más en el futuro.
- Es posible habilitar una opción de depuración , incluso si no está definida cómo esta opción podría ser utilizada por la implementación real del controlador
Sin embargo, los hardware / controladores anteriores no podían implementar esta extensión, de hecho, sugiero que se escriba un código alternativo para crear un contexto retrocompatible.
Hasta que no cree una ventana, OpenGL no tiene idea de qué implementación utiliza. Por ejemplo, hay un controlador muy diferente (y una aceleración de hardware diferente) para OpenGL en una sesión remota de X-Windows frente a OpenGL en una sesión de DRI X-Windows. El soporte del lenguaje Shader puede ser diferente entre estos casos, y el resultado del compilador shader dependerá definitivamente de la implementación, así como también de los errores generados en función del agotamiento de los recursos.
Entonces, aunque crear una ventana puede no ser 100% necesario, tienes que asociar tu contexto con el hardware de gráficos (o la falta de ellos) de alguna manera, y como esto se puede hacer con una ventana, nadie se molestó en implementar un método alternativo.
Necesita una ventana para alojar el contexto y necesita un contexto para poder hacer cualquier cosa.
Si no quieres mostrar nada, haz invisible la ventana.
Si hubiera otra forma de hacerlo, se documentaría en alguna parte y se encontraría fácilmente, ya que no es un problema poco común.
Una de las cosas que he hecho, que es cierto que es un truco, para evitar la sobrecarga de crear mi propia ventana GL, es aprovechar las ventanas abiertas del proceso.
La clave para entender OpenGL es esta: todo lo que necesita para crear un contexto GL con la llamada a wglCreateContext es un DC válido.
No hay NADA en la documentación que dice que tiene que ser tuyo.
Para probar esto, apareció Worlds Of Warcraft, y aprovechando SPY ++ para obtener un identificador de ventana, luego conecté manualmente ese identificador en una llamada a GetDC, que devuelve un Contexto de Dispositivo válido, y desde allí, ejecuté el resto de mi Código GL como normal.
No hay creación de ventana GL propia.
Esto es lo que sucedió cuando hice esto con Worlds of Warcraft y Star Trek en línea https://universalbri.wordpress.com/2015/06/05/experiment-results
Entonces, para responder a su pregunta, SÍ necesita una ventana, pero no hay nada en la documentación que indique que esa ventana deba ser suya.
Ahora tenga en cuenta: No pude obtener este método para proporcionar resultados visuales válidos utilizando la ventana del escritorio, pero pude crear con éxito un DC utilizando la API getDeskTopWindow para el HWND y luego una llamada a GetDC. Entonces, si hay un procesamiento no visual para el que desea usar OpenGL, déjeme saber lo que está haciendo, tengo curiosidad, y si UD. Obtiene el método GetDesktopWindow trabajando con las imágenes, POR FAVOR vuelva a publicar en este hilo lo que hizo.
Buena suerte.
Y no dejes que nadie te diga que no se puede hacer.
Cuando hay voluntad hay un camino.