14.04.2013 Views

Capítulo 2: Introducción a OpenGL

Capítulo 2: Introducción a OpenGL

Capítulo 2: Introducción a OpenGL

SHOW MORE
SHOW LESS

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/

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!