1 puntos por GN⁺ 2024-05-25 | 1 comentarios | Compartir por WhatsApp
  • 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
  • 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

 
GN⁺ 2024-05-25
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

    • Coincido. Personalmente, más que una sensación low-poly tipo Doom/Wolfenstein, me evocó más una vibra de pixel art/retro
    • Me hizo imaginar un Noita 3D hecho con esta estética
      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
    • Estoy totalmente de acuerdo con la estética, pero en comparación con lo genial que se ve, la estructura arquitectónica se siente rara
      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

    • Si leíste bien el artículo del blog, eso es un modelo que infiere mapas de normales a partir de texturas, no una forma nueva de renderizar geometría
      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 también dice el artículo, los mapas de normales no “funcionan” en todas las situaciones
      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...

    • El artículo sí tiene una nota al pie sobre Voxel Doom, pero trata más sobre el enfoque ambiental de Voxel Doom que sobre los monstruos
      “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)

    • Es difícil afirmarlo con certeza porque el texto original no explica en detalle la malla que usa en tiempo de ejecución, pero supongo que es bastante distinto de Nanite
      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

    • Supongo que es exactamente la misma técnica usada en los juegos Comanche, o al menos una capaz de producir el mismo resultado
      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 realidad, casi no tiene relación. Aquí se generan detalles de malla de vóxeles con un geometry shader, y probablemente también se hagan algunas optimizaciones de pasos detallados
      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