¿Cuál será la siguiente evolución en las tarjetas gráficas?

A través del tiempo, las GPUs han ido evolucionando en su arquitectura, añadiendo nuevos elementos a la misma para hacer posibles nuevas funciones, y especialmente para mostrar gráficos cada vez más sofisticados. Con la reciente aparición de las unidades de aceleración para el Ray Tracing la sensación es que las GPUs no iban a evolucionar mucho más, pero el uso de micropolígonos en ciertos juegos futuros nos asegura una serie de cambios en cuanto a su arquitectura.

En el 2018, cuando NVIDIA empezó a apostar por el Ray Tracing dejo caer un mapa de ruta de 5 años para que los juegos dejarán de funcionar en motores gráficos basados en la rasterización para pasar a utilizar motores gráficos basados en el trazado de rayos.

Pero no os vamos a hablar del Ray Tracing en concreto, ya que intentaremos explicar el motivo por el cual la rasterización dejará de utilizarse como algoritmo base para el renderizado de una escena en 3D a tiempo en juegos futuros. Es decir, que es lo que provocara el punto de inflexión en el que el trazado de rayos acabe siendo más eficiente, lo cual hará que la arquitectura de las GPUs actuales sufrán otra evolución importante.

La clave está en la geometría

Elephant Wireframe

Toda escena en 3D, independientemente de si es la de un juego o una película que ha sido generada en caros servidores, utiliza polígonos para la formación de los elementos de la escena, independientemente del algoritmo que estemos utilizando. La diferencia es como el trazado de rayos y la rasterización ejecutan la escena:

  • Ray tracing: Por cada píxel que haya en pantalla, por cada primitiva que haya en escena, el rayo hace intersección con la primitiva que esté más cerca de la cámara.
  • Rasterización: Por cada primitiva en la escena, por cada píxel cubierto por la primitiva, marca el píxel más cercano a la cámara y lo almacena en el z-buffer.

Ray Tracing vs Rasterización

Esto se traduce en que llega un punto en que la complejidad de la escena es tan alta para la rasterización que se vuelve mucho más lenta que el ray tracing porque esta va a procesar toda la geometría, mientras que el trazado de rayos tiene la capacidad de descartar de entrada toda geometría no visible y superflua.

La era del micropolígono

Micropolígonos

Un micropolígono es un polígono que a la hora de ser rasterizado tendría un tamaño de un píxel o de menos de un píxel. Por lo que estamos hablando de la clase de geometría más densa de todas y por tanto es el punto donde el rasterizado pierda toda su eficiencia en comparación con el trazado de rayos.

La particularidad principal de los micropolígonos es la forma en la que varían el pipeline gráfico tradicional, el motivo de ello es que una vez hemos reducido el tamaño de la geometría a un solo píxel, entonces el concepto textura desaparece y podemos darle el color que queramos a ese píxel antes del rasterizado, lo que provoca que la las unidades de rasterizado y los ROPS acaben formando parte de la etapa final y se unifiquen en una sola.

Si esto os parece extraño, que mejor que darle una ojeada al Renderman de Pixar, el cual se basa en micropolígonos, ya desde sus inicios.

REYES: cuando la rasterización pasa a utilizar micropolígonos

Renderman Toy Story

REYES es el acrónimo de Render Everything Your Eyes See y es el pipeline gráfico creado por Pixar para su Renderman. el cual fue utilizado durante años y antes la implementación del Trazado de Rayos en sus películas, se trata de un motor de renderizado offline que no se pensó para renderizar escenas a tiempo real.

REYES vs Rasterización

La particularidad de REYES es que renderiza utilizando micropolígonos, es decir, lo cual provoca que el pipeline de renderizad sea distinto que el utilizado en los derivados y evoluciones de OpenGL, como Direct3D y Vulkan. Siendo el cambio más importante la desaparición de la etapa de texturizado en el pipeline tipo REYES.

Pero para su implementación es necesario hacer cambios profundos en el pipeline gráfico, especialmente en dos unidades de función fija que se han mantenido intocables durante años: las unidades de rasterizado y las unidades de texturas.

Teselación adaptativa y micropoligonaje

