lunes, 21 de marzo de 2011

Computación Gráfica: Todo un universo detrás del cristal de la pantalla

¿Alguna ves te has preguntado cómo es que toda esa serie de imágenes que aparecen en tu pantalla o monitor son generadas? Te has preguntado ¿qué hay más allá de apretar botones a la desesperada en el control de tu consola favorita y ver reacciones en pantalla?

La respuesta a todo esto la tiene una rama de las Ciencias de la Computación denominada Computación Gráfica.

La computación gráfica se encarga del estudio, diseño y trabajo del despliegue de imágenes en la pantalla de una computadora a través de algoritmos complejos basados en la Física y las Matemáticas.

De aquí derivan más áreas como el procesamiento de imágenes, realidad virtual, modelado y animación 3D, desarrollo de videojuegos o en general sistemas gráficos en tiempo real, shaders, desarrollo de sistemas CAD, visualización y simulaciones científicas. En fin, un sin numero de aplicaciones que en la vida cotidiana, somos clientes.

El objetivo de este pequeño post es dar a conocer lo que hay detrás de los que vemos, al menos en este ámbito ya que si eres una persona que se quiere dedicar a alguna de estas áreas (como yo! ^^) pues hay que tener conciencia de hacia donde se va y con cierto backup con respecto a conceptos de uso cotidiano en Computación Gráfica.

Pero bueno, vámonos por lo más esencial.

  • Gráfico: Es una forma de representar una entidad, un proceso o cualquier idea empleando el uso de imágenes para su comprensión.

  • Pixel: Es la unidad mínima de representación gráfica.

  • Resolución: Es la densidad de pixeles en un área determinada.

  • Primitiva: Son las entidades 3D mas sencillas que existen en Computación Gráfica y son los vértices o puntos, líneas y triángulos o polígonos.

  • Modelo 3D: Es un conjunto de primitivas que componen una entidad compleja

  • Escena: Es un conjunto de modelos 3D que representan un mundo.

  • Animación: Es el proceso de dar movimiento, formas y características especiales a un modelo 3D. Por ejemplo un personaje de videojuegos o un escenario interactivo.

  • Iluminación: Son modelos matemáticos que definen el comportamiento de la luz. Definen la naturaleza de la luz que emana una fuente, su intensidad y distribución.

  • Render: Es el proceso final de generar la imagen 2D o animación a partir de la escena creada.

  • Shader: Es un conjunto de instrucciones de software usadas para programar el pipeline de rendering de la tarjeta gráfica de modo que se puedan calcular efectos de renderizado personalizados a un nivel de acceso muy bajo.

  • Estereoscopía: Es cualquier técnica capaz de crear la ilusión de profundidad en una imagen, video o aplicación. La ilusión es creada presentando una imagen ligeramente diferente para cada ojo, como ocurre en nuestra forma habitual de recoger la realidad.

  • Tarjeta Gráfica: También conocida como GPU (Graphics Processing Unit), encargada de procesar los datos provenientes de la CPU y transformarlos en información comprensible y representable en un dispositivo de salida.

  • Sistemas de Despliegue: Son dispositivos de salida para los sistemas gráficos, ya sean pequeños o muy robustos y sofisticados. Por ejemplo, el más sencillo es el monitor, algo más complejo sería aquello capaz de soportar estereoscopía activa como la Sala Ixtli de la UNAM.

Y bueno, espero que este pequeño recuento de conceptos del área de gráficos por computadora les haya sido de utilidad.

Diferenciación de conceptos en el área de desarrollo de aplicaciones

"Esta es la primer entrada a este blog y quiero hacer un 're post' de algo que escribí para el blog de SODVI. Quiero tener esta entrada aquí debido a que me parece de gran importancia entender lo que esta pequeña investigación me hizo entender."

Muchas veces, investigando sobre las herramientas de desarrollo que tenemos disponibles, como programadores a menudo nos topamos con conceptos como SDK, IDE, API, Framework, Engine, y muchos más que de seguro ni yo misma conozco. Inclusive, ni siquiera sabemos sobre que estamos desarrollando, lo instalamos en nuestro equipo y punto, a trabajarlo y normalmente todo bien. De repente alguien nos pregunta o nosotros mismos cuestionamos nuestro trabajo y nos ponemos un poco a pensar sobre la naturaleza de nuestras herramientas de trabajo, es donde nos cae el veinte y decimos, caramba ¿qué es esto? Si, seguramente es software eso que ni qué, jeje, pero cual es su propósito, por qué tiene esa estructura, por qué trae ejemplos, por qué no tiene documentación, por qué me cuesta uno y la mitad del otro desarrollar sobre esa herramienta. En fin, un sin numero de detalles que a continuación, trataré de explicar, siendo ese el objetivo de esta pequeña nota.

Enumeraré los diferentes conceptos de acuerdo al nivel de abstracción que tienen, del mas bajo al más alto, todo esto desde mi perspectiva. Y bueno, solo por si a caso, el termino abstracción se usa para determinar el nivel de aislamiento de cierto elemento dentro de su contexto o del resto de los elementos que lo acompañan. Dicho de una manera más clara, a nosotros nos importa en este sentido el ¿qué hace? y no el ¿cómo lo hace? Para aquellos que ya llevaron alguna materia de control, vean el concepto de abstracción como una caja negra.

