Tutorial 1 - Abrir una ventana
Telon de fondo
El espectro de OpenGL no especifica ninguna API para crear y manipular ventanas. Sistemas de
ventanas modernas que soportan OpenGL incluyen un sub-sistema que proporciona la unión entre un
contexto OpenGL y el sistema de ventanas. En el sistema X Window la interfaz se llama GLX. Microsoft
proporciona WGL (pronunciado: Wiggle) para Windows y MacOS tiene CGL. Al trabajar directamente
con estas interfaces con el fin de crear una ventana en la que mostrar gráficos suele ser un trabajo duro
y por eso utilizamos una biblioteca de alto nivel que abstrae los detalles finos. La biblioteca que usamos
aquí se llama la 'OpenGL utility library', o GLUT. Proporciona una API simplificada para la gestión de
ventanas, así como la gestión de eventos, control IO y algunos otros servicios. Además, GLUT es
multiplataforma de modo que hace más fácil portabilidad. Alternativas a GLUT incluyen SDL y GLFW.
El codigo paso a paso
glutInit(&argc, argv);
Esta funcion inicializa GLUT. Los parametros pueden ser previstos directamente de la linea de
comandos y pueden incluir opciones utiles como '-sync' y '-gldebug' los cuales desactivan la naturaleza
asincrona de X y automaticamente checkean errores en GL y los muestra (respectivamente).
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
Aquí configuramos algunas opciones de GLUT. GLUT_DOUBLE permite el doble buffer (dibuja en
un búfer en segundo plano mientras se visualiza otro buffer) y el buffer de color donde la mayor
representación termina (es decir, la pantalla). Por lo general vamos a querer estos dos, así como otras
opciones que veremos más adelante.
glutInitWindowSize(1024, 768);
glutInitWindowPosition(100, 100);
glutCreateWindow("Tutorial 01");
Estas llamadas especifican los parámetros de la ventana y la crean. Usted también tiene la opción
de especificar el título de la ventana.
glutDisplayFunc(RenderSceneCB);
Dado que estamos trabajando en un sistema de ventanas la mayor parte de la interacción con el
programa en ejecución se produce a través de funciones en respuesta a determinados eventos. GLUT se
encarga de interactuar con el sistema de ventanas subyacente y nos ofrece algunas opciones de
devolución de llamada. Aquí se utiliza sólo una devolucion de llamada (callback) denominada "principal"
(RenderSceneCB) para hacer todo el renderizado de un frame. Esta función se llama continuamente por
bucle interno de GLUT.
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
Este es nuestro primer encuentro con el concepto de estado en OpenGL. La idea detrás de este
estado es que la representación es una tarea tan compleja que no puede ser tratada como una llamada
de función que recibe un par de parámetros (y funciones diseñadas correctamente nunca reciben una
gran cantidad de parámetros). Es necesario especificar shaders, buffers y diversas banderas que afectan
la forma en que la represtación se llevará a cabo. Además, usted suele desear conservar la misma pieza
de configuración a través de varias operaciones de representación (por ejemplo, si usted nunca
deshabilita la prueba de profundidad, entonces no hay necesidad de especificarla que para que ocurra