Las dos demostraciones técnicas más impresionantes en los Game Awards 2021 fueron Hellblade II por parte de Ninja Theory, en propiedad de Microsoft, y la demo The Matrix Awaken creada para mostrar las capacidades del Unreal Engine 5. Ambos juegos muestran la fuerza de Nanite, una de las puntas de lanza de dicho motor e imposible de hacer en la anterior generación.
El mayor cuello de botella de las GPU
El mayor cuello de botella en las GPU es la unidad de rasterizado. La cual se sitúa en el centro mismo del pipeline gráfico, que no del propio chip. ¿Su trabajo? Convertir todos los triángulos 3D y, por tanto, formados por vértices en conjuntos de píxeles 2D para su posterior coloreado y dibujado en pantalla.
No obstante tal unidad en el procesador gráfico tiene una serie de cuellos de botella que hacen que los juegos visualmente se vean limitados. En especial a aquellos que no están preparados para realizar la etapa de rasterizado sin tales unidades.
Las limitaciones del rasterizado
El primero de ellos es que la cantidad de geometría que se puede generar es 2 o 4 veces la velocidad de reloj de la GPU y llegado a un punto dicho límite es un problema, en especial cuando empiezas a tratar con geometría cada vez más pequeña y, por tanto, la densidad de la misma aumenta considerablemente.
El segundo problema tiene relación con el tamaño en píxeles de los fragmentos, siendo estos en lo que se convierten los triángulos 3D al pasarse a bloques de píxeles 2D. Independientemente del tamaño del fragmento final la tasa de triángulos no varía. Esto es debido a que una vez ha ocurrido el rasterizado los diferentes píxeles del fragmento de reparten entre las diferentes Compute Units. ¿Cuál es el límite? 8 x 8 o 64 píxeles que se distribuyen en 16 Compute Units en bloques de 2 x 2 píxeles por cada una.
Esto significa que si estamos ante un triángulo más pequeño, lo que ocurre en el 99% de los juegos, entonces se hará trabajar a menos Compute Units. Este es un problema generalizado durante la pasada generación y que no se puede solucionar por limitaciones en la propia GPU a no ser que tiremos de Compute Shaders y le carguemos todo el trabajo de nuevo a los programadores gráficos para realizar una función que estaba ya automatizada y, por tanto, fuera de su responsabilidad desde la primera Voodoo Graphics.
Nanite, la solución en Unreal Engine 5 para la geometría
En el nuevo motor de Epic la solución viene por el uso de una solución mixta. Donde los triángulos de gran tamaño son rasterizados en la unidad de rasterizado y los de pequeño tamaño a través de los Compute Shaders y el resultado es poder aumentar la densidad geométrica en las escenas de manera considerable al evitar el cuello de botella que antes he mencionado.
Esto permite una mayor ocupación de las Compute Units y un mayor aprovechamiento de la potencia. Bajo el viejo paradigma si bien es cierto que se acaba ocupando buena parte de la GPU se creaban burbujas en los que en una gran cantidad de ciclos dichas unidades que son clave para el renderizado quedaban sin hacer absolutamente nada. ¿Es posible que veamos futuras GPU con unidades de rasterizado capaces de trabajar con triángulos de diferentes tamaños? Pues no sería de extrañar, pero no es el caso de PS5 y Xbox Series, por lo que los desarrolladores tienen como potencia límite la capacidad de cálculo de las Compute Units.
La importancia del SSD para Nanite
La clave en todo esto se encuentra en el SSD, que si bien no es utilizado como memoria de la GPU de manera directa, sí que se encarga de proveer a gran velocidad los datos necesarios para la construcción de la escena. Si en la generación pasada teníamos a las texturas virtuales con una textura como atlas de texturas general que almacenaba todas las ídem del fotograma actual, ahora esto ha cambiado y no únicamente la amplia velocidad del SSD mejora dicha función, sino que además permite volcar a memoria la información localizada de esa parte de la escena. A esto Epic lo ha llamado Nanite.
Formulado de otra manera, sin el SSD tienes que asegurarte que toda la información poligonal del nivel está en la VRAM o al menos de la sección visible del mismo para luego inventarte una escena de transición para cargar los datos desde el disco duro. Bajo el nuevo paradigma puedes centrarte en lo que ve el jugador y montar el detalle del escenario a medida que pase por ahí. Por ejemplo en un juego de velocidad el circuito no estaría totalmente renderizado, solo una parte más allá de lo que puede contemplar el jugador, pero extremadamente detallada. El resto no haría falta que fuese renderizada, ya que no sería visible. Esto se puede aplicar a todos los géneros y aumentar el nivel de detalle.
Nivel de detalle
Esto se traduce en que en los mundos abiertos podemos concentrar toda la potencia visual y el nivel de detalle a corta distancia en vez de distribuirla por todo el escenario de manera uniforme. En realidad no tiene sentido que lo que está más lejano y con menor precisión tenga el mismo nivel de detalle que los objetos cercanos al jugador. No obstante, esto era debido al cuello de botella por la falta del SSD. Nanite y su capacidad para tener un atlas de la geometría cercana nos permite concentrar la capacidad gráfica en objetos cercanos a los ojos del jugador.
La capacidad de poder generar de manera automática assets geométricos de menor tamaño con solo ir simplificando el modelo más complejo es una de las ventajas clave del nuevo pipeline geométrico. No solamente este elimina la geometría superflua, a nivel de no verse, sino que reduce la cantidad de detalles con la distancia, ya que no tiene sentido que si no puedes ver algo no lo veas. Sin embargo, esto se lleva mal con los algoritmos de renderizados a través de la IA como el DLSS donde internamente se renderiza a menos resolución que como se emite la imagen en pantalla.
El cuello de botella para Nanite
El mayor cuello de botella es la CPU, la cual si bien es cierto que es ahora cuatro veces superior en potencia respecto a la pasada generación, esta sigue siendo la encargada de crear la lista de pantalla y, por tanto, de calcular la posición de cada objeto en pantalla. Para elementos estáticos esto no es problema, pero si hablamos de objetos que se han de animar, pueden cambiar de posición en la escena o son deformables entonces la potencia de cálculo necesaria para la CPU aumenta. Este es el motivo por el cual Nanite no se puede aplicar a todos los elementos de la pantalla. En la demo de Matrix Awakening todos los elementos utilizan vía Nanite, sin embargo, tan pronto se ha de cambiar la forma de un objeto se cambia al sistema tradicional.
Y aquí entramos ante el tercer y último elemento que separa una generación de la otra, el uso de una CPU más potente que permite controlar una mayor cantidad de elementos en pantalla. No obstante esta no es suficiente para los años venideros y se va a convertir en el mayor cuello de botella y en la estandarización, al menos en PC, de procesadores gaming de más de 10 núcleos y no os extrañe que de aparecer iteraciones mejoradas de las actuales consolas las veamos con una mayor cantidad de núcleos que los actuales 8, solo con el hecho de que la cantidad ingente de geometría a la que posicionar en pantalla no ahogue al procesador.
Hellblade II: Senua’s Saga
Y aquí entramos en lo que para mí es una enorme decepción técnica como es Hellblade II por el hecho que el hardware de nueva generación permite hacer mundos abiertos y no pasilleros con gran número de detalles. Pues bien, esto no lo aprovecha la demostración de Ninja Theory. Más bien utiliza los trucos cinemáticos de siempre, donde una vez le dejas la cámara al jugador se ve todo el cartón-piedra.
Y es que hay cosas que al darle el control de la cámara y la acción al jugador se pierden por completo. Por ejemplo no puedes controlar la iluminación por el hecho que no sabrás dónde se encuentra cada objeto y tampoco podrás predefinir las animaciones. La trampa está en el tiempo real, pero esto no significa jugable, es decir, no se trata de un vídeo, pero decepciona como muestra de fuerza de la próxima generación.
The Matrix Awakens
Tras experimentar la demo interactiva, recordemos que al contrario de Hellblade II esta es jugable, puedo manifestar que no observo nada en la demostración que suponga algo técnicamente impresionante si separamos los diferentes elementos visuales. Bueno, sí que hay algo y es el uso de Nanite.
¿El resto de cosas? Si miramos la animación no es mejor que un juego de PS4 o Xbox One y la iluminación no es mejor que los juegos punteros de la generación pasada. Y es que los artistas aprendieron a simular de manera muy eficiente la iluminación global. Lo cual se traduce en que no basta con aplicar el trazado de rayos, sino que esto se ha de hacer a grandes niveles de potencia que las consolas y especialmente la limitada implementación del RDNA 2 carece. No podemos esperar tampoco más de un hardware que se vende por debajo de los 500 euros, al menos la demostración es sincera y nos muestra que el hardware de las nuevas consolas está muy limitado realmente.
Por otro lado, en las partes de las escenas no-interactivas hemos de aplicar la misma lógica que en Hellblade II, ya que al no darle al jugador el control de la cámara les permiten a los desarrolladores aplicar algunos trucos con tal de mejorar la calidad visual de dichas escenas. Como punto final, a destacar la suave transición entre las escenas interactivas y las no-interactivas, otra de las ventajas del SSD.
La clave no es el SSD. No te olvides de la RAM. La demo de Matrix no llega a 30 GB, y ni siquiera la mitad son polígonos. Y eso sería si se quisiera volcar toda la geometría de golpe a la RAM. Serán quizá varios GB de triángulos, pero caben de sobras en la RAM.
El texturizado de esos polígonos seguramente use megatextura, que también va incluida en Unreal 5 pero Epic no le da bombo. Y eso sí que requiere optimización, que todos recordamos el popping de texturas de Rage y su baja resolución de texturas. Es algo que con la calidad de texturizado que esperamos devora el ancho de banda, y estas sí que podrían requerir un SSD normal, a menos que se gestione bien un gran buffer de texturas en RAM de sistema, de apoyo a la VRAM, y de paso así no tienes como mínimo 8 GB de GPU sino que puedes bajar los requisitos. Que después de todo la megatextura es streaming, igual que nanite (pero se come mucho más ancho de banda)
La parte donde dices que el detalle se distribuía de manera uniforme en un sandbox también está equivocada, el marketing te ha hecho olvidar el LOD y el popping que se ha usado desde los 90. Siempre se ha concentrado el detalle en las narices del jugador. Esa imagen de Naughty dog es pura propaganda.
En la parte de la iluminación no estoy nada deacuerdo , otra cosa por lo cual la demo estan realista es porque tiene una iluminación Global y reflejos realista gracias Lumen, lo que se ve en esta demo con Lumen esta muy lejos de lo que se consigue actualmente en juegos GI Probe + SSAO y reflejos SSR, lo de Lumen solo consigue con Ray Tracing, aunque Lumen en realidad es Ray Tracing pero utilizando el SDF de la escena en vez de la geometria como se hace en el Ray Tracing normal, eso le permite tener una GI y reflejos realistas aun bajo coste en rendimiento y sin necesidad de aceleración del hardware RT dedicado en las GPU, es una especie de Voxel Cone Tracing.
Para mi Lumen es un As que se saco los del epic de la manga, porque les permite resolver la GI y reflejos con resultados realista aun coste bajo, ya que una escena de estas con Ray Tracing normal(Triangulo) no lo moveria las consolas ni 1080p y el resultado seria mas o menos el mismo en calidad de iluminacion.
Por Otro lado Nanite es como el concepto del Mesh Shaders no? descarte de geometria mas eficiente y LOD completamente dinamicos.
En esto me pregunto si utilizando el Mesh Shader Nanite seria mas eficiente, ya que nanite funciona en todo hardware, mientras que el Mesh Shaders solo es compatible en Turing/Ampere y RDNA 2 (RDNA1 Primitive shaders), necesita cambios en hardware, por cual puede que sea mas eficiente, que la implementación de nanite.
Nanite es streaming de micropolígonos, y si hay mesh shaders, lo aprovecha.
lo que esta claro es UE5 es el 1º motor nextgen, y solo algunos internos pueden llegar a esto… pero no sabemos cuales ni cuantos motores internos se han actualizado… con cosas nextgen y esto solo esta empezando
creo que entre esto sistemas como nanite, lumen, dlss FSR solo es el comienzo de mas por menos… creo que se esta trabajando en un sistema de RT con un sistema de esto.. pero RT , RT, al estilo lumen donde hacer RT normal sea mucho mas eficiente… otro de los motores a actualizarse seria unity otro motor base muy usado