Library - Biblioteca 

Es un conjunto de procedimientos y funciones agrupadas en un archivo con el fin de que puedan aprovecharlas otros programas. Las bibliotecas contienen código y datos, que proporcionan servicios a programas independientes, es decir, pasan a formar parte de éstos. Esto permite que el código y los datos se compartan y puedan modificarse de forma modular.

API - Application Programming Interface, Interfaz de Programación de Aplicaciones

Es el conjunto de funciones y procedimientos (o métodos, en la programación orientada a objetos) que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstracción.Uno de los principales propósitos de una API consiste en proporcionar un conjunto de funciones de uso general. De esta forma, los programadores se benefician de las ventajas de la API haciendo uso de su funcionalidad, evitándose el trabajo de programar todo desde el principio.

Framework - Marco de Trabajo, Entorno de Trabajo

En términos generales, un framework es un conjunto estandarizado de conceptos, prácticas y criterios para enfocar un tipo de problemática particular, que sirve como referencia para enfrentar y resolver nuevos problemas de índole similar. En el desarrollo de software, un framework es una estructura conceptual y tecnológica de soporte definida, normalmente con artefactos o módulos de software concretos, con base en la cual otro proyecto de software puede ser organizado y desarrollado. Típicamente, puede incluir soporte de programas, bibliotecas y un lenguaje interpretado entre otros programas para ayudar a desarrollar y unir los diferentes componentes de un proyecto.

SDK - Software Development Kit, Kit de Desarrollo de Software

Es un conjunto de varias herramientas de desarrollo que le permite a un programador crear aplicaciones para un sistema concreto. Por ejemplo, una determinada estructura de software, una plataforma de hardware, un sistema operativo, etc. Los SDK incluyen herramientas de debugger, codigos de ejemplo, documentaciones y muchas veces un entorno de programación (IDE).


IDE - Integrated Development Environment, Entorno Integrado de Desarrollo

Como su nombre lo dice, es un programa informático cuyo objetivo es proveer herramientas para el desarrollo en uno o varios lenguajes de programación. Sus principales componentes son:

  • Un editor de texto
  • Un compilador
  • Un intérprete
  • Herramientas de automatización
  • Un depurador
  • Posibilidad de ofrecer un sistema de control de versiones
  • Factibilidad para ayudar en la construcción de interfaces gráficas de usuario

Normalmente, se tienden a confundir los conceptos de API, Framework y SDK debido a que todos tienen un buen nivel de abstracción sin embargo, como podemos observar, todos ellos tienen objetivos diferentes, una API hace que no te preocupes por cosas de bajo nivel sin embargo tú tienes que planear la estructura del sistema que vas a construir.

Por otro lado, el Framework esta enfocado a resolver problemáticas de índole similar, como por ejemplo el desarrollo de sitios web, pero a diferencia de una API, existe una metodología y una estructura que te lleva de la mano para alcanzar tal fin y sobre todo tiene funciones o métodos definidos los cuales hacen que te preocupes por el funcionamiento y no por el como llegar a ese funcionamiento.

Y finalmente, un SDK tiene las mismas ventajas que un Framework, pero con la restricción del sistema, en este sentido, el sistema tiene que tener cierta forma y cierto fin. Muchas veces hemos escuchado cosas como Kit de Desarrollo de Robots Móviles, Kit de Desarrollo del PICXXXXX, etc. Precisamente esta es la idea de estos sistemas, y es realizar una aplicación para ciertas plataformas.

Ahora, al final de la lista les presento el concepto de IDE y es porque es una herramienta que normalmente va de la mano con las otras herramientas de desarrollo. Seguramente todas ellas, exceptuando las APIS y un poco los Framework, tienen un entorno de desarrollo. ¡Aguas! No confundir el IDE con cualquiera de estos conceptos.

Ya para finalizar, un ejemplo de abstracción, usando para ello dos herramientas muy conocidas en el desarrollo de gráficos por computadora: OpenGL y OpenSceneGraph.

API: OpenGL

Framework: OpenSceneGraph

OpenSceneGraph es la abstracción de OpenGL y esto permite a los desarrolladores de ambientes gráficos preocuparse por la forma en que se presentan los objetos en una escena, como interactuan, las reacciones que tienen y no como hacer todas estas funciones desde la capa anterior que es OpenGL, que dicho sea de paso no tiene este soporte, hay que desarrollarlo si se trabaja con esta API. Pero bueno, OpenGL es una API porque de alguna forma ya tienes el soporte para dibujar primitivas, activar o desactivar estados, crear luces, crear materiales y no tienes que preocuparte por hacer esto desde cero lo cual significaría buscar el hilo negro.

En fin, espero que con esto haya quedado claro lo que es la abstracción y su influencia en las diferentes herramientas de desarrollo y sobre todo, entender porque algunas son API, otras SDK, etc. Comenten si hay alguna duda, queja o complemento.

:)