Así se acelera tu GPU en escenas 3D gracias a Ray Tracing

Así se acelera tu GPU en escenas 3D gracias a Ray Tracing

Josep Roca

El método de renderizado utilizado en general en los videojuegos es la llamada rasterización o algoritmo del pintor. Pero con la llegada del Ray Tracing o Trazado de Rayos en tiempo real nos acercamos a una era en la que antiguas limitaciones se ven por completo superadas. Con la llegada de las RDNA 2 de AMD y las consolas de nueva generación está claro que no estamos ante una moda pasajera y por eso os explicamos qué ventajas supone esta nueva forma de renderizar una escena.

El trazado de rayos que estamos empezando a ver en los juegos no es de una implementación completa del trazado de rayos utilizado a día de hoy en las películas, ya que sería demasiado lenta. En cambio, es una combinación de las técnicas de rasterización de las que se han hecho uso hasta ahora sumado al Ray Tracing para solventar ciertos problemas que no se pueden solucionar con la rasterización.

La idea es ir progresivamente reemplazando las técnicas de rasterización convencionales por el Ray Tracing de manera progresiva y paulatina, pero incluso NVIDIA que es la empresa que más ha estado promocionando esta tecnología en los últimos años en cuanto a marketing ha llegado a poner como fecha para el inicio del final de la transición de la rasterización al Ray Tracing un por todavía lejano 2023.

Ray Tracing 2023

Es por ello que durante estos años los juegos van a hacer uso de lo que llamamos Ray Tracing Híbrido o Ray Tracing en tiempo real consistente en combinar la rasterización utilizada hasta ahora en los juegos para renderizar la escena junto al Ray Tracing para solventar ciertos problemas visuales que no pueden ser solventados a través de la rasterización.

Esto se traduce en que poco a poco los juegos irán dejando de lado la rasterización y las GPUs dentro de nuestras tarjetas gráficas irán variando poco a poco a ese ideal.

Rasterizado vs Ray Tracing

Ray Tracing Recorrido Luz

En el rasterizado hacemos una actualización en un valor de color de un píxel en pantalla para luego actualizar ese píxel de nuevo; esto se traduce en que un solo píxel se ha de actualizar varias veces en una sola escena.

En cambio, con el trazado de rayos el valor del color de un píxel no se da hasta que el rayo no ha terminado toda su trayectoria por lo que la información en el búfer de imagen se actualizará una sola vez.

Esta diferencia que puede resultar menor es importante, ya que la rasterización al estar continuamente actualizando el valor de los píxeles en el búfer de imagen, el cual se almacena en la memoria de la gráfica, requiere anchos de banda realmente muy grandes para renderizar escenas cada vez más complejas.

El pipeline del Ray Tracing hibrido

Ray Tracing Pipeline Vulkan DX12U

Independientemente de si estamos utilizando Vulkan, DirectX 12 Ultimate o cualquier otro tipo de API las etapas y el orden de estas son siempre las mismas.

  • Ray Generation Shader: este shader tiene que ser invocado cada vez que queremos que un objeto de la escena emita un tipo de rayo.
  • Intersection Shader: es el shader que calcula la intersección entre los rayos y el objeto, en desuso por el hecho que las unidades de intersección como el RT Core de NVIDIA realizan este trabajo en paralelo y de manera más eficiente.
  • Shaders de resolución: son el tipo de programa shader que se aplica sobre el objeto según cual haya sido el resultado de la intersección, son los llamados miss shader, closest hit shader, hit shader, etc. No se ejecutan todos al mismo tiempo porque la intersección solo da un resultado.

Debido a la falta de potencia de las GPUs que utilizamos en nuestros sistemas para el Ray Tracing lo que se hace es un uso mínimo de éste limitando la cantidad de rayos que componen la escena y su nivel de recursión.

La iluminación indirecta, la gran ventaja del trazado de rayos

Raster vs Ray Tracing

Pese a las mejoras continuas en potencia y programabilidad de las GPUs durante las últimas dos décadas, todas ellas utilizan el mismo algoritmo para renderizar las escenas escena, llamado algoritmo de rasterización.

