Este artículo comienza una serie
monográfica sobre OpenGL y su implementación en
Linux. Está enfocada para programadores que desean
añadir a sus programas gráficos en 2D y 3D de alta eficiencia.
OpenGL es sin lugar a dudas la API que prevalece en la industria para desarrollar aplicaciones gráficas 2D y 3D. Se le puede considerar el sucesor a la formidable IRIS GL-library de Silicon Graphics que hizo tan popular las estaciones de trabajo SGI como plataforma predilecta para desarrollo científico, de ingeniería y de efectos especiales. SGI puso en OpenGL una buena parte de su pericia para hacer una API para el futuro fácil de usar, intuitiva, portable y perceptiva a las redes. Al mismo tiempo podemos acreditar a SGI por darse cuenta de la importancia de los estándares abiertos. Varios fabricantes de software y hardware tomaron parte en la especificación de OpenGL y permanecen detrás suyo. Gracias a esto podemos decir que las aplicaciones OpenGL pueden ser fácilmente portadas a virtualmente cualquier plataforma del mercado, desde PC windows95 a nuestro glorioso sistema Linux, pasando por estaciones UNIX de alto nivel y mainframes. La Architectural Review Board (Junta de Revisión de Arquitecturas) gobierna sobre OpenGL, sus especificaciones, acepta o rechaza cambios y propone tests de conformidad.
En contraste con la antigua IRIS GL-library de SGI, OpenGL es por diseño independiente de plataformas y sistemas operativos. Es perceptiva a la red, de manera que es posible separar nuestra aplicación OpenGL en un servidor y un cliente que verdaderamente produzca los gráficos. Existe un protocolo para mover por la red los comandos OpenGL entre el servidor y el cliente. Gracias a su independencia del sistema operativo, el servidor y el cliente no tiene porque ejecutarse en el mismo tipo de plataforma, muy a menudo el servidor sera un supercomputador ejecutando una compleja simulación y el cliente una simple estación de trabajo mayormente dedicada a la visualización gráfica. OpenGL permite al desarrollador escribir aplicaciones que se puedan desplegar en varias plataformas fácilmente.
Por encima de todo, OpenGL es una biblioteca estilizada de trazado de gráficos de alto rendimiento, hay varias tarjetas gráficas aceleradoras y especializadas en 3D que implementan primitivas OpenGL a nivel hardware. Hasta hace poco, estas avanzadas bibliotecas gráficas solian ser muy caras y solo estaban disponibles para estaciones SGI u otras estaciones de trabajo UNIX. Las cosas están cambiando muy deprisa y gracias a las generosas licencias y el kit de desarrollo de controladores de SGI, vamos a ver más y más hardware OpenGL para usuarios de PCs. ¡Si, los usuarios de Linux van a poder aprovechar esta oportunidad! Una compañía denominada 3Dfx Interactive provee de una serie de tarjetas gráficas 3D y de soporte para SO Linux a través de su Glide library. Hay otro artículo en esta serie de Phillip Ross (Tarjetas Gráficas 3Dfx) que describe con detalle las tarjetas de 3Dfx disponibles para nosotros. Esto muestra un cambio de actitud por parte de algunos fabricantes de hardware que se dan cuenta por fin de que el mercado de Linux está aquí para quedarse. Los fans de Linux deberían apoyar y favorecer este tipo de iniciativas.
Para conseguir la independencia del hardware de OpenGL, no se incluyeron comandos para tareas de ventanas, ni para obtener entrada del usuario. Esto suena como un serio contratiempo pero como veremos después (veáse serie de Programación GLUT), tiene un simple arreglo. De hecho, para mantener el estilo y alto rendimiento de OpenGL, no se provee de comandos para describir modelos complejos, tales como moléculas, aeroplanos, casas, pájaros, etc. En OpenGL solo encontrarás primitivas de objetos geométricos: puntos, líneas y polígonos. El desarrollador tiene que construir sus propios modelos basándose en unas pocas y simples primitivas. Hay bibliotecas relacionadas que proveen de modelos más complejos, y cualquier usuario se puede construir las suyas.
En nuestra serie de artículos sobre programación con OpenGL usaremos la interface C para OpenGL porque es la más popular. Sin embargo el lector debería saber que hay otros bindings disponibles: FORTRAN, C++, Ada y Java . Más adelante en nuestras series, despues de que el lector se haya familiarizado con la interface C para OpenGL diremos algo sobre Open-inventor, una extensión a la biblioteca C++ para OpenGL.
Sin entrar en demasiados detalles, describiremos algunas de las características que OpenGL implementa:
- Primitivas geométricas Permiten construir descripciones matemáticas de objetos. Las actuales primitivas son: puntos, líneas, polígonos, imágenes y bitmaps.
- Codificación del Color en modos RGBA (Rojo-Verde-Azul-Alfa) o de color indexado.
- Visualización y Modelado que permite disponer objetos en una escena tridimensional, mover nuestra cámara por el espacio y seleccionar la posicíon ventajosa deseada para visualizar la escena de composición.
- Mapeado de texturas que ayuda a traer realismo a nuestros modelos por medio del dibujo de superficies realistas en las caras de nuestros modelos poligonales
- La iluminación de materiales es una parte indispensable de cualquier grágico 3D. OpenGL provee de comandos para calcular el color de cualquier punto dadas las propiedades del material y las fuentes de luz en la habitación.
- El doble buffering ayuda a eliminar el parpadeo de las animaciones. Cada fotograma consecutivo en una animación se construye en un buffer separado de memoria y mostrado solo cuando está completo.
- El Anti-alizado reduce los bordes escalonados en las líneas dibujadas sobre una pantalla de ordenador. Los bordes escalonados aparecen a menudo cuando las líneas se dibujan con baja resolución. El anti-alizado es una ténica común en gráficos de ordenador que modifica el color y la intensidad de los pixels cercanos a la línea para reducir el zig-zag artificial.
- El sombreado Gouraud es una técnica usada para aplicar sombreados suaves a un objeto 3D y producir una sutil diferencia de color por sus superfícies.
- El Z-buffering mantiene registros de la coordenada Z de un objeto 3D. El Z-buffer se usa para registrar la proximidad de un objeto al observador, y es también crucial para el eliminado de superfícies ocultas.
- Efectos atmosféricos como la niebla, el humo y las neblinas hacen que las imágenes producidas por ordenador sean más realistas. Sin efectos atmosféricos las imágenes aparecen a veces irrealmente nítidas y bien definidas. Niebla es un término que en realidad describe un algoritmo que simula neblinas, brumas, humo o polución o simplemente el efecto del aire, añadiendo profundidad a nuestras imágenes.
- El Alpha blending usa el valor Alfa (valor de material difuso) del código RGBA, y permite combinar el color del fragmento que se procesa con el del pixel que ya está en el buffer. Imagina por ejemplo dibujar una ventana transparente de color azul claro enfrente de una caja roja. El Alpha blending permite simular la transparencia de la ventana, de manera que la caja vista a través del cristal aparezca con un tono magenta.
- Los planos de plantilla permiten restringir el trazado a ciertas regiones de la pantalla.
- Las listas de Display permiten almacenar comandos de dibujo en una lista para un trazado posterior, cuando las listas de display se usan apropiadamente puedan mejorar mucho el rendimiento de nuestras aplicaciones.
- Los Evaluadores Polinómicos sirven para soportar B-splines racionales no uniformes, esto es para ayudar a dibujar curvas suaves a través de unos cuantos puntos de referencia, ahorrándose la necesidad de acumular grandes cantidades de puntos intermedios.
- Características de Feedback, Selección y Elección que ayudan a crear aplicaciones que permiten al usuario seleccionar una región de la pantalla o elegir un objeto dibujado en la misma. El modo de feedback permite al desarrollador obtener los resultados de los cálculos de trazado.
- Primitivas de Raster (bitmaps y rectángulos de pixels)
- Operaciones con Pixels
- Transformaciones: rotación, escalado, perspectivas en 3D
Como hemos mencionado para hacer OpenGL verdaderamente portable e independiente de la plataforma fue necesario sacrificar todos los comandos que interactuaban con el sistema de ventanas, por ejemplo: abrir una ventana, cerrar una ventana, escalar una ventana, dar forma a una ventana, leer la posición del cursor; y también con los dispositivos de entrada como la lectura del teclado etc.. Todas estas acciones son altamente dependientes del sistema operativo. Originalmente, la biblioteca GL tenía su propio conjunto de comandos para manejo de ventanas y periféricos pero eran específicos de IRIX (el SO UNIX de SGI). Se deja al desarrollador de OpenGL conocer su propia plataforma y tomar medidas para manejar ventanas en la plataforma nativa.
Gracias a Mark J. Kilgard de SGI hay una biblioteca adicional que evita este problema. Mark esciribió la GLUT-library, un conjunto de herramientas y utilidades que sustituyen a la antigua biblioteca AUX (no importa lo que fuese, ¡olvídala!). La biblioteca GLUT es libremente disponible, como Mesa(OpenGL), se puede encontrar código fuente para ella así como versiones binarias para Linux. La biblioteca GLUT es dependiente de la plataforma, y ofrece un paradigma común para el sistema de ventanas y dispositivos periféricos. Así pues cuando tu aplicación OpenGL quiere abrir una ventana para una animación gráfica usa el conjunto de comandos GLUT y éste toma el control del sistema de ventanas subyacente. De algún modo GLUT oculta al desarrollador los detalles sucios de los sistemas de ventanas específicos (X11, güindos, Motif, etc.) y le deja concentrarse en la tarea principal, el código OpenGL. Otra ventaja de usar GLUT es que hace tu código independiente de la plataforma. Yo personalmente he escrito simulacions de geles y proteínas que usan GLUT y OpenGL y he sido capaz de compilar y ejecutar sin ningún problema ni una sola línea de código dependiente en Linux-Intel, Linux-Alpha y Windows 95 (lo siento, confieso que uso windows 95 de vez en cuando ;-)
Recomiendo encarecidamente a cualquier interesado en escribir aplicaciones OpenGL usar GLUT como su manejador de ventanas.
El saber bien como usar GLUT es tan importante como conocer OpenGL y por eso en la serie actual sobre OpenGL en LinuxFocus incluiremos unos artículos que explican paso a paso como usar GLUT y manejar dispositios periféricos confortablemente.
Cerrando esta breve introducción no olvidemos mencionar otro de los
"Maestros del Universo", Brian Paul, quien esta pacientemente implementando una
libreria a la OpenGL llamada Mesa. De momento Mesa solo provee soporte
via software, lo que implica que la CPU realiza todas las operaciones de trazado
y dibujo que normalmente serian relegada al hardware 3D, no obstante Mesa contiene
ganchos implementados internamente que permiten la creación de drivers para
hardware acelerado. De momento, solo existen drivers para Mondello, S3Virge
(Win95 solamente), GLINT, y Voodoo 3Dfx chips. Gracias al driver Voodoo (escrito
por David Bucciarelli) Mesa puede alcanzar la misma eficiencia que las
de estaciones costosas OpenGL proveen, asi que si estas interesado en graficos
3D acelerados de alta eficiencia buscate una tarjeta 3Dfx.
Antes de cerrar no puedo evitar contaros una experiencia personal con mi Alpha-PC (21164 550MHz 164MRam Linux 2.0.32). Uso la biblioteca Mesa para un programa de simulación de Geles que estoy escribiendo. No hay soporte hardware en mi sistema para la biblioteca Mesa porque hasta el momento la biblioteca Glide no ha sido producida áun para mi sistema Alpha (POR FAVOR DAOS PRISA!!!!). Bueno, cuando hace poco Phil Ross y yo comparábamos el rendimiento de su Pentium PC + tarjeta 3Dfx y mi Alpha PC + tarjeta Matrox Millenium estuvimos un poco sorprendidos de ver que mi animación de gel corría tan suavemente como en su PC. Las demos de OpenGL corren mejor aún en mi sistema (por supuesto aquellas que no usaban texturas). En otras palabras, la falta de soporte hardware para las llamadas a OpenGL era sobrepasada por la fuerza bruta de la CPU Alpha. Para daros una idea del trabajo en cada uno de los frames, cada frame contenía una estructura de Gel modelada con decenas de millares de esferas y cilindros más todos los cálculos de iluminación sobre él. En el PC no pudimos ver un gel con tantos monómeros porque la computación demostró ser demasiado para la CPU Intel... el Alpha, sin embargo, sin problemas!. No puedo esperar a ver a mi Alpha PC con una 3Dfx y soporte hardware para Mesa.
|