Escolar Documentos
Profissional Documentos
Cultura Documentos
abril, 2007
1. Introducción __________________________________________________ 1
2. Registro de Funciones Callback___________________________________ 3
3. La librería AUX de OpenGL______________________________________ 5
3.1. Introducción ____________________________________________________ 5
3.2. Funciones de la librería AUX ______________________________________ 5
3.2.1 Inicialización_________________________________________________________5
3.2.2 Manejo de ventanas ___________________________________________________6
3.2.3 Proceso de eventos ____________________________________________________8
3.2.4 Uso del teclado y del ratón _____________________________________________10
3.2.5 Objetos predefinidos __________________________________________________13
4. La librería Glut de OpenGL _____________________________________ 15
4.1. Introducción ___________________________________________________ 15
4.2. Funciones de la librería Glut______________________________________ 16
4.2.1 Inicialización________________________________________________________16
4.2.2 Manejo de ventanas __________________________________________________18
4.2.3 Procesado de eventos _________________________________________________20
4.2.4 Manejo de menús ____________________________________________________23
4.2.5 Fuentes de texto _____________________________________________________24
4.2.6 Objetos predefinidos __________________________________________________26
5. Conclusión___________________________________________________ 27
Informática Gráfica i
ii Informática Gráfica
Lista de Figuras
Informática Gráfica v
vi Informática Gráfica
1. Introducción
Este capítulo se centra en las bibliotecas que complementan a la API OpenGL. Las dos más
conocidas son Aux y Glut, ambas acompañan a OpenGL y se pueden obtener en las diversas
versiones de ésta. Aux es la más antigua de las dos y presenta algunas limitaciones que Glut
soluciona.
Las funciones del núcleo de OpenGL se limitan a facilitar las operaciones que podrían
denominar gráficas puras, no existiendo procedimientos para el uso de matrices, funciones
cuadráticas y similares o funciones de manejo de ventanas y eventos. Es por esta razón por la
que se utilizan bibliotecas complementarias que actuarán como una extensión de OpenGL para
facilitar dichas operaciones.
Las librerías que forman la API OpenGL son:
Nombre/Prefijo
Archivos Descripción
de las Funciones
Gl.h
gl Funciones del núcleo de OpenGL.
Opengl32.lib
Glu.h
glu Librería de utilidades más comunes. Totalmente portable.
Glu32.lib
Glaux.h
Librería de recursos. Contiene funciones que facilitan
aux Glaux.dll tareas como la creación de ventanas independientes de
plataforma.
Glaux.lib
Glut.h
OpenGL Utility Toolkit. Librería de recursos posterior a la
glut Glut32.dll
Aux. Añade nuevas prestaciones.
Glut32.lib
OpenGL puede operar sobre la superficie de una ventana o bien a pantalla completa, no
incorporando función alguna para la gestión de las ventanas. Esto significa que sería preciso
recurrir al API del sistema, algo que no entra dentro de la filosofía de OpenGL por el hecho de
ser una biblioteca multiplataforma, ya que en Windows habría que usar un conjunto de
funciones totalmente distinto que en Unix o Linux para crear y mostrar una ventana, lo cual
obligaría al programador a escribir bases de código distintas para cada sistema.
La alternativa para evitar esa duplicidad de código es utilizar las bibliotecas Aux o Glut,
con funciones que facilitan la gestión de las ventanas de manera independiente al sistema
operativo. Consisten en un archivo de cabecera, la biblioteca de importación y la que incorpora
el código de las funciones.
La librería Aux es un paquete auxiliar para construir aplicaciones de ventanas, además de
incluir algunas primitivas geométricas auxiliares. La gran ventaja de este paquete es, al igual
que en OpenGL su portabilidad y sencillez.
-1-
Librerías de Recursos: Aux y Glut
De los ejemplos que se han incluido en este tema, algunos incluyen una doble versión,
estando desarrollado con la biblioteca Aux y con la biblioteca Glut. Otros ejemplos sólo están
desarrollados con una librería. Es muy sencillo saber que librería estamos usando en cada
momento ya que OpenGL tiene una notación muy descriptiva, incluyendo el prefijo de la
biblioteca a la que pertenecen las funciones, así como el número y tipo de los parámetros de la
función. Así las funciones que comienzan por aux pertenecen a la librería Aux y glut a la
librería Glut.
Entre los ejemplos se encuentra un esqueleto de un programa, un ejemplo de creación de un
objeto en 3D y un ejemplo de rotación de una figura (los tres desarrollados tanto con Aux como
con Glut). También se incluyen otros ejemplos desarrollados con una de las dos bibliotecas
donde se pueden ver más funcionalidades de cada una de ellas.
2 Informática Gráfica
De la Peña, De la Viuda y Sánchez
Informática Gráfica 3
Librerías de Recursos: Aux y Glut
4 Informática Gráfica
De la Peña, De la Viuda y Sánchez
3.1. Introducción
La librería Aux es un paquete auxiliar para construir aplicaciones de ventanas, además de
incluir algunas primitivas geométricas auxiliares. La gran ventaja de este paquete es además de
simplificar mucho el código fuente del programa, que el mismo código nos servirá tanto en
Windows como en otras plataformas.
Fue creada para facilitar el aprendizaje y escritura de programas en OpenGL sin perderse
con las particularidades de un entorno concreto.
Aux también implementa funciones para permitir operaciones específicas del sistema,
como el intercambio de buffers, la apertura de imágenes y contiene funciones para el dibujo de
algunos objetos 3D relativamente simples como esferas, cubos, toros, etc.
3.2.1 Inicialización
A diferencia de Glut, la librería Aux no necesita una función específica de inicialización para
empezar a funcionar. Sí tiene una serie de rutinas que comienzan con el prefijo auxInit que
definen las características de la ventana en la que se va a trabajar:
Informática Gráfica 5
Librerías de Recursos: Aux y Glut
A la hora de dibujar una ventana en nuestra aplicación hay que tener en cuenta la posición, el
tamaño que va a ocupar en la pantalla y el título que le queremos dar. Para todo esto se usan las
funciones introducidas en el apartado anterior.
La función auxInitPosition(), permite seleccionar el tamaño y la posición de la
ventana que se cree a continuación. Recibe cuatro argumentos, los dos primeros (x e y) indican
las coordenadas donde se situará la esquina superior izquierda de la ventana, tomando como
referencia la esquina superior izquierda del monitor. Y los dos siguientes el ancho y el alto de la
6 Informática Gráfica
De la Peña, De la Viuda y Sánchez
Borrado de la ventana
Una vez se tiene creada la ventana en pantalla ya se dispone de un espacio físico para dibujar.
OpenGL ofrece una gran variedad de funciones de primitivas geométricas, de hecho, las rutinas
de este apartado no pertenecen a Aux pero son fundamentales para la gestión y manejo de
ventanas.
La función glClearColor() selecciona los valores de color y alfa para borrar los
buffers de color. Su uso combinado con glClear()permite establecer un color de fondo
para la ventana o borrar el contenido de la misma sobrescribiéndola de un solo color. El
primer parámetro es la componente roja de color de relleno, el segundo la verde, el tercero
la azul y el cuarto la componente alfa (nivel de transparencia u opacidad).
En OpenGL los colores se representan como una mezcla de rojo, verde y azul, el valor para
cada componente del color es un número decimal que oscila entre 0 y 1. Este valor se
corresponde internamente al más cercano de los existentes en el hardware de video y la paleta
del sistema operativo que se tenga instalada. La cantidad de tonos que permite OpenGL sólo
está limitada por el hardware. La componente alfa se usa para efectos especiales.
// Establece el buffer de color a amarillo
glClearColor(1.0f, 1.0f, 0.0f, 1.0f);
Con la función anterior únicamente se ha establecido el color con el queremos limpiar la
pantalla pero todavía no se aprecian resultados. Se ha mencionado que OpenGL trabaja con
buffers, y esta función limpia un buffer en particular o una combinación de ellos según se le
pase por argumentos.
Carga de imágenes
Esta librería propone como funciones de carga de imágenes en OpenGL las siguientes::
AUX_RGBImageRec * APIENTRY auxRGBImageLoad(LPCSTR);
AUX_RGBImageRec * APIENTRY auxDIBImageLoad(LPCSTR);
Informática Gráfica 7
Librerías de Recursos: Aux y Glut
Ambas reciben como argumento una cadena con el nombre de la imagen. No son muy
utilizadas ya que hay otras librerías creadas, mucho más eficaces en la carga de imágenes en
OpenGL.
Cerrado y destrucción
Como funciones de cerrado explícito de la ventana y salida del programa la librería Aux cuenta
con las funciones:
void APIENTRY auxCloseWindow(void);
void APIENTRY auxQuit(void);
La tarea interactiva más simple que implementa la librería auxiliar de OpenGL es permitir
que se controle la ejecución de la aplicación gráfica mediante un bucle principal de
visualización, que mantiene la ventana en pantalla hasta que el usuario pulse la tecla <Escape>.
El bucle principal de visualización espera a que se produzcan eventos de usuario (mover o
cambiar el tamaño de una ventana, pulsar un botón del ratón o pulsar una tecla), y cada vez que
se produce un evento, lo atiende y ejecuta una rutina “display” encargada de redibujar los
objetos en la escena. El formato de la orden es:
void auxMainLoop(void (*displayFunc)(void));
8 Informática Gráfica
De la Peña, De la Viuda y Sánchez
programa permanezca ocioso. Su uso junto con la función anterior permite realizar
animaciones simples. Se le pasa una función Callback como argumento. Para deshabilitar la
ejecución del proceso ocioso se le pasa NULL como argumento.
La función glFlush(), de la librería GL, permite gestionar la cola de instrucciones del
programa. Su invocación consigue que se ejecuten las sentencias OpenGL que se
encuentran en la cola esperando. El funcionamiento interno de OpenGL utiliza un canal de
generación de imágenes con procesamiento secuencial. Las sentencias del programa
OpenGL se almacenan en una cola hasta que el servidor OpenGL puede procesarlas. En
dibujos muy complejos esto supone una gran mejora de prestaciones.
Los posibles eventos que puede atender OpenGL se dividen en tres grupos:
Eventos de ventana
Eventos de teclado
Informática Gráfica 9
Librerías de Recursos: Aux y Glut
La orden auxKeyFunc de la librería AUX especifica la rutina de servicio a ejecutar cada vez
que se pulsa una de las teclas incluidas en el conjunto de teclas manejables descrito
anteriormente. El formato de la orden es el siguiente:
void auxKeyFunc(GLint key, void (*function)(void));
El argumento function es un puntero a la función que actúa como rutina de servicio,
definida sin parámetros. Esta función se ejecutará cuando se pulse la tecla especificada por el
argumento key. Para indicar la tecla utilizaremos las constantes predefinidas al efecto en
glaux.h que se verán mas adelante.
Los eventos de teclado se suelen utilizar para aplicar transformaciones a un objeto o
modificar los parámetros característicos de la vista definida.
Eventos de ratón
Recibe el código asociado a la tecla deseada y una función Callback que establecerá la
función a llevar a cabo cuando la tecla sea pulsada. OpenGL tiene definidas una serie de
constantes para las distintas teclas:
#define AUX_RETURN 0x0D #define AUX_L 'L' #define AUX_d 'd' #define AUX_v 'v'
10 Informática Gráfica
De la Peña, De la Viuda y Sánchez
#define AUX_ESCAPE 0x1B #defineAUX_M 'M' #define AUX_e 'e' #define AUX_w 'w'
#define AUX_SPACE 0x20 #define AUX_N 'N' #define AUX_f 'f' #define AUX_x 'x'
#define AUX_LEFT 0x25 #define AUX_O 'O' #define AUX_g 'g' #define AUX_y 'y'
#define AUX_UP 0x26 #define AUX_P 'P' #define AUX_h 'h' #define AUX_z 'z'
#define AUX_RIGHT 0x27 #define AUX_Q 'Q' #define AUX_i 'i' #define AUX_0 '0'
#define AUX_DOWN 0x28 #define AUX_R 'R' #define AUX_j 'j' #define AUX_1 '1'
#define AUX_A 'A' #define AUX_S 'S' #define AUX_k 'k' #define AUX_2 '2'
#define AUX_B 'B' #define AUX_T 'T' #define AUX_l 'l' #define AUX_3 '3'
#define AUX_C 'C' #define AUX_U 'U' #define AUX_m 'm' #define AUX_4 '4'
#define AUX_D 'D' #define AUX_V 'V' #define AUX_n 'n' #define AUX_5 '5'
#define AUX_E 'E' #define AUX_W 'W' #define AUX_o 'o' #define AUX_6 '6'
#define AUX_F 'F' #define AUX_X 'X' #define AUX_p 'p' #define AUX_7 '7'
#define AUX_G 'G' #define AUX_Y 'Y' #define AUX_q 'q' #define AUX_8 '8'
#define AUX_H 'H' #define AUX_Z 'Z' #define AUX_r 'r' #define AUX_9 '9'
Ejemplo del código que se debe insertar en el main de la aplicación para usar las teclas de
desplazamiento:
// Asociar funciones de movimiento para las teclas W,S,A,D
auxKeyFunc(AUX_a, accionIzquierda);
auxKeyFunc(AUX_d, accionDerecha);
auxKeyFunc(AUX_w, accionArriba);
auxKeyFunc(AUX_s, accionAbajo);
Informática Gráfica 11
Librerías de Recursos: Aux y Glut
2º) Cuando se debe realizar la acción asociada (al pulsar o al liberar el botón)
#define AUX_MOUSEDOWN 16
#define AUX_MOUSEUP 32
12 Informática Gráfica
De la Peña, De la Viuda y Sánchez
#define AUX_WINDOWY 1
// Para eventos de ratón
#define AUX_MOUSEX 0
#define AUX_MOUSEY 1
#define AUX_MOUSESTATUS 3
// Para eventos de teclado
#define AUX_KEY 0
#define AUX_KEYSTATUS 1
Informática Gráfica 13
Librerías de Recursos: Aux y Glut
Estas rutinas dibujan las distintas primitivas en modo alámbrico, igualmente existen otras
similares para el dibujo en modo sólido:
void APIENTRY auxSolidSphere(GLdouble);
void APIENTRY auxSolidCube(GLdouble);
void APIENTRY auxSolidBox(GLdouble, GLdouble, GLdouble);
void APIENTRY auxSolidTorus(GLdouble, GLdouble);
void APIENTRY auxSolidCylinder(GLdouble, GLdouble);
void APIENTRY auxSolidIcosahedron(GLdouble);
void APIENTRY auxSolidOctahedron(GLdouble);
void APIENTRY auxSolidTetrahedron(GLdouble);
void APIENTRY auxSolidDodecahedron(GLdouble);
void APIENTRY auxSolidCone(GLdouble, GLdouble);
void APIENTRY auxSolidTeapot(GLdouble);
Todas las primitivas se encuentran centradas en el origen, y cuando los parámetros de las
órdenes son todos 1.0, todas ellas encajan en una caja con todas sus coordenadas entre -1 y 1.
No obstante, pueden utilizarse distintos valores en los parámetros para escalar las primitivas.
Por ejemplo, para dibujar un cono de radio 25.0 y altura 40.0 bastaría:
auxWireCone(25.0, 40.0);
14 Informática Gráfica
De la Peña, De la Viuda y Sánchez
GLUT es una librería relativamente pequeña y fácil de aprender. Está bien diseñada
siguiendo los pasos de su predecesora AUX. Su API es una máquina de estados, como OpenGL.
Esto significa que GLUT tiene una serie de variables de estado que duran toda la ejecución de la
aplicación. El estado inicial de la máquina de GLUT se ha elegido razonablemente para
ajustarse a la mayor parte de aplicaciones. El programa puede modificar los valores de las
variables de estado para ajustarlas a su gusto.
Cuando se llama a una función de GLUT, su acción se modifica de acuerdo a los valores de
las variables de estado. Las funciones de GLUT son simples, tienen pocos parámetros. Nunca
devuelven punteros, y los únicos punteros pasados a las funciones de GLUT son punteros a
cadenas de caracteres y manejadores de fuentes.
Informática Gráfica 15
Librerías de Recursos: Aux y Glut
16 Informática Gráfica
De la Peña, De la Viuda y Sánchez
Opción Significado
Selecciona una ventana en modo RGBA. Es el valor por defecto
GLUT_RGBA
si no se indican ni GLUT_RGBA ni GLUT_INDEX
GLUT_RGB Lo mismo que GLUT_RGBA
Seleciona una ventana en modo de índice de colores. Se impone
GLUT_INDEX
sobre GLUT_RGBA
Selecciona una ventana en modo buffer simple. Es el valor por
GLUT_SINGLE
defecto
Selecciona una ventana en modo buffer doble. Se impone sobre
GLUT_DOUBLE
GLUT_SINGLE.
GLUT_ACCUM Selecciona una ventana con un buffer acumulativo
Selecciona una ventana con una componente alpha del buffer de
GLUT_ALPHA
color
GLUT_DEPTH Selecciona una ventana con un buffer de profundidad
GLUT_STENCIL Selecciona una ventana con un buffer de estarcido
GLUT_MULTISAMPLE Selecciona una ventana con soporte multimuestra
GLUT_STEREO Selecciona una ventana estéreo
GLUT_LUMINANCE Selecciona una ventana con un modelo de color de "luminancia".
Informática Gráfica 17
Librerías de Recursos: Aux y Glut
18 Informática Gráfica
De la Peña, De la Viuda y Sánchez
id_padre=glutCreateWindow("Ventana principal");
glutDisplayFunc(EscenaPrincipal);
...
id_hijo = glutCreateSubWindow(id_padre,0,0,600,600);
glutSetWindow(id_hijo);
glutDisplayFunc(OtraEscena);
Las siguientes rutinas completan la lista de funciones soportadas por la gestión de ventanas
en GLUT:
Informática Gráfica 19
Librerías de Recursos: Aux y Glut
20 Informática Gráfica
De la Peña, De la Viuda y Sánchez
Por ejemplo, se puede registrar "pulsar botón del ratón" como un evento para GLUT. Los
eventos se registran mediante rutinas de registro callback. Todas tienen la sintaxis
glut[algunEvento]Func, en el caso del click del ratón será glutMouseFunc.
Un registro de callback le dice a la máquina de GLUT que función definida por el usuario
se debe llamar si el correspondiente evento es activado.
Así pues, si se escribe una rutina MyMouse que especifica qué hacer cuando se pulsa el
botón izquierdo del ratón, o el botón derecho, entonces se registrará esa función callback
después de glutInit() en main() usando la sentencia: glutMouseFunc(MyMouse).
Después de registrar todos los eventos importantes de una aplicación, se debe invocar la
rutina de procesado de eventos de GLUT, glutMainLoop(). Esta función nunca vuelve, el
programa básicamente comienza un bucle infinito. Irá llamando, cuando sea necesario, a las
funciones callback que hayan sido previamente registradas. Toda función main() de una
aplicación OpenGL debe terminar en una sentencia glutMainLoop().
Por defecto, la GLUT tiene definidas funciones callbacks para cada evento posible, pero se
puede personalizar este comportamiento según las necesidades. Para hacer esto, algunas de las
funciones de las que se dispone son:
void glutDisplayFunc( void (*func) (void))
La función func(), que se le pasa como argumento será llamada cada vez que haya que
redibujar la ventana.
void glutIdleFunc( void (*func) (void))
La función que se le pasa como argumento es llamada cuando no hay entradas del usuario.
Cada vez que el procesador de eventos de GLUT da una vuelta al bucle infinito y no
encuentra ningún nuevo evento activado.
void glutReshapeFunc(void (*func) (int width, int height))
La función func(width, height) se llamará cada vez que la ventana cambie de
tamaño, y recibirá como argumentos la nueva anchura y altura.
void glutMouseFunc( void (*func) (int button, int state,
int x, int y))
Informática Gráfica 21
Librerías de Recursos: Aux y Glut
22 Informática Gráfica
De la Peña, De la Viuda y Sánchez
Informática Gráfica 23
Librerías de Recursos: Aux y Glut
24 Informática Gráfica
De la Peña, De la Viuda y Sánchez
o GLUT_BITMAP_TIMES_ROMAN_10
o GLUT_BITMAP_TIMES_ROMAN_24
o GLUT_BITMAP_HELVETICA_10
o GLUT_BITMAP_HELVETICA_12
o GLUT_BITMAP_HELVETICA_18
Informática Gráfica 25
Librerías de Recursos: Aux y Glut
26 Informática Gráfica
De la Peña, De la Viuda y Sánchez
5. Conclusión
A lo largo de todo el tema se ha pretendido dar una visión general de las dos librerías mas
importantes de OpenGL para el uso de ventanas que son independientes de plataforma, Aux y
Glut.
La librería Aux otorga un control total sobre los eventos y para la creación de ventanas.
Aux se caracteriza por su sencillez, lo cual no quiere decir que no sea completa. Unos años
después de la creación de esta librería se creó Glut, basada completamente en su predecora,
cumpliendo por lo tanto sus funciones y añadiéndole algunas más, como la creación de menús, o
llamada a subventanas.
Características:
Característica AUX GLUT
Funciones de Inicialización X X
Manejo de Ventanas X X
Manejo de Subventanas X
Procesado de Eventos X X
Objetos Predefinidos X X
Manejo de Menús X
Para concluir resaltar que las dos librerías son igual de válidas, su estructura es similar, por
lo que a la hora de diseñar cualquier programa tan solo deberemos basarnos en si vamos a
necesitar cualquiera de las opciones que añade Glut.
Si no se requieren las funcionalidades extra aportadas por Glut, se puede escoger
cualquiera de las dos, aunque lo mas recomendable es usar Glut, ya que la estructura es similar,
y se puede continuar utilizando si un día se desea ampliar las funciones de la aplicación.
Informática Gráfica 27