====== OpenGL (Xtra 2) ======
===== GLUT =====
GLUT (openGL Utility Toolkit) es una librería para escribir programas con interface gráfica OpenGL de forma fácil, por lo que da la posibilidad de aprender a programar con OpenGL de una forma muy sencilla
==== Instalación y uso ====
=== En Linux ===
Podremos instalar el paquete ''freeglut'', luego para compilar utilizaremos la siguiente línea:
$ g++ -Wall -o "%e" "%f" -I/usr/include/ImageMagick/ -lglut -lGL -lGLU -lMagick++
=== En Windows ===
* {{fw:ogl:glut-3.7.6-bin.zip|GLUT 3.7.6}}
Descomprimiremos este archivo en la carpeta del proyecto y agregaremos las siguientes librerías ''opengl32.lib'' y ''glut32.lib''. Luego haremos un include de ''glut.h''.
==== Funciones ====
=== Inicio ===
* ''glutInit()'': Inicializa GLUT para ser utilizado. Debería recibir por parámetro los parámetros que recibe la función main.
* ''glutInitDisplayMode()'': Inicializa el display mode, indica cómo se mostrarán los ventanas creadas a partir de GLUT. Acepta un ''unsigned int'' como parámetro correspondiente a las distintas flags combinadas por OR (|):
* ''GLUT_RGBA''
* ''GLUT_RGB''
* ''GLUT_INDEX''
* ''GLUT_SINGLE''
* ''GLUT_DOUBLE'', double buffering.
* ''GLUT_ACCUM''
* ''GLUT_ALPHA''
* ''GLUT_DEPTH''
* ''GLUT_STENCIL''
* ''GLUT_MULTISAMPLE''
* ''GLUT_STEREO''
* ''GLUT_LUMINANCE''
=== Ventana ===
* ''glutInitWindowSize'', recibe dos ''int'' que indican el tamaño de la ventana (ancho y alto).
* ''glutInitWindowPosition'', recibe dos ''int'' que indican la posición inicial de la ventana.
* ''glutCreateWindow'', crea la ventana, recibe una cadena de carácteres correspondientes al título.
=== Dibujo ===
* ''glutDisplayFunc'', indica cual es la función encargada de dibujar. Recibe ''(void(*func)(void))'', es decir, el nombre de la función que devuelve ''void'' y no recibe parámetros.
* ''glutPostRedisplay'', ordena el redibujo.
=== Teclado ===
* ''glutKeyboardFunc'', indica la función que se llamará cuando se realice una pulsación de teclado. Recibe por parámetro el nombre de la función, teniendo que ser esta con el siguiente formato: ''(void(*func)(unsigned char key, int x, int y))''.
* ''glutKeyboardUpFunc'', con el mismo formato que la anterior, indica cuando se levanta una tecla.
=== Otras ===
* ''glutMainLoop'' función que inicia el //main loop// de glut, por lo tanto muestra la ventana, la mantiene abierta y se va llamando al bucle principal del programa.
* ''glutIdleFunc'' indica la función que se ejecutará cuando se haga una iteración del main loop.
* ''glutTimerFunc'' indica cada cuanto se ejecutará la función del main loop.
==== Ejemplos ====
=== Simple ===
#include "glut.h"
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glVertex3f(-0.5,-0.5,0.0);
glVertex3f(0.5,0.0,0.0);
glVertex3f(0.0,0.5,0.0);
glEnd();
glFlush();
}
void main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(320,320);
glutCreateWindow("3D Tech- GLUT Tutorial");
glutDisplayFunc(renderScene);
glutMainLoop();
}
===== OpenGL en Linux =====
Antes de empezar a desarrollar para Linux en OpenGL es necesario saber si nuestro sistema puede renderizar código OpenGL, para ello utilizaremos el comando ''glxinfo'' de la siguiente forma:
glxinfo | grep "rendering"
Este comando puede servirnos también para saber qué versión tenemos y la marca de los drivers:
glxinfo | grep "version"
glxinfo | grep "vendor"
Para comprobar el funcionamiento de OpenGL en Linux ejecutaremos el comando ''glxgears''. \\
En caso de no funcionar deberíamos instalar [[http://www.mesa3d.org/|Mesa 3d]].
==== X11 (X Window) ====
Al desarrollar en X11 será necesario hacer dos cosas:
* Añadir la librería ''X11'' al preprocesador compilando con: ''-lX11''
* Incluir dicha librería, con: ''#include ''
Una vez realizados los pasos anteriores podremos usar las funciones para el servidor X. Las que nos importan ahora son:
* **XOpenDisplay** para que devuelva el objeto ''Display'' sobre el que se creará la ventana, para ello le preguntamos al sistema utilizando la función ''getenv''.
* **XCloseDisplay** para liberar el objeto ''Display''.
Display *dpy = XOpenDisplay(getenv("DISPLAY"));
XCloseDisplay(dpy);
==== GLX ====
GLX es la librería que proporciona un enlace entre las X y OpenGL activando la posibilidad de dibujo 3d sobre las ventanas. Para desarrollar con esta debemos añadir la librería **GL** (compilando con ''-lGL''). \\
La versión actual de GLX es la 1.3 que corresponde a la OpenGL 1.2. \\
===== OpenGL ES =====
===== WebGL =====