Una de las preguntas sobre la siguiente generación que mucha gente se hace es: ¿Vamos a ver hardware especializado en el Raytracing o no? Esta pregunta que puede parecer una banalidad es importante si nos fijamos en los resultados de la implementación del pipeline híbrido, que no es otra cosa que el uso del Raytracing para solventar diferentes partes del pipeline de rasterizado.

El tema aunque puede parecer pesado es importante por un motivo bien simple, en la rasterización cada vez que un pixel es actualizado en cuanto a su información de color se ejecuta un Pixel/Fragment Shader o un Compute Shader dependiendo del caso, a nivel de potencia de cálculo es lo mismo pero se ha de tener en cuenta que el hardware especializado en el Raytracing solo se encarga de determinar si un rayo de luz impacta sobre un objeto o no impacta pero la consecuencia de calcular el impacto del rayo sobre el objeto no lo calcula sino que esto depende de los shaders.

Veamos el siguiente video donde Tatu Aalto de Remedy Entertainment explica su adaptación del Northlight Engine al pipeline híbrido:

Nvidia en su marketing no para de repetir que el Raytracing en Turing es unas cinco veces más rapido que Volta… ¿Pero bajo que condiciones? En la presentación que os he puesto (dura 1 hora lo se, tenéis libertad para verla o no) el propio Tatu Aalto afirma que el tiempo en Volta para que con un solo rayo por pixel (lo que es la frecuencia de muestreo más baja posible) se calculen via Raytracing los reflejos o el Ambient Occluion es de 5ms para cada elemento, pero en Turing la cosa se reduce a 1ms… ¿El motivo? El 80% del tiempo es para la comprobación de la intersección de lo rayos con lo objeto pero el tiempo de aplicar el shader es relativamente corto.En el caso de las sombras con la Titan V es de unos 4ms de tiempo, reduciendose a 1ms al utilizar lo RT Cores para el calculo de la intersección que es la clave de dicha aceleración.

Dicho de otra forma, si aplicaramos en Volta las sombra, reflejos y la oclusión ambiental via Raytracing sin ningún acelerador entonces estaríamos hablando de unos 14ms de tiempo de fotograma solo para estos tres efectos y tampoco con mucha precisión, con Turing la cosa se quedaría en un solo en 3ms pero si tenéis la oportunidad de ver el video veréis que los reflejos con solo 1 muestra por pixel tienden a un flickering constante que es enormemente molesto… ¿Que es lo que tienen que hacer? Invocar 3 rayos adicionales por pixel para los reflejos, por lo que pasa a ser 4 spp que se come unos 4ms de tiempo en una 2080 Ti que es casi el 25% del tiempo de fotograma a 60fps, pero lo mismo bajo computación pura y dura se iria a los 20ms.

Esto sería más que suficiente para justificar el traslado de la rasterización pura al pipeline híbrido pero hemos de tener en cuenta que hablamos de un post-procesado de una imagen previamente calculada y renderizada realmente a través de la rasterización por lo que el sistema contiene una información prevía con el que construir la imagen completa.

En el Raytracing puro y por tanto sin rasterización previa se necesitan una enorme cantidad de muestras por pixel para obtener la imagen completa con la suficiente definición y con el menor ruido posible. Os voy a dar un ejemplo para ello que es bien simple. Una escena muy famosa para comprobar el rendimiento del raytracing es la Box Scene porque el contenedor dos esferas completamente reflectivas con el entorno nos encontramos ante algo que la rasterización no puede representar.

Supongamos que queremos renderizar la escena utilizando solo raytracing y con 8 muestras por pixel, sin utilizar previamente la escena en forma de rasterización, pues bien, este sería el resultado.

Existe una enorme cantidad de ruido y no hay suficiente información para construir la escena de forma fidedigna. Si vamos subiendo nos daremos cuanta de la cantidad de muestras necesarias para construir correctamente la escena y con buena definición.

40 muestras:

200 muestras:

1000 muestras:

La cosa esta mejor pero sigue existiendo ruido, por lo que tenemos que subir aún más la cantidad de muestras por pixel… ¿Que tal 5000 muestras por pixel?

Tened en cuenta que todas esas escenas de «Raytracing» del marketing de Nvidia son en realidad escenas rasterizadas donde se usa el Raytracing para solventar ciertos problemas. El Raytracing en combinación con el denosing para generar la escena, como ya he comentado previamente en el blog, el Denoising fue utilizado anteriormente por Pixar con tal de reducir la cantidad de muestras para el renderizado via Raytracing y con ello reducir el tiempo del mismo.

Es decir, lo que obtenemos en este caso no es la escena fisicamente y matematicamente correcta, sino de una especulación por parte del sistema para la construcción de la escena. Obviamente para funcionar bien el sistema necesita una muestra previa de información como referencia… ¿De donde la obtiene? Pues aunque parezca parodojico del renderizado de la escena con iluminación directa a través del rasterizado en el caso de los videojuegos, pensad que el raytracing se aplica como un post-procesado a la imagen.

