Path Tracing vs. Ray Tracing - ¿Diferentes?

Rubén Castro, 14 julio 2022

Parece que cada pocos años aparece una nueva tecnología que promete hacer que los juegos parezcan más realistas. A lo largo de las décadas, hemos tenido sombreadores, teselación, mapeado de sombras, trazado de rayos… y ahora hay un nuevo niño en el bloque: el Path Tracing.

¿Qué es el Path Tracing o trazado de rutas?

La respuesta corta es… “El trazado de trayectorias no es más que el trazado de rayos”. Las ecuaciones para modelar el comportamiento de la luz son las mismas, el uso de estructuras de datos para acelerar la búsqueda de interacciones entre rayos y triángulos también es el mismo, y las GPU modernas utilizan las mismas unidades para acelerar el proceso. También es muy intensivo desde el punto de vista computacional.

Pero, si realmente es lo mismo, ¿por qué el trazado de trayectorias tiene un nombre diferente y qué ventajas ofrece a los programadores de juegos? El path tracing difiere del trazado de rayos en que, en lugar de seguir muchos rayos a lo largo de toda la escena, el algoritmo sólo traza la trayectoria más probable de la luz.

El fotograma comienza de forma normal: la tarjeta gráfica renderiza toda la geometría -todos los triángulos que componen la escena- y la guarda en la memoria. Después de un poco de procesamiento adicional, para organizar la información de tal manera que la geometría pueda ser buscada más rápidamente, el trazado de rayos entra en acción. Para cada píxel que compone el fotograma, se lanza un único rayo desde la cámara hacia la escena (mediante ecuaciones vectoriales).

A continuación, cada rayo se compara con la geometría de la escena y ésta es la primera parte de la complejidad del trazado de rayos.

Si un rayo y un objeto interactúan, se realiza otro cálculo para averiguar exactamente qué triángulo del modelo está implicado, y el color del triángulo modificará efectivamente el color del píxel.

Pero rara vez la luz choca con un objeto y esa luz es absorbida por completo. En la realidad, hay mucha reflexión y refracción, por lo que si se quiere un renderizado lo más realista posible, se generan nuevas ecuaciones vectoriales, una para los rayos reflejados y otra para los refractados.

A su vez, esos rayos se trazan hasta que también chocan con un objeto, y la secuencia continúa hasta que una cadena de rayos rebota finalmente hasta una fuente de luz en la escena. A partir del rayo primario original, el número total de rayos trazados a través de la escena crece exponencialmente con cada rebote.

Si se repite la operación en todos los demás píxeles del fotograma, el resultado final es una escena iluminada de forma realista… aunque todavía es necesario un buen grado de procesamiento adicional para ordenar la imagen final.

Esto es un proceso muy costoso computacionalmente. Afortunadamente, las últimas GPU de AMD y Nvidia incorporan unidades de hardware dedicadas para acelerar este proceso.

Pero incluso con las GPUs y CPUs más potentes, un fotograma con trazado de rayos tarda muchísimo tiempo en hacerse, mucho más que uno renderizado de forma tradicional, utilizando sombreadores de cálculo y de píxeles.

Aquí es donde entra en juego el path tracing o trazado de trayectorias.

Path tracing

El concepto inicial de trazado de rutas fue introducido por James Kajiya en 1986, cuando era investigador en Caltech. Demostró que el problema de que un procesador se quedara parado, trabajando a través de un número cada vez mayor de rayos, podía resolverse mediante el uso de un muestreo estadístico de la escena (concretamente, algoritmos de Montecarlo).

El trazado de rayos tradicional implica el cálculo de la trayectoria exacta de reflexión o refracción de cada rayo, y su trazado hasta una o más fuentes de luz. Con el trazado de trayectorias, se generan múltiples rayos para cada píxel, pero rebotan en una dirección aleatoria. Esto se repite cuando un rayo choca con un objeto, y sigue ocurriendo hasta que se alcanza una fuente de luz o se llega a un límite de rebote preestablecido.

Esto en sí mismo probablemente no parece un gran cambio en la cantidad de computación requerida. Sin embargo, no todos los rayos se utilizarán para crear el color final del píxel en cada fotograma. Sólo se muestreará un cierto número de ellos y el algoritmo utiliza los resultados de una trayectoria casi ideal de rebotes de luz, desde la cámara hasta la fuente de luz. A continuación, se puede escalar el número de muestras para cada píxel, para ajustar la precisión de la imagen final.

A pesar de que el trazado de trayectorias suele disparar docenas de rayos por píxel, el resultado final es que hay muchos menos rayos que procesar.. El seguimiento de los rayos y la realización de sus cálculos de interacción son la razón de la mejora de rendimiento, en comparación con el renderizado normal de rayos normal (ray tracing).

Además, la calidad imagen es comparativamente muy buena. Normalmente, un menor número de rayos daría lugar a una iluminación menos realista, pero como la mayor parte del color de los píxeles del fotograma sólo se ve afectada por los rayos primarios, desechar la mayor parte o la totalidad de los secundarios no afecta a las cosas tanto como uno podría pensar.

Ahora bien, si la escena contiene muchas superficies que reflejan y refractan la luz, como el cristal o el agua, entonces esos rayos secundarios sí son importantes. Para evitar este problema, o bien el algoritmo se ajusta para tener en cuenta la distribución de los tipos de rayos que se deben obtener en una escena, o bien esas superficies específicas se manejan en su propio pase de renderizado de “trazado completo de rayos”.