Dicho algoritmo es lo suficientemente bueno si queremos renderizar escenas solo con iluminación directa, es decir, con fuentes de luz incidiendo sobre los objetos pero sin que estos objetos generen ningún tipo de fuente de luz por si mismos de manera indirecta, que es donde éste empieza a desmoronarse por completo, ya que su modelo de iluminación es limitado.

En cambio el trazado de rayos trata sobre el recorrido de los rayos de luz en la escena y tiene en cuenta el comportamiento de la misma y su trayectoria.

«Entendemos como iluminación indirecta la que es producida por un objeto cuando una fuente de luz directa incide sobre el mismo

El problema viene en que la forma de renderizar que tiene la rasterización no tiene en cuenta el recorrido de la luz por lo que a la hora de representar cuál es el comportamiento de ésta al incidir en los objetos se han de buscar métodos sustitutivos por la falta de información en la escena.

Los mapas de sombras, un ejemplo de las limitaciones de la rasterización

Raster Horrible Shadow Maps

Más de una vez, jugando a algún videojuego os habrán dado ganas de sacaros los ojos por culpa de las sombras en el juego; el motivo de ello es que la GPU tiene que hacer trabajo extra para poder hacerse una idea de cómo serán las sombras por la falta de información.

Lo que se hace es renderizar la escena de nuevo por completo pero tomando como cámara de la nueva escena el objeto que genera la sombra y almacenando solamente el búfer de profundidad como mapa de sombras.

¿Os podéis imaginar la potencia que sería necesaria para calcular las sombras de todos los objetos en una escena? Tened en cuenta que con la rasterización el valor de los píxeles se actualiza continuamente mientras que con el trazado de rayos no ocurre ese problema, ya que solo se actualiza una vez el rayo ha realizado todo el recorrido por la escena.

Una de las cosas que están pasando a ser solventadas por el trazado de rayos son los mapas de sombras y no solo éstos sino también los reflejos de los objetos, la refracción, etc.

Battlefield V Ray Tracing

Todos estos efectos se están empezando a trasladar al Ray Tracing por el hecho que la rasterización no puede solventar esos problemas visuales con la misma definición.

Otra de las formas con las que los desarrolladores solventan las limitaciones de la rasterización es utilizando mapas de luces, sombras y/o reflejos estáticos. Por ejemplo lo que hacen es colocar sombras fijas en el el escenario que han sido pre-calculadas de antemano, y dichas sombras no son dinámicas y no cambian con el cambio continuo de la iluminación.

Otra ventaja: La representación de los materiales

Luz en materiales

Otro de los elementos importantes a la hora de representar una escena 3D realista es la representación de los materiales en los que el comportamiento de la luz también incide, y dado que la rasterización tiene un modelo de la luz muy limitado esto hace que los objetos en una escena 3D no se muestren como deben mostrarse.

Hay que tener en cuenta que cada tipo de material se representa con un cociente de refracción que es la cantidad de luz que emiten y que va del 0 al 1; el cociente de refracción más alto es el de una superficie de estilo espejo que va a rebotar los rayos que le llegan al completo y el más bajo es un objeto que simplemente absorbe toda la luz y no la refracta. Cuando los rayos de luz rebotan en los objetos llevan consigo un nivel de energía, y cuando ésta llega a cero el rayo deja de recorrer la escena.

Cada vez que un rayo impacta sobre un objeto, en el caso de que hagamos que el objeto emita un rayo indirecto producto de la intersección a través de un shader de generación de rayos éste sale con un nivel de energía equivalente al del rayo que ha incidido previamente en el objeto por el cociente de refracción del objeto.

Pues bien, una de las ventajas del Ray Tracing es precisamente esa, la forma en la que puede representar diversos materiales aumentando la calidad visual de los mismos y sin necesidad de tener que tirar de complejos programas shader que requieren una gran cantidad de cálculos por parte de la GPU y combinaciones de mapas de texturas que además no consiguen el mismo resultado.