Pero la pregunta es… ¿Como sabemos que es correcta? Dicha especulación es lo suficientemente buena como para dar el pego y no gastar una cantidad ingente en potencia. A nivel de hardware y por el momento dicha especulación se realiza utilizando los Tensor Core en las Nvidia Turing (GTX 20×0). ¿Cual es la conclusión que se puede sacar de esto? Si quitamos los Tensor Cores entonces la cantidad de información en la parte Raytracing del pipeline híbrido trabaja con tan pocas muestras que acaba estando sumamente alejado el resultado de como debería ser. ¿Cual es el problema? Pues que dicha especulación puede estar sumamente alejada de lo que sería la escena calculada matemáticamente de manera precisa y exacta y aún así en cierto casos nos parecería lo suficientemente buena.

En el Raytracing híbrido lo que se hace es utilizar es una vez generada la escena via rasterización es re-construirla a través del Raytracing, para ello es neceario almacenar la geometria en una estructura de datos espacial para conocer la situación de los objetos de la escena, por tanto el raytracing en este caso es un renderizado tipo First Sort porque ya tenemos la geometria de la escena ordenada antes de la primera etapa pero sobretodo es fácil construir la escena con pocas muestras por el hecho que ya tenemos la escena previamente rasterizada por lo que la especulación final via denoising no acaba teniendo esa enorme cantidad de ruido que existe en el raytracing puro y duro.

Pero el problema es que con tan pocas muestras las escenas resultantes son incluso menos precisas que utilizando la rasterización y se ven peor visualmente que en la rasterización pura y dura. ¿Cual es la solución que emplean? Pues añadir más información y nos encontramos por ejemplo que los mapas de sombras via rasterización que deberían ser eliminados de la ecuación por el uso del raytracing para las sombras acaban apareciendo de nuevo. ¿El motivo? información adicional sobre la escena que aunque sea falsa al aplicar el denoising o cualquier tecnica similar para ello tengan un poco más de información para especular la escena aunque sea matemáticamente incorrecta. Lo de los mapas de sombras es sorprendente porque demuestra lo primitivo y alejado que esta el Raytracing incluso el híbrido para solventar ciertos problemas visuales.

Un ejemplo de «suma de información» para el denoising lo podemos encontrar en Battlefield V.

En este caso nos encontramos que DICE utiliza las Screen Space Reflections para mejorar los reflejos. ¿Y que tiene que ver esto con lo anterior? Tanto lo mapas de sombras como los screen space reflections son la solución del rasterizado a ciertos problemas visuales y lo que tiene que llevar el raytracing es una solución visualmente más exacta con efectos que sustituyan a lo efectos del rasterizado. ¿Que sentido tiene utilizarlos? Pues que el Raytracing por el momento no es lo suficientemente bueno para operar solo ni tan siquiera en modo híbrido y no creo que en la siguiente generación veamos hardware más potente que una 2080 Ti.

Con las malas lenguas de que el primer hardware «Scarlett» podría no tener soporte para Raytracing y ser continuista con la actual generación y viendo los problema que tiene el raytracing en estos momentos por lo verde que esta uno se pregunta si lo vamos a ver estandarizado en la siguiente generación o en su defecto lo que vamos a ver es que va a ser algo para las versiones avanzadas o ni eso.

El otro tema es el coste en cuanto a hardware, para el Raytracing son necesarios el añadido de una solución tipo Tensor Core y los RT Cores, da igual la forma en la que lo implementen pero esto va a quedar estandar en todos los sistemas. De cada SM en las Turing un 35% del hardware corresponde a los Tensor Cores y al RT Core.

Las unidades SM ocupan el 56% del chip por lo que el 19.6% del mismo corresponde a la parte para el Raytracing pero hemos de tener en cuenta que la 2080 Ti es una GPU que realiza raytracing a 1080P, nada de 4k y nada de hacerlo perfecto y aparte que el espacio ocupado por las unidades especializadas acaba por restar espacio el resto en una reticula limitada. Sinceramente y siento decirlo, no veo motivo para el cual aplicar el actual fake tracing en el hardware de las consolas actuales, porque por los motivos que antes he comentado…No es ray tracing y si alguien me responde que asi, mi respuesta es:

Con todo el respeto pero es la verdad, el Raytracing es el motivo de venta de las Turing y es algo que AMD aún no ha implementado pero AMD tiene razón en no implementarlo todavía porque no funciona realmente como debería funcionar y no hay discusión para ello, de ahi a que el desarrollo de la Next Gen se este centrando en cosas como estandarizar la realidad virtual, el 4K nativo y elementos que a corto plazo son mucho más posibles y que van a funcionar bien y no como el actual fake tracing o bluff tracing.

Con esto termino, tenéis los propios comentario del blog y el Discord del mismo para comentar esta entrada si queréis.