Renderizador de desplazamiento por vóxeles: modernizando la estética retro 3D
(blog.danielschroeder.me)- Daniel Schroeder está desarrollando un renderizador en tiempo real que extiende la sensación de superficies pixeladas de los juegos 3D de los 90 con pequeños detalles de superficie en vóxeles, usando como assets de entrada las conocidas mallas triangulares low-poly y texturas
- En lugar de convertir toda la escena en una rejilla de vóxeles, hace que solo la superficie parezca voxelizada mediante mapas de desplazamiento, apuntando a un estilo visual adecuado para entornos estáticos al estilo de Doom, Quake y Duke Nukem
- La CPU convierte la malla triangular y la información limitada de desplazamiento en datos geométricos para la GPU y preprocesa las texturas, mientras que el renderizado de cada cuadro se resuelve casi por completo de forma independiente en la GPU
- La demo muestra tiempos por cuadro de 4 a 9 ms a 1440p en una Radeon RX 5700 XT, y en la Steam Deck OLED a 800p supera los 60 FPS y en muchas secciones alcanza 90 FPS estables
- Como el entorno puede seguir tratándose como una malla triangular, las colisiones, el controlador del personaje y la búsqueda de rutas se resuelven con bibliotecas de física y procesamiento basados en mallas existentes, y solo algunos sistemas concretos necesitan tener en cuenta la geometría voxelizada de detalle
Expandir la estética 3D de los 90 con superficies voxelizadas
- El objetivo es conservar la geometría ambiental simple y los bordes nítidos de las texturas de los juegos 3D clásicos de los 90, mientras se agregan detalles 3D de tipo bloque sobre la superficie
- Juegos 3D de inicios y mediados de los 90 como Doom, Quake y Duke Nukem influyeron muchísimo tanto en la tecnología como en el gameplay, y hoy las limitaciones visuales de esa época se perciben como parte de su encanto retro
- El punto de partida fue la pregunta: “¿qué pasaría si en vez de píxeles usáramos vóxeles para crear detalle de superficie?”
- Por ejemplo, una pared de adoquines puede mantener una sensación pixelada incluso de cerca y al mismo tiempo tener profundidad geométrica
- El resultado está diseñado para ubicarse entre la apariencia de los juegos de los 90 y una representación más moderna
Limitaciones de los enfoques voxel tradicionales
- Una malla de vóxeles típica es una rejilla tridimensional que indica si cada celda cúbica está ocupada o vacía
- Puede usar vóxeles grandes con texturas, como en Minecraft
- O vóxeles pequeños y monocromáticos, como en Teardown
- Para crear un entorno basado en vóxeles, hay que colocar toda la geometría en una rejilla compartida, o ubicar varias mallas voxel independientes en el mismo espacio
- Existen herramientas para crear geometría voxel directamente, pero el proceso de producción suele ser lento y muchas veces está limitado a mallas pequeñas
- Se pueden crear bloques de construcción como paredes o pisos modulares para ensamblar estructuras grandes, pero eso funciona mejor en edificios alineados a rejilla que en terrenos libres
- La generación procedural es útil para entornos naturales y para combinar bloques de construcción, pero trae sus propias dificultades y solo encaja bien en ciertos tipos de juegos
- También se puede rasterizar una malla triangular existente hacia una rejilla de vóxeles, pero el resultado queda dentro de una sola cuadrícula voxel y puede producir una estética no deseada
- Las caras alineadas a los ejes pueden verse como placas planas de vóxeles
- Las superficies a 45 grados pueden verse escalonadas
- Si la representación formal de la escena pasa a ser voxel, entonces no solo el renderizado sino también la física, el controlador del personaje y la navegación de NPC podrían tener que operar a nivel de vóxel
- A cambio, ofrece la ventaja de que es fácil agregar o quitar geometría de una malla voxel, como en Minecraft o Teardown
Límites de los enfoques convencionales de desplazamiento
- El displacement mapping usa un mapa de desplazamiento junto con la textura para definir cuánto debe moverse hacia adentro o hacia afuera de la superficie de la malla cada píxel de la textura
- El software de modelado 3D puede subdividir la malla y luego mover nuevos vértices para convertir el desplazamiento en geometría real
- Esto también afecta la silueta del objeto
- El número de polígonos de la malla resultante aumenta de forma considerable
- Las mallas de entrada con bordes o esquinas duras requieren ajustes para obtener buenos resultados
- En gráficos en tiempo real, efectos de sombreado de superficie como parallax occlusion mapping pueden hacer que parezca que hay geometría detallada sin cambiar la forma real
- Puede verse bien en pisos y paredes grandes
- Pero en los bordes del objeto la geometría sigue siendo plana y la ilusión se rompe
- El shell mapping es un enfoque intermedio que permite ver el desplazamiento en la silueta del objeto sin una malla altamente subdividida
- Es difícil de manejar en zonas donde la malla de entrada tiene mucha curvatura
- Tampoco es fácil adaptar a esta técnica mallas con bordes o esquinas duras
Cómo funciona: combinación de vóxeles y displacement mapping
- Este renderizador crea entornos al estilo de los juegos 3D clásicos usando mallas triangulares low-poly, define detalle de superficie a escala voxel con mapas de desplazamiento y luego renderiza el resultado como si estuviera ensamblado con vóxeles reales
- Como apunta a entornos con muchos bordes afilados, como las esquinas de edificios, necesita resultados tipo voxel incluso en áreas donde el displacement mapping tradicional suele fallar
- La implementación actual es un proyecto independiente en C++ / Vulkan
- La infraestructura realiza tres tareas principales
- Toma la malla triangular y la información limitada del mapa de desplazamiento, y la convierte en datos geométricos que la GPU usará para dibujar la malla deformada
- Este proceso corre en la CPU antes del renderizado de cada cuadro
- En un juego publicado, el resultado podría hornearse en disco
- La conversión de todo el entorno de la demo en el video tarda 0.5 segundos en un solo hilo
- Preprocesa las texturas para generar información necesaria durante el renderizado, como mapas normales
- El trabajo en sí es básico, pero lento, así que conviene hornearlo
- Usa la malla generada y el estado de las texturas para dibujar en la GPU la geometría de desplazamiento voxel
- La participación de la CPU por cuadro es casi nula
- Toma la malla triangular y la información limitada del mapa de desplazamiento, y la convierte en datos geométricos que la GPU usará para dibujar la malla deformada
- El rendimiento ya está en un nivel utilizable en la práctica
- En una Radeon RX 5700 XT, la secuencia de demo se renderiza con tiempos por cuadro de 4 a 9 ms a 1440p
- Eso equivale a entre 250 y 110 FPS
- En la resolución nativa de 800p de la Steam Deck OLED, mantiene más de 60 FPS y en muchas secciones queda fijo en 90 FPS
Cómo se crean los assets artísticos
- La producción de contenido requiere dos tipos de assets: texturas y mallas
- Cada textura se compone de un albedo map y un displacement map
- Imitar la paleta limitada de los juegos retro en el albedo ayuda a que el estilo visual resulte convincente
- El displacement map aporta valores finos de altura, y el renderizador puede ajustar la escala para cambiar la intensidad
- Después de ajustar la escala, la unidad de altura indica cuántos vóxeles debe desplazarse la superficie hacia adentro o hacia afuera
- El renderizador solo desplaza en unidades enteras del vóxel más cercano, pero usa el valor exacto de altura para calcular el mapa normal
- Rasgos más pequeños que un vóxel aún pueden afectar la iluminación
- La malla es una malla triangular común low-poly con mapeo de texturas y normales de sombreado
- Las normales indican qué partes son superficies suavemente curvadas y qué bordes son aristas duras
- El renderizador realiza trabajo adicional para obtener buenos resultados en aristas afiladas
- Para mantener el estilo visual, se intenta conservar un tamaño de vóxel constante al mapear texturas, aunque no es un requisito obligatorio
- Hay restricciones tanto en la estructura de la malla como en el mapeo de texturas
- Algunas podrían eliminarse en el futuro
- Otras no pueden evitarse por la forma en que funciona el renderizador
- Como los assets son mallas triangulares y no una representación voxel dedicada, pueden crearse con muchas herramientas
- El entorno de la demo fue modelado en Blender
- Actualmente, el formato de exportación desde Blender hacia la demo es un archivo OBJ
Ventajas y alcance para el desarrollo de juegos
- Este enfoque permite crear contenido con flujos de trabajo conocidos en lugar de depender de herramientas especiales de edición voxel
- Crear buenas texturas puede ser difícil, pero una vez hechas es fácil reutilizarlas en distintas geometrías
- Buena parte de la geometría de la demo en video usa una sola textura de bloque de piedra en tres colores
- Como el entorno se crea como una malla triangular y las características voxel son decoración de superficie, cuando conviene se puede tratar el entorno como geometría poligonal
- La aplicación de demo soporta movimiento en primera persona, colisiones, subir escaleras y choque contra paredes
- No escribe su propio motor de física ni su propio controlador de personaje
- Integra Jolt Physics, que es open source
- Usa la malla triangular original como geometría de colisión
- El movimiento de enemigos y la búsqueda de rutas también pueden resolverse sobre la base de esa misma malla
- Solo algunos sistemas de gameplay necesitan ser conscientes de los vóxeles
- Por ejemplo, en un shooter en primera persona se podría implementar una función de raycast consciente del desplazamiento para que las balas sigan la forma exacta de la geometría desplazada
- Muchos juegos basados en vóxeles terminan usando motores propios porque requieren personalizar varios sistemas del juego, pero este enfoque permite que casi toda la lógica fuera del renderizado no necesite saber nada del detalle a escala voxel
- La vía más realista parece ser integrar esta técnica de renderizado en un motor existente
Retos pendientes y próximos pasos
- La implementación actual encaja bien para crear la geometría del nivel, pero un entorno de juego también necesita elementos dinámicos como objetos pequeños, decoraciones y enemigos
- A futuro, planea agregar formas de integrar objetos pequeños u objetos animados dentro de este estilo artístico
- La iluminación de la demo ya se ve bien, pero la implementación actual tiene limitaciones
- Solo soporta una cantidad pequeña de luces
- No tiene sombras, ambient occlusion ni funciones más avanzadas
- Este renderizador apunta a los entornos mayormente estáticos que tienen la mayoría de los juegos, más que a geometría extremadamente dinámica como en los juegos voxel tradicionales
- Según las necesidades de cada aplicación, todavía hay margen para distintas soluciones de iluminación, incluyendo enfoques horneados
- Actualmente no hay antialiasing, y se nota especialmente en pisos lejanos
- Los planes futuros del proyecto y la discusión para desarrolladores y estudios continúan en el segundo artículo
1 comentarios
Opiniones de Hacker News
Quizás porque ya tengo edad suficiente para recordar la época en que descargaba juegos con un módem de 2400 baudios, esta estética me resulta realmente atractiva
El video también estaba excelente y, en lo personal, me evocó una atmósfera muy fuerte
En las zonas donde el techo era demasiado bajo sentí incluso claustrofobia y opresión, y las cuevas con roca y suelo de arena, o las cuevas con rocas, se veían tan hermosas que me dieron ganas de jugar una aventura al estilo Myst o LucasArts hecha con este renderizador
Parece encajar bien con temas como la exploración de cuevas o las excavaciones arqueológicas
Para extender un motor de arena que cae a 3D, quizás también se podría usar algún enfoque tipo dinámica de fluidos de partículas suaves
En las partes con techo bajo, los bloques colgando del techo parecían desafiar las leyes de la física
https://web.archive.org/web/20240524065427/https://blog.dani...
https://www.youtube.com/watch?v=1xFEbXWstCM
Otro enfoque es Deep Bump. Aborda el mismo problema de una forma completamente distinta
Deep Bump es una herramienta de machine learning que genera mapas de normales verosímiles a partir de imágenes de textura
Funciona especialmente bien con texturas de piedra o ladrillo como las que usa este renderizador de desplazamiento vóxel, y con texturas de tela también reconoce hasta cierto punto arrugas, bolsillos y cuellos para generar normales que expresan profundidad
Con corteza de árbol funciona más o menos y con plantas no muy bien, probablemente por influencia del dataset de entrenamiento
Si se quisiera modernizar juegos de la línea Doom/Wolfenstein, ya existe una herramienta open source útil
[1] https://github.com/HugoTini/DeepBump
Este artículo está más cerca de tratar mapas de desplazamiento como una pequeña representación basada en vóxeles, y herramientas como Deep Bump podrían servir como apoyo para crear assets de textura para el sistema del que se habla aquí
Como no cambian la geometría real sino solo la iluminación y la ilusión de volumen, al mirar los bordes de la malla el desplazamiento sigue siendo una opción de mayor calidad
Aun así, quizá DeepBump pueda usarse para extraer mapas de altura unidimensionales para desplazamiento tradicional, es decir, mapas que solo tienen altura y no desplazamiento vectorial 3D completo
Se ve genial, pero me pregunto qué tan bien encajaría este enfoque con modelos 3D animados
En el mejor de los casos, creo que terminaría viéndose como el mod “Voxel Doom” de Doom
[1] https://media.moddb.com/cache/images/mods/1/55/54112/thumb_6...
[2] https://media.moddb.com/cache/images/mods/1/55/54112/thumb_6...
“Ahora que ya expliqué todo este contexto, quiero elogiar el mod Voxel Doom para el Doom clásico. El creador del mod reemplazó los monstruos y otros sprites del juego por mallas vóxel para agregar profundidad, y fue un trabajo realmente impresionante. Luego, a fines de 2022, empezó a experimentar con mapeo de paralaje para agregar detalle vóxel a la geometría de los niveles. En mi opinión, esa parte no se veía tan bien, no por el arte del creador, sino por las limitaciones fundamentales que aparecen al renderizar con mapeo de paralaje. Ese mod no fue la inspiración de mi proyecto. Yo ya estaba trabajando en esto. Pero ver que ese mod recibía buena respuesta en línea me dio mucho impulso para seguir con mi trabajo. ↩”
Como el enfoque en sí dice soportar cosas como puertas animadas, combinando mallas y flipbooks de texturas parece que también podría usarse para monstruos que se vean como los del Doom original
Aunque las zonas de curvatura pronunciada probablemente sean donde el shell mapping produce más artefactos, y como también se mencionan límites del mallado de niveles, quizá no sea así
Se ve bastante parecido a lo que está trabajando Notch. Si miras su feed de Twitter, está haciendo otro tipo de renderizado de vóxeles
Aunque esto usa C++/Vulkan y se ve realmente fantástico
Me pregunto cómo se compara este enfoque con Unreal Engine 5 Nanite. Quizá Unreal Engine también esté haciendo algo similar
Recuerdo que una de las motivaciones para usar vóxeles en juegos antiguos, por ejemplo Comanche[1], era obtener terrenos complejos convincentes que habrían sido más costosos de modelar con mallas de triángulos en hardware similar
El autor menciona 110 FPS en una RX 5700 XT, pero no sé muy bien qué nivel representa eso frente a otros enfoques
[1] https://en.wikipedia.org/wiki/Comanche_(video_game_series)
Nanite presupone la creación de objetos de muchos polígonos y hace streaming de chunks simplificados para que los triángulos renderizados no sean más pequeños que un píxel
Como permite crear geometría muy detallada de forma natural, los mapas de desplazamiento resultan algo redundantes y no hay motivo especial para tratarlos como mapas de textura
Por supuesto, en terrenos hay casos aparte, pero son casos especiales
El método de este artículo parece generar al cargar una geometría de muchos polígonos pero “voxelizada”, usando desplazamiento y una malla de pocos polígonos
Según recuerdo, Comanche usaba un enfoque de trazado de rayos para renderizar el terreno[1]
No eran vóxeles reales, sino un mapa de alturas 2D muestreado
Lo llamaron “VoxelSpace”, así que es comprensible la confusión
[1] https://github.com/s-macke/VoxelSpace
A diferencia de lo que muchos creen, esos juegos no usaban vóxeles 3D reales; dibujaban mediante ray marching un mapa de alturas que almacenaba valores de color y altura en la textura del terreno
Si haces ray marching hacia una textura en un shader, puedes reproducir el mismo aspecto, y creo que se vería muy parecido a los resultados obtenidos en el artículo del blog
En cambio, Nanite es una tecnología de renderizado impulsada por GPU que ajusta la densidad de triángulos según la calidad objetivo
Nanite también puede usar displacement maps y teselación, pero emplea una ruta separada que no necesariamente es más eficiente que cargar y renderizar directamente assets de alto número de polígonos
Siempre es bueno ver métodos nuevos en el campo de los vóxeles
Dicho eso, es un poco decepcionante que el texto mezcle vóxeles y una técnica de renderizado específica
Un vóxel simplemente usa una cuadrícula 3D, y por la parte intermedia parece que el autor equipara el uso de vóxeles con el renderizado en cubos, lo que suele llamarse un renderizador de bloques estilo Minecraft
También dice que se puede tomar geometría triangular y usarla directamente en el motor, pero parece olvidar que un renderizador de bloques, o básicamente cualquier proceso de renderizado, puede hacer lo mismo
Así es precisamente como los plugins habituales de renderizado de vóxeles que usan otros estilos reciben soporte de primera clase en motores existentes
Ojalá esto fuera open source. De verdad que sí
Me encanta. Me recuerda a Ultima Underworld
Esto debería ser el futuro de la modernización de los juegos retro 3D. Es realmente hermoso