Capítulo 2: Introducción a OpenGL
Capítulo 2: Introducción a OpenGL
Capítulo 2: Introducción a OpenGL
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Capítulo</strong> 2: <strong>Introducción</strong> a <strong>OpenGL</strong><br />
1. <strong>Introducción</strong><br />
1.1. Autores<br />
Rodrigo Borrego Bernabé. DNI 52.412.535-C<br />
Carmen Sánchez Gómez. DNI 07.980.715-Z
1.2. Tabla de contenidos<br />
1. <strong>Introducción</strong> ................................................................................................ 1<br />
1.1. Autores .................................................................................................. 1<br />
1.2. Tabla de contenidos .............................................................................. 2<br />
1.3. Tabla de figuras .................................................................................... 3<br />
2. Antes de comenzar ..................................................................................... 4<br />
3. ¿Qué es <strong>OpenGL</strong>? ...................................................................................... 5<br />
4. Historia ........................................................................................................ 7<br />
4.1. <strong>OpenGL</strong> ................................................................................................ 8<br />
5. Características de <strong>OpenGL</strong> ........................................................................10<br />
6. Arquitectura de <strong>OpenGL</strong> ............................................................................11<br />
6.1. <strong>OpenGL</strong> como una máquina de estado ...............................................11<br />
6.2. Flujo de renderización de <strong>OpenGL</strong> ......................................................11<br />
6.2.1. Display lists ...................................................................................12<br />
6.2.2. Evaluadores ..................................................................................12<br />
6.2.3. Operaciones Per-Vertex ................................................................12<br />
6.2.4. Ensamblado de primitivas .............................................................13<br />
6.2.5. Operaciones sobre píxeles ............................................................13<br />
6.2.6. Ensamblado de texturas ................................................................13<br />
6.2.7. Rasterización .................................................................................13<br />
6.2.8. Operaciones sobre fragmentos .....................................................13<br />
6.3. Invarianza en <strong>OpenGL</strong> .........................................................................14<br />
6.3.1. Repetibilidad ..................................................................................14<br />
6.3.2. Algoritmos multipasada .................................................................14<br />
6.3.3. Reglas de invarianza .....................................................................15<br />
7. Bibliotecas relacionadas con <strong>OpenGL</strong> .......................................................16<br />
7.1. <strong>OpenGL</strong> Utility Library (GLU) ...............................................................16<br />
7.2. GLX y WGL ..........................................................................................16<br />
7.3. AUX......................................................................................................16<br />
7.4. <strong>OpenGL</strong> Utility Toolkit (GLUT) .............................................................16<br />
8. Aplicaciones ...............................................................................................17<br />
8.1. Simulación ...........................................................................................17<br />
8.2. Juegos .................................................................................................19<br />
8.3. Ciencia y análisis .................................................................................21<br />
9. Bibliografía .................................................................................................23
1.3. Tabla de figuras<br />
Ilustración 2.1. Flujo de renderización de <strong>OpenGL</strong> ...........................................12
2. Antes de comenzar<br />
La informática gráfica es la parte de la informática que se encarga de la<br />
representación de gráficas en el ordenador y se ha convertido en el mundo de<br />
la computación en un recurso habitual para la comunicación entre los<br />
ordenadores y los usuarios.<br />
En la actualidad las implicaciones son múltiples con otros sectores y su<br />
importancia es extrema.<br />
Se encarga del almacenamiento, creación y visualización de imágenes en el<br />
ordenador. Las imágenes reales o con efectos realistas se consiguen<br />
aproximando al máximo la representación gráfica que se genera en la pantalla<br />
a las imágenes que percibe el ser humano con la vista. Para dar realismo a las<br />
imágenes se emplean técnicas de luz, colores, texturas, transparencias,<br />
brillos…<br />
<strong>OpenGL</strong> fue la primera librería gráfica que abordo el uso eficiente de esos<br />
recursos, así como la estandarización de los procedimientos de la generación<br />
de gráficos. Actualmente es un estándar sobre gráficos por computadora, uno<br />
de los más prestigiosos y utilizados del mundo.
3. ¿Qué es <strong>OpenGL</strong>?<br />
<strong>OpenGL</strong> es una especificación estándar que define una API multilenguaje y<br />
multiplataforma para escribir aplicaciones que produzcan gráficos 2D y 3D. Fue<br />
desarrollada por Silicon Graphics Inc. (SGI) en 1992.<br />
Su nombre viene del inglés Open Graphics Library, cuya traducción es<br />
biblioteca de gráficos abierta (o mejor, libre, teniendo en cuenta su política de<br />
licencias).<br />
Existen implementaciones eficientes de <strong>OpenGL</strong> suministradas por fabricantes<br />
para Mac OS, Microsoft Windows, Linux, varias plataformas Unix, y PlayStation<br />
3. También existen varias implementaciones software que permiten que<br />
<strong>OpenGL</strong> esté disponible para diversas plataformas sin soporte de fabricante.<br />
La especificación <strong>OpenGL</strong> era revisada por el <strong>OpenGL</strong> Architecture Review<br />
Board (ARB), fundado en 1992. El ARB estaba formado por un nutrido conjunto<br />
de empresas interesadas en la creación de una API consistente y ampliamente<br />
disponible, entre las que destacan, además de Silicon Graphics, grandes<br />
compañías como Compaq, IBM, Intel, Microsoft, HP, Sun Microsystems, Apple,<br />
y fabricantes de tarjetas gráficas como por ejemplo ATI, nVidia o 3D labs.<br />
El comité ARB se encarga de gestionar el estándar <strong>OpenGL</strong> para que vaya<br />
adoptando nuevas tecnologías, implementadas en un principio como<br />
extensiones; y a medida que se aceptan, integrándose en sucesivas versiones<br />
del estándar. Las extensiones no son más que llamadas a funciones que no<br />
pertenecen al estándar de <strong>OpenGL</strong>.<br />
Cuando una compañía desarrolla una nueva tecnología se la presenta al ARB.<br />
Si éste lo acepta, se añade como extensión propia de esa compañía para que<br />
se pueda utilizar en <strong>OpenGL</strong>. Se crean nuevas funciones añadiéndoles en el<br />
nombre la abreviatura de la compañía, por ejemplo ATI para ATI y NV para<br />
nVidia. Seguidamente, si varias compañías aceptan esa tecnología pasa a ser<br />
una extensión con abreviatura _EXT. Si por último el comité ARB acepta como<br />
estándar esta tecnología se cambiará el nombre siguiendo la nomenclatura del<br />
estándar.<br />
En septiembre del 2006 el comité ARB cambió de gestor, y ahora la<br />
especificación de <strong>OpenGL</strong> la controla el consorcio de industria Khronos,<br />
dedicada a la creación de API's para la creación y visualización de formatos<br />
multimedia en distintos dispositivos y plataformas. Khronos gestiona otros<br />
proyectos relacionados con <strong>OpenGL</strong> como por ejemplo <strong>OpenGL</strong> ES<br />
(Embedded System), para dispositivos móviles, portátiles, etc.<br />
<strong>OpenGL</strong> se utiliza en campos como CAD, realidad virtual, representación<br />
científica y de información, simulación de vuelo o desarrollo de videojuegos, en<br />
el que su principal competidor es Direct3D de Microsoft Windows.<br />
Es independiente del Hardware gráfico y contiene comandos que ayuda a<br />
definir objetos, aplicar transformaciones a esos objetos, cambiar sus<br />
propiedades (color, textura, lux…) entre otros. Al ser una librería gráfica hay
que saber que <strong>OpenGL</strong> no posee funciones para el control de Audio, Red o<br />
Control de Entrada.
4. Historia<br />
Antes de la aparición a <strong>OpenGL</strong>, muchos fabricantes tenían diferentes<br />
bibliotecas gráficas, esto hacia que hubiera que tratar con interfaces muy<br />
diferentes y escribir drivers específicos para cada tipo de hardware, resultando<br />
muy costoso. Para solventar esto, se subcontrataban equipos de<br />
programadores para agilizar el desarrollo, los cuales tenían que implementar<br />
manualmente el código necesario para que el programa pudiera trabajar con<br />
cada plataforma, sistema operativo y hardware diferente. Dado que cada<br />
equipo trabajaba por separado en sus interfaces, se producía mucho código<br />
redundante. También producía que la potabilidad de aplicaciones de una<br />
plataforma hardware a otra consumiera demasiado tiempo y entrañara<br />
dificultad.<br />
Al principio de los años 1990 SGI era un grupo de referencia en gráficos 3D<br />
para estaciones de trabajo. Suya era la API IRIS GL, considerada puntera en el<br />
campo y estándar de facto, llegando a eclipsar a PHIGS, basada en estándares<br />
abiertos. IRIS GL se consideraba más fácil de usar y, lo más importante,<br />
soportaba renderizado en modo inmediato. Además, PHIGS, aparte de su<br />
mayor dificultad, fue considerada inferior a IRIS GL respecto a funcionalidad y<br />
capacidad.<br />
La competencia de SGI (Sun Microsystems, Hewlett-Packard e IBM, entre<br />
otros) fue capaz de introducir en el mercado hardware 3D compatible con el<br />
estándar PHIGS mediante extensiones. Esto fue reduciendo la cuota de<br />
mercado de SGI conforme iban entrando diferentes proveedores en el<br />
mercado. Por todo ello, en un intento de fortalecer su influencia en el mercado,<br />
SGI decidió convertir el estándar IRIS GL en un estándar abierto.<br />
SGI observó que la API IRIS GL no podía ser abierta debido a conflictos de<br />
licencias y patentes; también contenía funciones no relevantes para los gráficos<br />
3D como APIs para ventanas, teclado o ratón (en parte, porque fue<br />
desarrollada antes de la aparición del X Window System o de los sistemas<br />
NeWS de Sun). Además, mientras iba madurando el soporte del mercado para<br />
el nuevo estándar, se pretendía mantener los antiguos clientes mediante<br />
bibliotecas añadidas como Iris Inventor o Iris Performer.<br />
El resultado de todo lo anterior fue el lanzamiento del estándar <strong>OpenGL</strong>, cuyas<br />
principales ventajas fueron:<br />
• Estandarizar el acceso al hardware.<br />
• Trasladar a los fabricantes la responsabilidad del desarrollo de las<br />
interfaces con el hardware.<br />
• Delegar las funciones para ventanas al sistema operativo.<br />
Con la variedad de hardware gráfico existente, lograr que todos hablasen el<br />
mismo lenguaje obtuvo un efecto importante, ofreciendo a los desarrolladores<br />
de software una plataforma de alto nivel sobre la que trabajar.
SGI lideró la creación del <strong>OpenGL</strong> Architecture Review Board (<strong>OpenGL</strong> ARB),<br />
grupo de empresas que mantendría y extendería la especificación <strong>OpenGL</strong>.<br />
<strong>OpenGL</strong> evolucionó desde IRIS GL, superando su problema de dependencia<br />
del hardware al ofrecer emulación software para aquellas características no<br />
soportadas por el hardware del que se dispusiese. Así, las aplicaciones podían<br />
utilizar gráficos avanzados en sistemas relativamente poco potentes.<br />
Durante un tiempo, se barajó la posibilidad de lanzar un producto denominado<br />
<strong>OpenGL</strong>++, que se divulgó entre unos pocos grupos interesados, pero nunca<br />
apareció finalmente como producto.<br />
Como competidor principal de <strong>OpenGL</strong> debemos mencionar a Microsoft<br />
Direct3D, que aunque solo esté disponible para sistemas Windows goza de una<br />
gran aceptación entre los fabricantes.<br />
4.1. <strong>OpenGL</strong><br />
La segunda versión es en realidad la séptima revisión desde lanzamiento de la<br />
versión 1.0.<br />
El 2 de agosto de 2006 se publicó <strong>OpenGL</strong> 2.1. Siendo completamente<br />
compatible con las versiones anteriores, aporta además nuevas características,<br />
entre las que destacan:<br />
• Sombreado programable. Con la nueva versión el núcleo de <strong>OpenGL</strong><br />
consta de sus APIs y el <strong>OpenGL</strong> Shading Language. Entre sus nuevas<br />
funcionalidades <strong>OpenGL</strong> Shading Language incluye la posibilidad de<br />
crear sombreados asociados al aspecto ("fragmentos") de la geometría<br />
("vértices") de un objeto 3D.<br />
• De una sola vez pueden aplicarse sombreados sobre diferentes<br />
renderizados y generar distintos resultados que se almacenan en<br />
buffers.<br />
• La aplicación de texturas no está condicionada por su tamaño que, a<br />
diferencia de lo que ocurría en el pasado, no tiene por qué ser potencia<br />
de dos. De esta forma ahora se soportan texturas rectangulares y se<br />
reduce el consumo de memoria.<br />
• Se pueden aplicar patrones ("stencil") sobre las dos caras de las<br />
primitivas geométricas, mejorando el rendimiento en el volumen<br />
sombreado y en los algoritmos de renderizado de geometría sólida.<br />
• "Point Sprites", puntos geométricos sobre los que se aplican texturas.<br />
Son especialmente útiles en sistemas con partículas.
Incorpora soporte para las interfaces de programación de aplicación (API) del<br />
Lenguaje de Sombreado <strong>OpenGL</strong> (<strong>OpenGL</strong> Shading Language). Con la<br />
incorporación de <strong>OpenGL</strong> Shading Language en el núcleo de <strong>OpenGL</strong>, los<br />
desarrolladores pueden estar seguros de que todas las tarjetas gráficas que<br />
soportan <strong>OpenGL</strong> 2.0 incluirán esta característica independientemente del<br />
sistema operativo.<br />
<strong>OpenGL</strong>® Shading Language ha sido ampliamente probado durante un año<br />
siguiendo los procesos de estandarización definidos por el ARB. Las<br />
potenciales aplicaciones incluyen imágenes de alta calidad para juegos,<br />
imágenes con mayor realismo para formación y simulación, mejores<br />
herramientas de análisis para visualización médica, así como entornos<br />
simulados de productos manufacturados con mejor diseño. Desde que se<br />
anunció en 2003, <strong>OpenGL</strong> Shading Language se ha convertido en el lenguaje<br />
de sombreado más utilizado para el desarrollo de aplicaciones de visualización<br />
y gráficos interactivos, con implementaciones en UNIX, Microsoft Windows,<br />
Linux y otros sistemas operativos.
5. Características de <strong>OpenGL</strong><br />
<strong>OpenGL</strong> está enfocado a la creación de contenido visual para su volcado sobre<br />
un framebuffer que luego será mostrado en pantalla (y eventualmente a la<br />
lectura de la información almacenada en ese framebuffer). No contempla el<br />
manejo de dispositivos relacionados indirectamente con la interacción gráfica<br />
con el ordenador (como el ratón o el teclado).<br />
<strong>OpenGL</strong> basa su funcionamiento en una serie de modos configurables y la<br />
ejecución de una serie de primitivas de dibujo que no son más que la<br />
realización de segmentos, polígonos, puntos o rectángulos de píxeles. Los<br />
modos se seleccionan y configuran y las operaciones se realizan mediante el<br />
envío de comandos gracias a la invocación de funciones (llamadas a métodos).<br />
Los comandos <strong>OpenGL</strong> se organizan en secuencias y su procesamiento se<br />
realiza siempre en el orden en que se reciben, aunque puede producirse un<br />
retraso entre la ejecución de un comando y la representación de sus efectos.<br />
Este comportamiento implica que la ejecución de una primitiva debe ser<br />
completada (se debe realizar por completo el trazado) antes de que cualquier<br />
otra primitiva subsecuente pueda ser invocada y pueda actuar sobre el<br />
contenido del frambuffer. Esto implica también que la obtención de información<br />
(operaciones de lectura) recupera siempre un estado consistente con la<br />
ejecución completa de los comandos <strong>OpenGL</strong> anteriormente invocados (salvo<br />
que explícitamente se especifique otro comportamiento).<br />
<strong>OpenGL</strong> proporciona mecanismos para el control directo de las operaciones<br />
fundamentales en el trabajo con gráficos en dos y tres dimensiones, incluyendo<br />
tratamiento de luces, métodos de anti-aliasing, etc. Sin embargo, no<br />
proporciona mecanismos de definición de objetos geométricos complejos, más<br />
bien permite especificar cómo dichos objetos deben ser renderizados a partir<br />
de objetos geométricos simples.<br />
El ámbito de operación de <strong>OpenGL</strong> llega hasta el framebuffer pero en ningún<br />
caso más allá. Es decir, queda bajo la responsabilidad del sistema sobre el que<br />
se ejecuta la aplicación el control de las ventanas de la aplicación, del volcado<br />
del framebuffer al monitor (y la realización de operaciones como la corrección<br />
del gamma, etc.).
6. Arquitectura de <strong>OpenGL</strong><br />
<strong>OpenGL</strong> implementa una arquitectura cliente servidor, donde un programa (el<br />
cliente) solicita comandos y dichos comandos son interpretados y procesados<br />
por el sistema <strong>OpenGL</strong> (el servidor). No es necesario que el servidor se sitúe<br />
en el mismo ordenador que el cliente, permitiendo a la especificación <strong>OpenGL</strong><br />
ser “transparente a la red”. Un mismo servidor puede mantener una serie de<br />
contextos <strong>OpenGL</strong>, representando cada uno de ellos el encapsulamiento de un<br />
estado <strong>OpenGL</strong> . Un cliente selecciona el contexto al que se desea conectar<br />
para solicitar las operaciones (y el comportamiento ante la solicitud de<br />
comandos sin estar conectado a un contexto queda sin definir).<br />
6.1. <strong>OpenGL</strong> como una máquina de estado<br />
Se ha mencionado ya implícitamente que <strong>OpenGL</strong> es una máquina de estado.<br />
Existen ciertas variables de estado como el color, por ejemplo, que determinan<br />
el estado de la máquina. Este estado puede ser modificado mediante<br />
comandos y las modificaciones se mantendrán hasta que se vuelvan a alterar<br />
las variables.<br />
Un buen número de variables de estado se refieren a modos que pueden ser<br />
habilitados o deshabilitados con los comandos glEnable() y glDisable(). Se<br />
puede comprobar el estado de un modo con glIsEnabled().<br />
Además de los modos, las variables de estado almacenan valores que pueden<br />
ser recuperados con diferentes comandos según el tipo de dato que se quiera<br />
obtener (glGetBooleanv(), glGetDoublev(), glGetFloatv(), glGetIntegerv(),<br />
glGetPointerv(), etc.). Se puede acceder a ciertas variables de estado<br />
mediante invocaciones específicas, como glGetLight*(), glGetError() o<br />
glGetPolygonStipple(). Es posible almacenar colecciones de variables de<br />
estado en pilas con los métodos glPushAttrib() o glPushClientAttrib() y<br />
recuperarlas después con glPopAttrib() o glPopClientAttrib().<br />
El listado completo de variables de estado disponibles puede ser consultado en<br />
la documentación.<br />
6.2. Flujo de renderización de <strong>OpenGL</strong><br />
La mayoría de las implementaciones de <strong>OpenGL</strong> implementan un orden de<br />
operaciones idéntico, una serie de etapas de procesamiento denominado el<br />
flujo de renderización de <strong>OpenGL</strong> (<strong>OpenGL</strong> rendering pipeline). El flujo está<br />
representado en la Ilustración 2.1, y aunque es necesario resaltar que no es<br />
una definición estricta ni obligatoria, proporciona indicaciones bastante fiables<br />
sobre el orden de las operaciones en <strong>OpenGL</strong>.
Ilustración 2.1. Flujo de renderización de <strong>OpenGL</strong><br />
Lo primero que se debe reseñar es que el flujo de datos de la información<br />
geométrica (vértices, líneas y polígonos) es distinto en una parte del proceso<br />
del flujo de la información de píxeles (píxeles, mapas de bits e imágenes). La<br />
segunda parte del proceso, sin embargo, es común para ambos tipos de datos<br />
hasta finalizar toda la información en los buffers de salida (framebuffers).<br />
6.2.1. Display lists<br />
Según el modo seleccionado, una serie de datos a mostrar pueden ser<br />
mostrados inmediatamente cuando son creados o bien almacenarlos para<br />
mostrarlos con posterioridad. Cuando su salida es retardada, se almacenan en<br />
las display list hasta que son requeridos.<br />
6.2.2. Evaluadores<br />
Las primitivas geométricas están definidas en última instancia como un<br />
conjunto de vértices. Las curvas paramétricas y las superficies están definidas<br />
por puntos de control y funciones polinómicas denominadas funciones base.<br />
Los evaluadores proporcionan los mecanismos para obtener los vértices<br />
utilizados para representar las superficies a partir de los puntos de control. El<br />
método proporciona los vértices, las coordenadas de las texturas, los colores y<br />
los valores de coordenadas espaciales.<br />
6.2.3. Operaciones Per-Vertex<br />
Antes de poder procesar la información geométrica los vértices deben ser<br />
convertidos en primitivas. Ciertos datos geométricos (por ejemplo las<br />
coordenadas espaciales) son transformados por matrices 4x4 de números<br />
reales para convertir una posición en el modelo tridimensional en una posición<br />
en la pantalla. Esta operación puede ser aún más complicada si están<br />
activadas algunas capacidades avanzadas. Es en esta fase donde se procesa<br />
la aplicación de las texturas, calculando las zonas a mostrar y su posición. Las<br />
modificaciones debidas a la iluminación también son procesadas en esta fase,
que debe tener en cuenta los vértices procesados, las superficies, la posición<br />
de los focos de luz y las propiedades de los materiales para producir la<br />
información sobre el color a mostrar.<br />
6.2.4. Ensamblado de primitivas<br />
En esta fase deben calcularse los puntos que por su posición quedan fuera de<br />
la imagen visible, esto es, aquella información geométrica que no debe ser<br />
renderizada. También deben calcularse las intersecciones entre primitivas (que<br />
pueden añadir nuevos vértices con la intersección de líneas o polígonos). Es<br />
también en esta fase cuando se realiza el procesamiento de la perspectiva.<br />
6.2.5. Operaciones sobre píxeles<br />
Como ya se ha reseñado, la información de píxeles es procesada de manera<br />
diferente. La primera operación a realizar sobre una matriz de píxeles en<br />
memoria es la conversión entre una amplia variedad de formatos a las<br />
correspondientes componentes activas. A continuación los datos son<br />
escalados, trasladados y procesados por un mapa de píxeles para enviar el<br />
resultado a la etapa de rasterización o almacenados en la memoria de texturas.<br />
El proceso puede ser inverso, esto es, es posible la extracción de los datos de<br />
los framebuffers para su conservación en la memoria del sistema.<br />
6.2.6. Ensamblado de texturas<br />
Las aplicaciones <strong>OpenGL</strong> pueden aplicar imágenes de texturas sobre los<br />
objetos geométricos para proporcionarles una apariencia más realista. Si se<br />
utilizan varias imágenes simultáneamente es aconsejable cargarlas sobre<br />
objetos de texturas de modo que se puedan intercambiar entre ellos. Algunas<br />
implementaciones destinan recursos específicos para acelerar el proceso y<br />
mejorar el rendimiento de la aplicación de texturas y existen memorias de alto<br />
rendimiento para texturas.<br />
6.2.7. Rasterización<br />
La rasterización es la conversión de los datos, tanto geométricos como de<br />
píxeles, en fragmentos. Cada cuadro en un fragmento se corresponde con un<br />
pixel en el framebuffer. Para esta conversión es necesario tener en cuenta los<br />
vértices, las líneas, las intersecciones, los tamaños de puntos, el grosor de las<br />
líneas, el modelo de sombras, la ocultación de ciertos objetos, etc. Además,<br />
cada cuadro de un fragmento debe llevar asociada una información de color.<br />
6.2.8. Operaciones sobre fragmentos
Una vez que todas las operaciones anteriores han sido realizadas y como<br />
último paso antes del volcado de los fragmentos en el framebuffer es necesario<br />
realizar una serie de operaciones que pueden alterar (o incluso descartar) los<br />
distintos fragmentos. Todas estas operaciones pueden estar habilitadas o no<br />
según el estado de la máquina <strong>OpenGL</strong>.<br />
La primera operación es la aplicación de texturas, donde para cada fragmento<br />
se genera y se aplica un texel (texture element) a partir de la memoria de<br />
texturas. A continuación se efectúan los cálculos relativos a la niebla, el test de<br />
las tijeras, el test de transparencias, la eliminación de superficies ocultas,<br />
operaciones lógicas, fusión de fragmentos, etc.<br />
6.3. Invarianza en <strong>OpenGL</strong><br />
Debido a que <strong>OpenGL</strong> no es una especificación exacta a nivel de píxel no está<br />
garantizada la coincidencia entre dos imágenes producidas por diferentes<br />
implementaciones <strong>OpenGL</strong>. Sin embargo, lo que sí está especificado es la<br />
coincidencia exacta, en ciertos casos, de imágenes producidas por la misma<br />
implementación. La invarianza está expresada en la especificación <strong>OpenGL</strong> por<br />
el cumplimiento de varias reglas.<br />
6.3.1. Repetibilidad<br />
La repetición de la misma serie de comandos partiendo de un mismo estado<br />
inicial debe producir el mismo estado final y los mismos resultados en los<br />
framebuffers.<br />
El propósito de la repetibilidad es evitar comportamientos extraños cuando se<br />
redibuje una escena con doble buffer. Estos comportamientos, si no se verifica<br />
la repetibilidad pueden ser molestos para el observador. Además, esta regla es<br />
útil para la realización de pruebas con las implementaciones.<br />
Sin embargo, así descrita la repetibilidad es una condición demasiado débil,<br />
puesto que atendiendo solo a esta regla la variación de un único y minúsculo<br />
polígono podría dar lugar a una representación con todos los píxeles diferentes.<br />
Es por ello que son necesarias reglas adicionales de invarianza para garantizar<br />
la utilidad de una implementación.<br />
6.3.2. Algoritmos multipasada<br />
Los algoritmos multipasada se caracterizan por renderizar una escena múltiples<br />
veces, cada una de ellas partiendo de un vector de modo <strong>OpenGL</strong> ligeramente<br />
diferente, para, eventualmente, producir una salida en el framebuffer. Un<br />
ejemplo de estos algoritmos sería el borrado de una primitiva del framebuffer<br />
pintándola de nuevo, bien con un color diferente (el color de fondo) o utilizando<br />
la operación lógica XOR. Estos algoritmos, en una implementación consistente
deben producir en cada renderizado resultados que difieran entre sí de manera<br />
coherente con los cambios realizados sobre el vector de modo.<br />
6.3.3. Reglas de invarianza<br />
Para un contexto <strong>OpenGL</strong> concreto:<br />
Regla 1. Para un vector de estado de la máquina <strong>OpenGL</strong> y el framebuffer<br />
y para cualquier comando <strong>OpenGL</strong> el estado de la máquina <strong>OpenGL</strong> y el<br />
framebuffer resultante debe ser idéntico en cada ejecución.<br />
Regla 2. Los cambios en una serie de valores de estado no deben generar<br />
efectos colaterales (no deben interferir con otros valores de estado). La<br />
lista de valores de estado completa puede consultarse en la<br />
especificación <strong>OpenGL</strong>, catalogados en valores de estado que deben<br />
cumplir esta regla y los que se sugiere que la cumplan.<br />
Corolario 1. La generación de fragmentos debe ser invariable con<br />
respecto a las variables de estado más significativas.<br />
Corolario 2. Las coordenadas de ventana (en las tres dimensiones) de<br />
los fragmentos generados también deben ser invariantes en sus<br />
características básicas.<br />
Regla 3. La aritmética de cada operación aplicada sobre un fragmento<br />
debe ser invariante excepto en lo relativo a parámetros que directamente<br />
controlen dicha operación.<br />
Corolario 1. Las imágenes renderizadas en diferentes buffers de color<br />
pero compartiendo el mismo framebuffer (bien simultáneamente o<br />
por separado utilizando la misma secuencia de comandos) deben<br />
ser idénticas píxel a píxel.<br />
Regla 4. El mismo sombreado debe producir el mismo resultado al ser<br />
efectuado repetidas veces sobre la misma entrada.
7. Bibliotecas relacionadas con <strong>OpenGL</strong><br />
<strong>OpenGL</strong> contiene un conjunto de poderosos pero primitivos comandos que<br />
efectúan operaciones a muy bajo nivel. Además, acciones como la apertura de<br />
una ventana en el sistema grafico u otras similares no entran en el ámbito de<br />
<strong>OpenGL</strong>. Por ello es muy habitual contar con el apoyo de algunas bibliotecas<br />
de funciones ajenas a <strong>OpenGL</strong> pero muy relacionadas con ella. Las más<br />
populares se describen a continuación:<br />
7.1. <strong>OpenGL</strong> Utility Library (GLU)<br />
Contiene bastantes rutinas que usan <strong>OpenGL</strong> a bajo nivel para realizar tareas<br />
como transformaciones de matrices para tener una orientación especifica,<br />
subdivisión de polígonos, etc. Son funciones con un nivel de abstracción por<br />
encima de <strong>OpenGL</strong> para facilitar la labor de programación de aplicaciones.<br />
Esta biblioteca suele estar incluida en las implementaciones <strong>OpenGL</strong> y sus<br />
métodos son fácilmente reconocibles porque comienzan por el prefijo glu.<br />
7.2. GLX y WGL<br />
GLX da soporte para maquinas que utilicen X Windows System y permite<br />
realizar todos los procesos gráficos relacionados con las ventanas de<br />
aplicación. WGL es el equivalente para sistemas Microsoft.<br />
7.3. AUX<br />
La biblioteca de funciones AUX fue desarrollada en la etapa inicial de desarrollo<br />
de <strong>OpenGL</strong> por SGI para server de apoyo a la creación de pequeños<br />
programas de demostración. Actualmente está declarada obsoleta y ya no está<br />
ni soportada ni actualizada. El desarrollo de aplicaciones utilizando esta<br />
biblioteca está desaconsejado, debiéndose utilizar GLUT en su lugar. AUX se<br />
describirá en profundidad en el capítulo 4.<br />
7.4. <strong>OpenGL</strong> Utility Toolkit (GLUT)<br />
Es un sistema de ventanas, escrito por Mark Kilgard, independiente del sistema<br />
usado. GLUT ofrece una interfaz común para múltiples plataformas para el<br />
manejo de ventanas, buffers, renderización de texto, entrada por teclado y<br />
menús, permitiendo a los desarrolladores utilizar un interface común para el<br />
sistema de ventanas independiente de la plataforma. Además, debido a su<br />
sencillez, tiene una suave curva de aprendizaje. GLUT es actualmente<br />
soportado por varios lenguajes, en especial ANSI C y FORTRAN.
8. Aplicaciones<br />
Existen múltiples aplicaciones para las que <strong>OpenGL</strong> ha servido como base,<br />
desarrolladas en diferentes plataformas (Windows, Unix/Linux, Mac Os, Java y<br />
Sistemas embebidos) y con diferente finalidad (simulación, juegos,<br />
salvapantallas, científicos, mapas, navegación, procesadores…).<br />
A continuación se mencionan algunas de las diferentes aplicaciones<br />
desarrollados con <strong>OpenGL</strong>, indicar que donde mayor variedad se encuentran<br />
es en la plataforma Windows y sobre todo en juegos.<br />
8.1. Simulación<br />
Aerofly<br />
Simulación de control aéreo<br />
Windows<br />
Cloth-Sim<br />
Simulador en tiempo real de ropa<br />
Windows
Biodesigner<br />
Simulación y modelación molecular<br />
Windows<br />
Dex<br />
Desarrollo, análisis y visualización<br />
de múltiples cuerpos<br />
Linux<br />
X-Vison<br />
Visualización y animación de datos<br />
en 3D<br />
Linux
8.2. Juegos<br />
Chess Commander<br />
Juego de ajedrez.<br />
Windows<br />
Jedi Academy<br />
Entrenamiento de un jedi.<br />
Windows<br />
PinBall<br />
Juego de Pinball.<br />
Windows
Follbilliard<br />
Simulación física del juego del billar<br />
Linux<br />
KhunPhan<br />
Pullze<br />
Linux
8.3. Ciencia y análisis<br />
Great Stella<br />
Estudio de poliedros<br />
Windows<br />
MVE – Medical Volume Explorer<br />
Visualización en 3D de datos<br />
médicos.<br />
Windows<br />
Visit<br />
Visualización y parametrización de<br />
múltiples datos<br />
Linux
Medit<br />
Visualización científica<br />
Linux
9. Bibliografía<br />
<strong>OpenGL</strong> Programming Guide<br />
<strong>OpenGL</strong> Programming Guide, Second Edition. Addison Wesley.<br />
Mark Segal, Kurt Akeley. The <strong>OpenGL</strong> Graphics System: A Specification,<br />
2004.<br />
Wright, Richard S.; Lipchak, Benjamin. <strong>OpenGL</strong>, 1ª Ed. Anaya Multimedia.<br />
http://www.opengl.org/<br />
http://www.sgi.com/