Los recién implementados Primitive/Mesh Shaders son una de las claves para la implementación de la teselación adaptativa. la cual se basa en que el nivel de teselación depende de la distancia respecto a la cámara, de tal manera que los objetos más cercanos a la cámara son teselados en mucha mayor medida que los objetos más lejanos a la cámara.

Teselación

Esto permite aplicar la teselación masiva a los objetos, la cual permite generar una malla compuesta por micropolígonos a partir de ir subdividiendo recursivamente la geometría de cada modelo en la escena.

Estos cambios son el primer paso para la implementación de un motor de renderizado basado en micropolígonos al estilo REYES, pero funcionando a tiempo real.

Cambios en la unidad de rasterizado por el uso de micropolígonos

Eficiencia Rasterizador

La unidad de rasterizado es una unidad de función fija, y por tanto no programable, que tienen todas las GPUs. Al ser una unidad de función fija siempre funciona a una tasa constante, ya que siempre aplica el mismo algoritmo sobre los datos que le entran.

Lo que hace la unidad de rasterizado es convertir la geometría 3D en fragmentos 2D compuestos por varios píxeles, la tasa de conversión de cada unidad de rasterizado es 1 triangulo por ciclo de reloj. Esta unidad estuvo mejorando su tasa hasta que se llegó al ratio de un triángulo por ciclo para luego ir aumentando la cantidad de estas unidades.

¿Pero de hasta cuantos píxeles pueden ser los fragmentos generados por cada triangulo? La respuesta la tenemos en el ratio de unidades ROP por unidad de rasterizado y actualmente es de 16:1, esto significa que enviar fragmentos de más de 16 píxeles a las Compute Units no aporta nada… ¿Pero ¿qué ocurre si enviamos menos de 16? Pues que la eficiencia de la GPU durante la etapa posterior al rasterizado disminuye.

Uso de micropolígonos en los juegos.

Unreal Engine 5 Micropolígonos

La demostración de que la actual unidad de rasterizado está limitada la tenemos en Nanite, la tecnología de micropolígonos de Unreal Engine 5 cuya implementación ha hecho que sus creadores no puedan utilizar la unidad de rasterizado de toda la vida, lo cual ha forzado a los programadores a utilizar los Compute Shaders para ello.

Esto es similar a las primeras implementaciones del Ray Tracing bajo DXR que se mostraron en la GDC de 2018, las cuales corrían en NVIDIA Volta, sin las RT Cores, y pese a la mayor capacidad de esta GPU en el cálculo que las NVIDIA Turing que salieron más tarde, nos encontrábamos con que Volta se ahogaba por culpa de los reiterados, constantes y repetidos cálculos de la intersección de cada rayo, mientras que Turing no gracias a los RT Cores.

Se ha de tener en cuenta que en gráficos toda función recursiva y repetitiva es llevada a cabo por unidades de función fija o por aceleradores, lo cual deja completamente libres a los shaders y hay que tener en cuenta que realizan el trabajo de manera mucho más rápida, consumiendo menos energía y espacio.

La unidad de texturas tiene los días contados

Texture Unit Diagram

Si os fijáis en las diferentes arquitecturas de GPU que han ido apareciendo, podréis observar como todas ellas tienen una configuración de 4 unidades de texturas. El motivo de ello es para aplicar el filtro bilineal, el cual se realiza tomando los 4 píxeles adyacentes a cada píxel.

Esto significa que las Compute Units no reciben los fragmentos de forma unitaria sino en conjuntos de 2×2 píxeles, por lo que las unidades de texturas tienen la misma clase de ineficiencia que las unidades de rasterizado, pero esta es diferente, ya que la unidad de texturizado lo que hace es inventarse los téxeles que le faltan copiando de resto de píxeles.

Si enviamos un micropolígono solitario que es un solo píxel, esto haría que la unidad de texturas lo tratase como un fragmento de 2×2 píxeles y lo procesará como tal. Este es el motivo por el cual estas unidades en un futuro van a desaparecer, ya que es mucho más fácil manipular el valor de color de cada micropolígono antes de la etapa de rasterizado.