Recientemente Nvidia ha activado la capacidad de ejecutar los efectos Raytracing en las GPUs sin RT Cores, es decir, en la serie Pascal. Hay que tener en cuenta que no estamos hablando de Raytracing puro y duro sino el uso de este algoritmo como base para solventar ciertos poblemas visuales que la rasterización no puede resolver con la precisión deseada.

¿Con que nos encontramos? Pues que cosas como la generación de sombras, reflejos, oclusión ambiental… Y todo aquello que depende directamente de la posición de las fuentes de luz y de cada uno de los objetos hacer que para el Raytracing se necesite la posición de cada objeto en cada fotograma en forma de una estructura de datos que ordena los objetos en el espacio para poder simular el recorrido de los rayos de luz en el escenario.

Esto se puede hacer por «software» que es una forma de decir que se puede realizar a través de los Compute Shaders, pero el coste es de más de 1000 operaciones por ciclo por rayo con tal de calcular solo la interesección. Pensad que como mínimo es un rayo por pixel y un rayo por cada tipo de efecto… Dicho de otra forma y suponiendo que tenemos una escena que utiliza un solo rayo para sombras y por tanto una sola muestra por pixel (1 spp) a 1920×1080 pixeles esto serían unos 2 GFLOPS/fotograma para la intersección, no parece mucho, pero el objetivo a corto plazo es ir a precisiones mucho más altas.

El tema es que para que el Raytracing sea realmente eficiente se necesita una cantidad considerable de muestras por pixel. Actualmente el uso de este es paupérrimo utilizando los efectos de Raytracing con sus equivalentes en rasterización menos eficientes a los que pretente sustituir y aplicando solo el Raytracing en las distancia cortas o solo en objetos puntuales. Esto tiene sentido si tenemo en cuenta que en todos los juego mostrados el Raytracing ha sido un añadido de última hora. El caso es que es difícil medir el Raytracing Híbrido por su funcionamiento y esto se viene explicado por la parte del pipeline relacionada con el Raytracing.

Cada objeto se puede convertir en un emisor o no de un rayo adicional que es recursivo, lo que hacemos con el Raytracing Híbrido es que la iluminación directa, la que es generada por las fuentes de luz de la escena sobre los objetos se rendericen de manera normal, pero la indirecta se genere via trazado de rayos tomando como fuente de luz el propio objeto, obviamente no todos los objeto van a comportarse iguales y dependerá de la naturaleza que se quiera representar.

En teoría y teniendo en cuenta el Ray Tracing puro y duro un rayo ira atravesando la escena lo que generará un árbol BVH en consecuencia…

El RT Core o la Tree Traversal Unit (se llama asi por el arbol generado) es la que generará la genealogia del rayo utilizará el BVH de la escena para saber cual es la colocación de los objetos y saber por donde ira el rayo de luz. En cada objeto que rebote se harán los cambios necesarios en sus valores de color correspondientes. Hay que tener en cuenta que los rayos de luz seguirán rebotando indefinidamente mientras exista «energía» o salgan de la escena. También hay que tener en cuenta que lo objetos según su naturaleza iran atenuando o manteniendo esa energía.

Pero en el caso del Raytracing híbrido (DXR y similares), los desarrolladores pueden escoger si la luz rebota sobre un objeto o no .Es decir, no tenemos un rayo rebotando tecnicamente hablando, tenemos un rayo que colisiona con un objeto, afecta los valores de dicho objeto y este se convierte a su vez en una fuente de luz nueva con sus propios parámetros.

Es por ello que en el pipeline del DXR esto viene explicado, la generación de nuevo rayos depende de un shader controlado en el código del juego. La idea principal es que solo la iluminación directa sea generada por la rasterización y el resto a través del raytracing, pero esto no siempre es así y se ha de explicar bien.

Como he dicho muchas veces la formula esta extremadamente simplificada, pero suponiendo que un rayo alcanza toda la escena entonces rebotará con todos los objetos y así sucesivamente, de ahí la siguiente formula:

En el Raytracing KE corresponde en este caso a la luz directa y K^2E a la iluminación indirecta… para un segundo rebote sería necesadio un K^3E. Pero dado que en la rasterización carecemos realmente de la información necesaria para saber como es el viaje de luz de manera indirecta, la rasterización no puede representar la iluminación indirecta bien, de ahí a que muchos desarrolladores lo que están haciendo es generar la iluminación indirecta de manera falseada a través de mapas de sombra, mapas de entorno… Y luego con los objetos y a partir de esa información generar el segundo rebote por lo que matematicamente hablando la formula de arriba se convierte en:

Esto significa que durante la generación de la iluminació directa a indirecta por rasterización no se genera ningún arbol porque no estamos hablando de rayos recorriendo la escena. Dado que el raytracing se aplica a posteriori este se utiliza para generar el segundo rebote de iluminación indirecta pero de forma mucho más simplificada en la formula:

¿Y porque los juegos actuales no aplican todo el raytracing de arriba a abajo? En primer lugar porque no se pensaron para ello y esto rompe el apartado artístico por completo…

