Introducci´on al manejo de gr´aficos utilizando OpenGL y Qt
Eric Orellana-Romero, Cristian Duran-Faundez
Departamento de Ingenier´ıa El´ectrica y Electr´onica, Facultad de Ingenier´ıa
Universidad del B´ıo-B´ıo, Concepci´on, Chile
Email:
[email protected],
[email protected]
Document Version: 1.0.0 – Oct-2012
Resumen
En el presente trabajo se explora la API OpenGL para el manejo de gr´aficos en aplicaciones
inform´aticas. Puesto que al dise˜nar interfaces humano-m´aquina, en ocasiones, un “dibujo” o “ani-
maci´on” puede ser m´as ejemplificador para el usuario, es que se hace necesario contar con herramientas
que nos permitan construirlos aprovechando las capacidades hardware de nuestro equipo. Dado esto,
OpenGL entrega un adecuado nivel de abstracci´on para programarlas y permite generar im´agenes de
excelente calidad.
1.
Introducci´on
Antiguamente los computadores se “comunicaban” con los usuarios mediante int´erpretes de coman-
dos, siendo utilizados en tareas espec´ıficas y por unos pocos usuarios calificados. Producto de esto, y con
el fin de hacer accesible la utilizaci´on de un computador a usuarios comunes, a partir de 1980, comienza
a desarrollarse la computaci´on gr´afica, gener´andose, en 1982, el concepto “graphics machine” en la uni-
versidad de Stanford, el que fue soportado por las librer´ıas IRIS GL desarrolladas por Sillicon Graphics
Inc, las que entregaban soporte de perif´ericos (mouse, teclado, joystick) y manejo de ventanas (fue de-
sarrollada antes de los gestores de ventanas). Dado lo anterior, las empresas de hardware comenzaron a
desarrollar los primeros circuitos espec´ıficos para gr´aficos, y puesto que este tipo de tecnolog´ıa se encon-
traba en su g´enesis, no exist´ıa consenso respecto a como realizarlo, por lo que cada fabricante constru´ıa
tarjetas gr´aficas seg´un sus directivas, lo que se convirti´o en un verdadero desaf´ıo para los programadores
de software que pretend´ıan desarrollar aplicaciones compatibles con hardware de diferentes empresas,
siendo necesario escribir un driver para cada una, lo que implicaba una pr´actica costosa e ineficiente
(c´odigo redundante). Debido a esta limitante, en la d´ecada del ’90 comienza el desarrollo de una librer´ıa
gr´afica est´andar abierta para el manejo exclusivo de hardware gr´afico, por parte de empresas tales como
Silicon Graphics Inc., Microsoft, IBM Corporation, Sun Microsystems, Digital Equipment Corporation
(DEC), Hewlett-Packard Corporation, Intel e Intergraph Corporation, utilizando como base IRIS GL.
El resultado fue la publicaci´on de la versi´on 1.0 de OpenGL en Enero de 1992. Dicha librer´ıa per-
miti´o estandarizar el acceso al hardware, traspasando la responsabilidad de generar una interfaz (capa
intermedia) a los fabricantes, y delegar el manejo de ventanas al sistema operativo. Adem´as, al ser abier-
ta, permit´ıa la adaptaci´on a diferentes plataformas de manera sencilla, facultando a los programadores
para generar aplicaciones en un lenguaje com´un, independiente al hardware utilizado. Ese mismo a˜no se
funda el “ OpenGL Architecture Review Board” (ARB), organismo formado por diferentes empresas del
rubro que revisaban las especificaciones de la API. En 2003 Microsoft abandona el ARB, y en 2006 es
controlado por el grupo Khronos 1 [1], [2]. Actualmente, la API OpenGL se encuentra disponible en la
versi´on 4.3, y se distribuye bajo licencia GPL (Licencia P´ublica General), siendo soportada en sistemas
tales como GNU/Linux, MacOS X, Windows, PlayStation 3 y Unix. En cuanto al control y desarrollo,
en la actualidad es manejada por el grupo Khronos, formando parte de los miembros activos Adobe,
EA, Google, Hp, IBM, Mitsubishi Electronic, Mozilla, Sony, entre muchos otros. Cabe destacar que las
especificaciones de OpenGL permite el manejo de gr´aficos, pero no incluye funciones para la gesti´on de
1http://www.khronos.org/
1
3 OBJETOS 3D SOBRE UN PLANO 2D
ventanas [3], por lo que esta tarea es administrada por el gestor de ventanas del sistema operativo sobre
el que se est´e trabajando o a trav´es de API’s desarrolladas con este fin, como por ejemplo Qt. Adem´as, es
compatible con lenguajes de programaci´on tales como C, C++, Visual Basic, Visual Fortran y Java [4],
convirti´endola en una API poderosa y multiplataforma, lo que sumado a su gratuidad, la convierten en
una de las herramientas para manejo de gr´aficos m´as utilizada, solo igualada por DirectX de Microsoft.
2. Principales caracter´ısticas de OpenGL
OpenGL es una API de programaci´on que a partir de de primitivas geom´etricas simples, tales como
puntos, l´ıneas y pol´ıgonos, permite dibujar escenas tridimensionales complejas. Para ello oculta al pro-
gramador las caracter´ısticas de cada tarjeta gr´afica, presentando una interfaz com´un, pudiendo emular
hardware mediante software en el caso de que este no soporte alg´un tipo de funci´on. OpenGL es consid-
erada una m´aquina de estados, por lo que cualquier caracter´ısticas configurada ser´a aplicada hasta que se
especifique lo contrario. Por ejemplo, al crear una l´ınea de color blanco sobre un fondo negro, cualquier
otra figura creada, posterior a esto, ser´a de color blanco sobre un fondo negro. Cada estado tiene un valor
por defecto y cuenta con funciones para obtener su valor actual, habilitarlos, deshabilitarlos, etc. [2],[3].
Adem´as de la librer´ıa GL se cuenta con librer´ıas auxiliares que permiten el manejo de rutinas tediosas,
entre ellas se encuentran [1]:
GLU: Incluye funciones m´as complejas que GL, tales como definici´on de un cilindro o un disco con
un solo comando y operaciones con matrices. Utiliza como base GL y generalmente se distribuyen
de manera conjunta.
GLUT: Es independiente de GL y permite el control de ventanas, mouse y teclado de manera
transparente a la plataforma utilizada. Adem´as incluye funciones para la creaci´on de conos, tazas
de t´e, etc.
GLAUX: Implementa las mismas funcionalidades que GLUT, pero es exclusiva para plataformas
Windows.
GLX: Es utilizada en sistemas X-Windows (Linux) para redenderizar.
Por otro lado, existe la librer´ıa MESA, que implementa funciones equivalentes a OpenGL, pero que
no puede llamarse “derivada” puesto que no a obtenido la licencia.
3. Objetos 3D sobre un plano 2D
Una imagen en tres dimensiones mostrada mediante un computador es realmente un conjunto de
figuras dibujadas en un plano bidimensional, la pantalla. Para obtener la “ilusi´on” de tres dimensiones se
utilizan antiguos conceptos utilizados por dibujantes, tales como la perspectiva, colores, luces y sombras.
As´ı, a trav´es de ellos es posible obtener la percepci´on de volumen, como se muestra en la figura 1.
Figura 1: Percepci´on de volumen
Uno de los conceptos internalizados por OpenGL es la perspectiva, la que consiste en mostrar “profun-
didad” en la imagen mediante la modificaci´on del tama˜no de los objetos en la escena. Para ello, se utiliza
un “mapeo” del plano cartesiano que muestra las ubicaciones de los objetos en la pantalla (coordenadas
2
5
“HOLA MUNDO” EN OPENGL MEDIANTE C ´ODIGO
x e y), a una representaci´on de espacio (coordenadas x, y y z) a trav´es de manipulaci´on de matrices,
concepto de proyecci´on en perspectiva mostrado en la figura 2 [3].
Figura 2: Proyecci´on en perspectiva
4.
Instalaci´on de OpenGL en sistemas GNU/Linux
La instalaci´on de la API en el sistema se puede llevar a cabo de dos maneras. La primera es descargando
las librer´ıas directamente desde su p´agina2 o a trav´es de los repositorios de Debian. La primera opci´on suele
ser complicada y dif´ıcil de ejecutar, ya que no se cuenta con instaladores y deben ser compiladas total o
parcialmente, mientras que al instalarlas desde los repositorios es posible utilizar aptitude, simplificando
la complejidad. Dado esto, se utiliza la segunda opci´on, instalado los paquetes necesarios mediante la
siguiente instrucci´on (notar que para instalar paquetes se debe tener permiso de administrador).
# aptitude install freeglut3 - dev libgl1 - mesa - dev libglu1 - mesa - dev libice - dev libpthread -
stubs0 libpthread - stubs0 - dev libsm - dev libx11 - dev libxau - dev libxcb1 - dev libxdmcp - dev
libxext - dev libxt - dev mesa - common - dev x11proto - core - dev x11proto - input - dev x11proto -
kb - dev x11proto - xext - dev xtrans - dev
NOTA: Al realizar la instalaci´on mediante aptitude es posible solo especificar el paquete freeglut3-
dev para ser instalado, los dem´as son marcados como dependencias e instalados autom´aticamente por el
gestor.
5. “Hola Mundo” en OpenGL mediante c´odigo
Al utilizar las librer´ıas de OpenGL, el programa m´as simple que puede crearse es un triangulo contenido
en una ventana. Es por esto que es nombrado como el Hola Mundo de la API. Por ser el primer ejemplo
en ser explicado, se lleva a cabo utilizando un editor de texto, que en este caso ser´a gedit y se compila
manualmente desde consola. La primera funci´on a implementar es la encargada de dibujar el triangulo,
llamada display(), y se define seg´un el c´odigo a continuaci´on.
1 void display ()
2 {
3 glClear ( G L _ C O L O R _ B U F F E R _ B I T ) ;
4 glBegin ( G L _ T R I A N G L E S ) ;
5
glColor3f (0 ,0 ,0) ;
glVertex3f (0 ,1 ,0) ;
glVertex3f ( -1 , -1 ,0) ;
glVertex3f (1 , -1 ,0) ;
6
7
8
9 glEnd () ;
10 glFlush () ;
11 }
Para dibujar cualquier pol´ıgono, las funciones que indican las caracter´ısticas de estos, deben estar con-
tenidas entre las instrucciones glBegin(pol´ıgono ) (indicando que tipo de pol´ıgono se utilizar´a) y glEnd(),
2http://www.opengl.org/resources/libraries/glut/glut_downloads.php#2
3
5
“HOLA MUNDO” EN OPENGL MEDIANTE C ´ODIGO
como se muestra en las l´ıneas 5 y 10 del c´odigo anterior. Existen diversos tipos de pol´ıgonos, entre los m´as
utilizados GL POINTS, GL LINES, GL POLYGON, GL QUADS, GL TRIANGLES, GL TRIANGLES STRIP
y GL QUAD STRIP, una explicaci´on detallada de cada uno puede ser encontrada en [5, p. 14]. Para el
ejemplo dado se utiliza GL TRIANGLES, cuya func
Comentarios de: Introducción al manejo de gráficos utilizando OpenGL y Qt (0)
No hay comentarios