Ray Tracing es el nombre de una técnica muy popular que se utiliza para generar imágenes 3D por ordenador, destacando por la sencillez de su implementación y la calidad de los resultados.

Para entender el principio de funcionamiento y las ventajas que ofrece la técnica de Ray Tracing hay que tratar primero de comprender el proceso general por el que se forman las imágenes. Y me estoy refiriendo sólo a la impresión de las mismas en nuestras retinas, no a su interpretación por el cerebro.

Ray Tracing es una técnica que se utiliza para simular de una forma muy simplificada este proceso de interacción de la luz con los objetos. Y una de sus características fundamentales es que, en vez de tomar como origen del proceso las fuentes de luz, y tratar de emitir rayos en todas las direcciones posibles, lo que hace es tomar como punto de partida al observador, y trazar desde él rayos hacia la escena en busca de las fuentes de luz. La ventaja de este enfoque es que simplifica enormemente el sistema, al evitar tener que estudiar todos los rayos posibles, y limitarse sólo a los rayos que llegan al observador, que son los que realmente aportan algo a la imagen final generada.Simplificando bastante la explicación, se puede decir que todo empieza en las fuentes de luz. Los focos emisores, como pueden el sol o una simple cerilla, emiten rayos que se propagan a través del medio en el que se encuentran. Cuando uno de estos rayos se tropieza en su camino con un objeto puede ocurrir que la energía que transporta sea totalmente absorbida o reflejada, aunque normalmente ocurre que una parte es absorbida y otra reflejada. Así, dependiendo de las características del objeto, ocurrirá que el rayo continuará su camino a través suyo, caso de los cristales, o saldrá totalmente reflejado, caso de los espejos, aunque normalmente ocurrirán ambos fenómenos en cierta medida, apareciendo nuevos rayos, algunos transmitidos a su través y algunos otros reflejados, que a su vez volverán a propagarse por el medio y rebotar contra los objetos formando a su vez otros rayos. Y así sucesivamente hasta que finalmente algunos de estos rayos acaben tropezándose con nuestros ojos, y generando la combinación de todos ellos la imagen que representa lo que percibimos de nuestro alrededor.

Algoritmo

Ray Tracing, al fin y al cabo, no es más que un algoritmo. Admite unas entradas, realiza un proceso y genera unas salidas.

Como entradas del algoritmo estarían la posición y características físicas de cada uno de los objetos que forman la escena. Seguiría la ubicación, intensidad y tipo de las fuentes de luz presentes en la misma. Después el modelo de iluminación a utilizar, que describiría como calcular el color en un punto de la superficie de un objeto. A continuación la posición y dirección desde la que se quiere representar la escena, es decir, la posición del observador. Y en último lugar la ubicación y dimensiones del plano de proyección sobre el que ha de quedar reflejada la imagen, que normalmente equivale a la pantalla del ordenador donde se verá finalmente el resultado.

En cuanto al algoritmo en sí mismo, decir que el proceso básico se basa en trazar un rayo a través de cada uno de los pixels del plano de proyección, tomando como origen de los rayos la posición del observador. Y para cada uno de estos rayos trazados estudiar si se produce una intersección con alguno de los objetos de la escena. Si no se encuentra ningún objeto se termina el proceso para ese píxel y se le asigna un color de fondo por defecto. Por el contrario, si se encuentra un objeto, se miran sus características físicas y se decide que hacer en función del modelo de iluminación.

En la práctica, todos los elementos que intervienen en el proceso se tratan como entidades matemáticas muy simples. Los objetos se definen mediante primitivas geométricas como esferas, planos o polígonos, aunque se tiende a utilizar mallas de triángulos ya que asi funcionan la mayoría de programas de modelado actuales. Los rayos se tratan como vectores, con un punto de origen y una dirección de propagación. Y por tanto, el cálculo de intersecciones entre rayos y objetos se reduce a la resolución de ecuaciones en las que intervienen vectores y primitivas.

Situación Actual

Hoy en día casi todos los grandes paquetes comerciales de modelado y diseño gráfico implementan Ray Tracing, ya sea nativamente o como un añadido. Aunque también se puede encontrar en programas libres y de código abierto, como el veterano POV-Ray, o el más reciente YafRay, que está teniendo una gran aceptación gracias a su integración con modeladores como Wings 3D y Blender.

Actualmente hacer un programa simple que implemente Ray Tracing resulta una tarea sencilla, ya que existe bastante información al respecto, y además es fácil encontrar código fuente listo para descargar de Internet. Incluso se suele exigir como práctica obligatoria a realizar en algunos cursos de programación gráfica de ciertas facultades.

Hoy en día se trabaja bastante en las técnicas de Ray Tracing en Tiempo Real, denotadas normalmente por las siglas inglesas RTRT. Estas técnicas tratan de reducir el impacto de uno de los mayores problemas del Ray Tracing, que es el enorme número de cálculos a realizar para obtener imágenes de calidad, lo que ha llevado siempre a considerarla como una técnica a realizar off-line, desatendida, en vez de on-line, en tiempo real.

En bastantes sitios se empieza a hablar de que el futuro de los engines gráficos 3D pasa por utilizar Ray Tracing en Tiempo Real como única forma de aumentar la calidad de las imágenes generadas y añadir nuevos efectos. Incluso apostando por la incorporación de chips específicamente diseñados para implementar Ray Tracing en las tarjetas gráficas.

Objetivo

El objetivo de esta serie de artículos es el de introducir los conceptos básicos que intervienen en la técnica de Ray Tracing, detallando como se relacionan, y dando una justificación matemática a cada uno de ellos siempre y cuando mis conocimientos me lo permitan.

Aunque mi intención es la explicar detalladamente todos los conceptos y resultados que vaya presentando, soy consciente de que a veces esto no será posible. Por lo que para seguir esta serie se deberán tener conocimientos básicos de álgebra y cálculo, al menos en lo referente al uso de vectores, matrices y operaciones básicas como el producto escalar y vectorial. Un pequeño conocimiento del vocabulario utilizado dentro del mundo de la programación gráfica también puede ser útil, aunque no imprescindible.

La idea general es tratar primero un conjunto de temas muy sencillos, como el barrido del plano de proyección, el cálculo de intersecciones con diversos tipos de primitivas, la construcción de un modelo de iluminación, y el algoritmo de traza de rayos hacia atrás. A continuación escribir algo de código que sirva de base. Después ampliar la serie de artículos con Ray Tracing Distribuido y Técnicas de Aceleración. Modificar el código fuente base con alguna de las nuevas técnicas descritas. Y por último introducir algún algoritmo que pueda resultar interesante, como Photon Mapping por ejemplo.