El ray tracing está de moda. NVIDIA y Microsoft han puesto definitivamente el foco de atención sobre esta tecnología de renderizado con el objetivo de introducir en nuestros ordenadores una técnica con la que nos hemos familiarizado gracias al cine. NVIDIA la ha implementado mediante hardware en sus nuevos procesadores gráficos GeForce RTX, y Microsoft la ha introducido como una extensión de la librería DirectX 12.
Pero, en realidad, el trazado de rayos, que es como se conoce en español a esta técnica, no es nuevo. Lo propuso por primera vez como un método de generación de imágenes tridimensionales el investigador Arthur Appel en 1968, en un artículo titulado «Algunas técnicas para renderizar y sombrear sólidos». Y unos años más tarde, en 1979, lo desarrolló aún más Turner Whitted al introducir en el algoritmo original de Appel una componente recursiva que lo dota de un mayor realismo visual (veremos qué es esto un poco más adelante).
El renderizado mediante trazado de rayos fue propuesto por primera vez en 1968 por Arthur Appel, pero fue Turner Whitted quien lo perfeccionó en 1979
Como veis, esta técnica existe desde hace décadas, pero lo que la hace interesante es que nos permite obtener imágenes tridimensionales con un realismo asombroso, lo que ha provocado que sea la tecnología elegida por las productoras cinematográficas para concebir los fotogramas de sus películas mediante CGI (imágenes generadas por ordenador). Todas las producciones de Pixar, Marvel o de cualquier otra productora que utilice CGI están repletas de fotogramas procesados mediante trazado de rayos.
La luz y el renderizado
Antes de que veamos con cierto detalle cómo funciona el trazado de rayos es interesante que repasemos algunos conceptos que van a ayudarnos a entender esta técnica sin demasiado esfuerzo. Nosotros somos capaces de ver los objetos de nuestro entorno gracias a su capacidad de reflejar la luz. En realidad, reflejan una parte de esa luz y absorben otra parte de esa energía, lo que nos introduce de lleno en el concepto de color.
¿Por qué vemos un objeto de un determinado color? Sencillamente, porque refleja las longitudes de onda asociadas a ese color y absorbe todas las demás. Curiosamente, nuestra percepción del color blanco se debe a los objetos que reflejan todas las longitudes de onda del espectro visible. Y, como podemos intuir, los objetos que percibimos de color negro absorben todas las longitudes de onda. Por esta razón, en cierta manera podemos decir que, en realidad, vemos los objetos justo del color que no tienen, asumiendo que ese color deriva de la longitud de onda de la luz que reflejan.
Gracias a la luz no solo percibimos los objetos y su color, sino también su posición, su forma, su textura, su volumen y las sombras que generan. Esta es la razón por la que es tan importante entender la forma en que interactúan la luz y los objetos. Y es que, como veremos un poco más adelante, los algoritmos de trazado de rayos simulan con bastante precisión cómo se comporta la luz en el mundo real y cómo los objetos interactúan con ella. De hecho, esta «inspiración natural», por decirlo de alguna manera, es la responsable del fotorrealismo del que gozan las imágenes tridimensionales generadas mediante trazado de rayos.
Vamos ahora con otro concepto que nos viene muy bien conocer antes de seguir adelante: el renderizado. Podemos definirlo como el proceso de interpretación que permite a un programa de ordenador generar una imagen bidimensional a partir de un modelo tridimensional. Pero lo interesante es que esa imagen en dos dimensiones, que es la que pueden reproducir nuestros televisores, monitores y proyectores, debe imitar ese espacio en 3D. Y para lograrlo tiene que preservar la manera en que la luz interactúa con los objetos, los volúmenes, las formas, las texturas… En definitiva, debe ser realista.
Así funciona el trazado de rayos
Como os adelanté unas líneas más arriba, los algoritmos de renderizado mediante trazado de rayos imitan cómo se comporta la luz en el mundo real para generar imágenes bidimensionales a partir de modelos en 3D con un acabado fotorrealista. El reto, en definitiva, consiste en asignar el color apropiado a cada uno de los píxeles de la matriz que constituye la imagen bidimensional que obtendremos al final del proceso. Nuestro punto de partida es un modelo en 3D, pero nuestra meta es generar una imagen en 2D fotorrealista que respete las características del espacio tridimensional original.
Para lograrlo, el algoritmo de renderizado mediante trazado de rayos requiere que, en primer lugar, definamos un punto desde el que vamos a observar la escena en 3D. Esta va a ser nuestra cámara virtual. El siguiente paso consiste en identificar la dirección exacta hacia la que apunta la cámara virtual, y, una vez que la hemos definido, crearemos un plano perpendicular a la dirección en la que apunta la cámara que está constituido por todos y cada uno de los puntos que van a formar parte de la imagen bidimensional que obtendremos al final del proceso. Descrito de esta forma parece un punto de partida algo complicado, pero esta imagen seguro que clarifica bastante de qué estamos hablando:
Como hemos visto antes, el reto que tiene por delante al algoritmo de renderizado es asignar el color exacto a cada uno de los píxeles de la matriz de la imagen bidimensional. Parece una tarea sencilla, pero no lo es. No lo es porque en el mundo real la interacción entre la luz y los objetos es compleja, y si queremos que nuestra imagen sea fotorrealista es necesario que nuestro algoritmo imite esta complejidad. Este es, precisamente, el problema que intentó resolver Arthur Appel hace cincuenta años cuando ideó el renderizado mediante trazado de rayos.
Los tres elementos esenciales con los que trabajamos en el renderizado mediante trazado de rayos son la cámara virtual, el plano perpendicular y la escena tridimensional
Su algoritmo pretende encontrar el color que debemos asignar a cada uno de los píxeles del plano perpendicular recurriendo a unas líneas imaginarias que nacen en la cámara virtual, atraviesan el centro de cada uno de los píxeles de la matriz y prosiguen su trayectoria hasta «chocar» con alguno de los objetos de la escena tridimensional. Son precisamente esas líneas imaginarias a las que llamamos rayos. Lo que hace en definitiva el algoritmo de renderizado mediante trazado de rayos es calcular el punto de intersección más cercano entre cada uno de los rayos y los objetos de la escena en 3D.
Lo siguiente que debemos hacer es determinar qué color debemos asignar a cada uno de los píxeles, pero ya tenemos buena parte del trabajo hecho. Y es que para averiguar con qué tono debemos pintar cada una de las celdillas del plano perpendicular solo tenemos que identificar el color del objeto con el que ha «chocado» en la escena 3D el rayo que atraviesa cada uno de los píxeles de la matriz bidimensional o plano perpendicular.
Es evidente que el algoritmo que acabo de describir plantea algunos retos adicionales que hemos pasado por alto. ¿Cómo se calcula el punto de intersección más cercano entre cada uno de los rayos y la geometría de la escena en 3D? Y, una vez que lo hemos obtenido, ¿cómo averiguamos de qué color es ese objeto?
El punto de intersección lo podemos calcular recurriendo a tres ecuaciones con otras tantas incógnitas en las que no voy a profundizar para no complicar el artículo más de lo necesario. Aun así, por si tenéis curiosidad y no os intimidan las matemáticas, la siguiente imagen refleja con bastante claridad de dónde salen estas ecuaciones y cómo se resuelven. C indica las coordenadas de la cámara virtual, P las de la intersección del rayo con el plano perpendicular, e I las del punto de intersección del rayo con el objeto de la escena en 3D más cercano.
Vamos ahora a por el siguiente reto. Para determinar el color de cada uno de los píxeles del plano perpendicular tenemos que conocer la cantidad de luz que viaja a través del rayo hacia la cámara virtual. Si os fijáis este método está claramente inspirado en la forma en que vemos y percibimos el color de los objetos de nuestro entorno: los bastones y los conos de nuestros ojos, que son las células fotosensibles de la retina, recogen las distintas longitudes de onda del espectro de la luz visible reflejada por los objetos que nos rodean. Es exactamente lo que intentamos imitar en nuestro algoritmo de renderizado.
De nuevo, para identificar el color de cada píxel no nos queda más remedio que recurrir a las matemáticas, pero en esta ocasión la ecuación que nos va a proporcionar la información que estamos buscando es más compleja que las tres sencillas ecuaciones que hemos utilizado para determinar el punto de intersección entre el rayo y la geometría de la escena tridimensional. Aquí tenéis la «ecuación de renderizado», y, como veis, intimida un poco:
Aunque no es necesario que profundicemos en esta ecuación, sí nos interesa mucho saber que la cantidad de luz que viaja desde un punto determinado de nuestra escena en 3D hasta la cámara virtual depende de tres factores: la cantidad de luz que recibe ese punto, la forma en que refleja la luz la superficie del objeto en ese punto y la posición de la cámara virtual. Como veis, todo es bastante intuitivo. De hecho, la ecuación de renderizado se formula a partir de estas tres premisas.
Sin embargo, aún nos falta por añadir una capa más de complejidad. En el mundo real, como hemos visto, los objetos reflejan una parte de la luz que reciben, y esa luz reflejada también interacciona con otros objetos del entorno, lo que complica considerablemente la confección de un algoritmo que sea capaz de imitar todas estas interacciones. Este problema es, precisamente, el que intentó resolver Turner Whitted en 1979. ¿Cómo lo hizo? Diseñando un algoritmo recursivo que tiene en cuenta la luz reflejada por los objetos.
El algoritmo de renderizado recursivo mediante trazado de rayos propuesto por Whitted respeta las refracciones, las reflexiones y las sombras introducidas por los objetos
Este método nos indica que cuando un rayo incide sobre la superficie de un objeto puede generar tres nuevos tipos de rayos: refracciones, reflexiones y sombras. La refracción se produce cuando la luz pasa de un medio de propagación a otro con una densidad diferente, un fenómeno que puede provocar un cambio en la velocidad de propagación de la luz y en su dirección. La reflexión, por su parte, se produce cuando los rayos de luz inciden sobre una superficie, se desvían y vuelven reflejados al medio del que proceden en el mismo ángulo en el que incidieron. Este fenómeno se produce, por ejemplo, cuando miramos un espejo.
El tipo de rayo que aún nos queda por identificar es el más fácil de entender: las sombras. No tienen ningún misterio porque todos sabemos que se producen debido a la ausencia total o parcial de luz cuando un objeto con un cierto grado de opacidad se interpone entre una fuente emisora de luz y otro objeto, sobre el que proyecta su sombra. Ahora que tenemos bastante claro todo esto, ¿en qué consiste el algoritmo recursivo de renderizado mediante trazado de rayos que propuso en su día Whitted?
A diferencia del algoritmo de Appel, el que elaboró Whitted no calcula el color de cada píxel del plano perpendicular a partir del tono del objeto del modelo en 3D sobre el que incide el rayo que parte de la cámara virtual, sino que el rayo continúa su viaje desde el objeto en 3D hasta que incide sobre un segundo objeto. Pero a este segundo elemento llegará transformado en un rayo de uno de los tres tipos que acabamos de ver. Y de nuevo, su viaje continúa hasta incidir en un tercer objeto. Y en un cuarto…
Cada uno de los rayos que nacen en la cámara virtual rebotará en tantos objetos de la escena en 3D como sean necesarios para simular el comportamiento de la luz en el mundo real, generando refracciones, reflexiones y sombras. Precisamente, los algoritmos recursivos se utilizan en informática para modelar este tipo de fenómenos que se repiten de forma continua hasta que se produce un evento concreto. Obviamente, el método de renderizado de Whitted nos ofrece imágenes bidimensionales más realistas que el de Appel, pero también conlleva un esfuerzo de cálculo muy superior.
¿Qué podemos esperar de la nueva arquitectura de NVIDIA?
Como hemos visto a lo largo del artículo, las ecuaciones que nos permiten describir matemáticamente cómo se comporta la luz como parte de un algoritmo de renderizado son bastante complejas. Un ordenador puede resolverlas, por supuesto, pero el problema es que el número de cálculos que debe realizar para obtener el color de cada uno de los píxeles de la imagen bidimensional que vamos a generar es muy elevado. Es más un problema de cantidad que de complejidad, sobre todo si nos ceñimos al trazado de rayos recursivo, que es el que se utiliza actualmente.
Turing incorpora unidades de procesado específicas para hacer posible el renderizado mediante trazado de rayos
Esta es la razón por la que las empresas que deben afrontar el renderizado de imágenes en 3D, como, por ejemplo, las que se dedican a los efectos especiales para cine mediante CGI o las de animación por ordenador, tienen unas «granjas» de ordenadores enormes. Esos equipos son, precisamente, los que deben llevar a cabo los cálculos matemáticos que exige el renderizado mediante trazado de rayos. La razón por la que hasta ahora este método no era viable en tiempo real en el ecosistema de nuestros ordenadores, al menos no con la eficiencia necesaria, no es otra que la ingente cantidad de cálculos que debe llevar a cabo la GPU. Pero este panorama está a punto de cambiar.
Turing, la nueva arquitectura que NVIDIA está utilizando en sus últimas GPU, implementa mediante hardware los recursos necesarios para hacer viable en nuestros ordenadores un renderizado híbrido que combina la rasterización tradicional, que es el método de renderizado que han usado hasta ahora, con el renderizado mediante trazado de rayos. Esto significa que los desarrolladores de videojuegos podrán decidir qué tecnología les ofrece el acabado gráfico que tienen en mente, analizando previamente su impacto en las prestaciones.
De hecho, lo lógico es pensar que una vez que se familiaricen con el nuevo método de renderizado recurrirán habitualmente al renderizado híbrido para dotar a los juegos de un acabado gráfico más cuidado sin que los cálculos derivados del trazado de rayos hagan ineficiente el renderizado en tiempo real. Esto quiere decir, sencillamente, que un único fotograma podrá contener ambos métodos de renderizado, balanceando de esta forma la calidad visual y el esfuerzo de cálculo que debe afrontar la GPU.
Para hacer posible el renderizado mediante trazado de rayos la familia de procesadores gráficos GeForce RTX de NVIDIA cuenta con unas nuevas unidades funcionales integradas en la lógica de la GPU a las que han llamado RT core (Ray Tracing core), y que no son otra cosa que procesadores dedicados específicamente a este tipo de renderizado. Estas unidades son las que deben llevar a cabo los cálculos matemáticos que he descrito a lo largo del artículo, y algunos más que no hemos abordado para no complicarlo en exceso, pero no están solas: cuentan con la ayuda de la inteligencia artificial.
Y es que una parte importante de la arquitectura Turing es su capacidad de utilizar el aprendizaje automático para reducir tanto como sea posible el número de rayos que es necesario procesar durante el renderizado. Llegados a este punto tenemos las herramientas necesarias para plantearnos qué es lo que podemos esperar de esta tecnología. Sin lugar a dudas, la calidad gráfica de los juegos que utilizarán el renderizado mediante trazado de rayos será claramente superior a la de los juegos que estamos disfrutando actualmente.
Aun así, no podemos esperar que estas tarjetas gráficas, y tampoco las que presumiblemente colocará en el mercado AMD, sean capaces de ofrecernos en nuestro PC unos gráficos equiparables a los que disfrutamos, por ejemplo, en las películas de Pixar. La diferencia entre unas imágenes y otras es que estas últimas no se generan en tiempo real, y, por tanto, pueden permitirse aplicar un renderizado mediante trazado de rayos completo y extremadamente meticuloso.
Sin embargo, nuestros ordenadores lo tienen más difícil porque deben crear cada fotograma en tiempo real y con una cadencia elevada. Por el momento esto hace inviable un renderizado mediante trazado de rayos equiparable al del cine. Pero la tecnología avanza y lo último que se pierde es la esperanza. El tiempo dirá.
Imágenes | Gilles Tran | Scratchapixel
Más información | NVIDIA
En Xataka | Nvidia GeForce RTX 2000: la nueva artillería pesada en gráficas consigue una iluminación espectacular para el gaming más exigente