Es por ello que la mayoría de juegos están aplicando el Raytracing para simular el segundo rebote indirecto aunque sea partiendo de algo tan matemática incorrecto como es hacer el primero via rasterización pero es que no hacerlo afecta el estilo gráfico del juego y no solo eso.La clave esta en ahorrarnos la enorme cantidad de intersecciones que aunque se pueden calcular via RT Cores/Traversal Units en realidad hace que el coste suba enormemente incluso para estos, imaginaos ahora sin esas unidades. Por ejemplo suponiendo que tenemos una simple muestra a 1080P eso son unos 2 GFLOPS pero eso solo con un rebote, el segundo rebote rebote será recursivo y puede mover la carga gráfica hacía los TFLOPS. Pero la pregunta es… ¿Es necesaría la precisión matemática y de la representación de los objetos o con una aproximación tenemos suficiente?

El alto coste del Raytracing es lo que hace que en muchos juegos que lo aplican en vez de aplicar todo el pipeline visual con el Raytracing se utilice solo para ciertos elementos puntuales. De ahí a que Nvidia pueda plantear el uso de las GTX porque si la iluminación se hiciese como supuestamente se ha de hacer entonces no podrían.

Pero es que el Raytracing con pocas muestras tiene un problema añadido y es que la imagen es demasiado limpia…

Es por ello que con tal de aumentar el realismo se acaban generando escenas con el Raytracing puro no de decenas sino de cientos e incluso miles de muestras y esto en potencia de calculo es imposible llevarlo a cabo a tiempo real.

Con la rasterización a través de los shaders podemos conseguir esa irregularidad en los gráficos que en el caso de utilizar Raytracing con pocas muestras se perdería, obviamente la rasterización no soluciona el problema del transporte de luz de manera tan eficiente pero durante años ha sido lo suficientemente buena y el paso al Raytracing incluso bajo un modelo híbrido no es tan fácil como poner una serie de unidades para calcular la intersección y/o emular estas y en el último caso la necesidad computacional aumenta enormemente.

¿Y que tiene que ver esto con el soporte del Raytracing en las Nvidia Pascal? Ejem… En el video de Digital Foundry sobre el tema se ve la enorme diferencia existente en rendimiento entre Portal Royal que es la demo de Raytracing de 3DMark que utiliza el Raytracing para calcular casi todos los elementos en comparación con los juegos contemporáneos, las diferencias de rendimiento son realmente brutales…

Esto es debido a que Port Royal calcula la iluminación indirecta via raytracing pero el resto no, fijaos lo demasiado limpios que son los gráficos de Port Royal…

En los juegos la iluminación indirecta sigue siendo una representación imprecisa via rasterización pero en un entorno donde la interactividad esta por encima de la precisión visual y es normal que nos encontremos ante un escenario en cierta manera impreciso para la gente esto hace que sea suficientemente bueno para seguir impresionando y la carga computacional para sustituir las rasterización al completo es enorme y se ira haciendo paulatinamente con los años y paso por paso.

En lo que si que hay una ventaja muy clara por parte de la rasterización que se ve visualmente desde el principio es en los reflejos.

En el Raytracing simple el tipo de reflejo representado es el especular que consiste en generar otro rayo de luz en angulo y sentido inverso al rayo de entrada, los reflejos especulares corresponden a las superficies de tipo espejo. En cambio la luz difusa es mucho más dificil de representar matemáticamente por la cantidad de rayos producidos, es por ello que pienso que la luz difusa va a ser ignorada.

En la rasterización con tal de simular los reflejos, la escena es pre-renderiza al menos desde una posición de cámara y se salva en un mapa de texturas que se llama mapa de reflejos. El cual luego es aplicado a una capa de texturas en un renderizado posterior de la escena. Es el mismo método para generar mapas de sombras en la rasterización y de refracción y es son los que principalmente se intentan reemplazar con el raytracing híbrido. El problema es que muchos juegos actuales incluso teniendo soporte raytracing aplican aún los reflejos via un mapa de entorno vía rasterización y luego a partir de esa información generan un nuevo rayo que representa que sería el segundo rebote indirecto, pero no han existido otros rebotes previos realmente.

Para representar la naturaleza real de los objetos hemos de representar como se comportan ante la luz, el uso de la rasterización en la iluminación indirecta supone que los materiales no se representen tal cual como se debería:

Pero para que esto se aplique tiene que ser en juegos futuros que están en desarrollo y tardaremos en ver al menos unos tres años y cuando salgan las RTX 2000 y 3000 quedarán cortas. ¿Alguien se acuerda lo que ocurrió con los shaders? Al menos de 2-3 años para empezar a ver resultados. Con el Raytracing ocurrirá lo mismo y el hardware actual quedará completamente desfasada y sin ser competitivo. Lo que quiero que veais es que todos y cada uno de los juegos actuales no están pensados siquiera para el Raytracing híbrido real, son simples parches para efectos puntuales con tal de justificar en parte la compra de la gama RTX 20×0 por parte de la gente.

El hecho de dar soporta al «Raytracing» en las GTX es para que la gente diga… Oh… que mal va… No me alcanza una velocidad aceptable y por ello necesito comprar una RTX 20×0 para ello. Tarjetas que Nvidia quiere vender lo más rápidamente posible por motivos obvios el stock de las RTX 20×0 pero tieen que haber un incentivo para que la gente las compre.

Esto es todo, tenéis el Discord y los comentarios de la entrada para comentar.