Saltar al contenido principal

Metamorphosis VR

Un port de un juego a VR con hardware limitado.

Este port a Quest 2 y Quest 3 que hice fue uno de los proyectos más complejos técnicamente que tuve que realizar. No solo nunca había trabajado en VR, lo que me obligó a aprender un montón de técnicas y conceptos nuevos, sino que además debía, por los propios requerimientos de rendimiento de un juego con renderizado estereoscópico, mantener un altísimo framerate con una alta resolución en un hardware similar a un smartphone de 2020. Además, éramos un equipo reducido de dos personas y nuestro tiempo estuvo limitado a apenas unos 9 meses.

Zona del juego que tuvo que recibir mucho trabajo de optimización.

El hardware

El juego tenía que ser lanzado en dos sistemas de VR: las Quest 2 y Quest 3. Por lo tanto, tenía que ser optimizado para correr a 4K y 90FPS en las Quest 2. Esto era un requisito indispensable. El juego original, Metamorphosis, no destacaba precisamente por su optimización, ya que fue hecho para unas plataformas sustancialmente más potentes, lo que supuso muchos problemas: miles de draw calls de mallas sin agrupamientos correctos que provocaban costes intolerables en el RenderThread, poligonajes irregulares y completamente innecesariamente altos en muchas ocasiones, etc.

El juego también tenía algunas características que dificultaban su porting a un hardware tan limitado como las Quest 2, como son los múltiples espacios abiertos que impiden un correcto culling de la escena.

Render final

Quest 2 usa un chip Qualcomm Snapdragon XR2.

Adaptación a VR

El porting no solo requería una adaptación a nivel de gráficos, también era necesario introducir las mecánicas de los juegos de VR en un gameplay diseñado para juegos flat. Esto conllevaba un cambio radical del sistema de movimiento. Se creó un sistema de escalada que te permitía escalar prácticamente cualquier superficie como en el juego original, un sistema de movimiento inmersivo que requiere del empleo de tus manos y permite cierto movimiento físico local, etc.

Render final

Captura de una de las zonas iniciales.

Optimizaciones

Algunas de las optimizaciones más importantes que hicimos en el juego fueron la revisión exhaustiva de todos los materiales para reducir el coste por fragmento al mínimo, ya que la alta resolución del renderizado en VR permitía que ganásemos mucho frametime al disminuir la complejidad por pixel.

También, como ya ha sido comentado anteriormente, teníamos problemas con el RenderThread causado por un muy alto número de DrawCalls. Para solucionar esto recurrimos, entre otras medidas como la generación de HLODs, al instanciamiento masivo de miles de mallas estáticas que plagaban la zona, como son los ladrillos de la imagen a la derecha. De esta forma, conseguimos reducir las Draw Calls en zonas que llegaban a 4000 a tan solo unas 200-400.

Render final

Esta zona dio muchos problemas de Draw Calls.

Por diversos problemas con la empresa que nos encargó el proyecto, tuvimos que dejar el desarrollo antes de poder completarlo. El juego fue terminado por otra empresa y se publicó sin apenas cambios adicionales respecto al estado en el que lo dejamos: no hubo mejoras gráficas específicas para Quest 3, faltaban opciones de accesibilidad propias de VR y algunos problemas gráficos y de rendimiento quedaron sin resolver. A pesar de ello, me siento muy orgulloso del trabajo de nuestro equipo y del nivel técnico alcanzado en un proyecto con un equipo reducido y un calendario tan ajustado.

A continuación puedes observar un pequeño gameplay de los primeros niveles del juego:

Primeros minutos de gameplay en las Quest 3.