1 pontos por GN⁺ 2024-05-25 | 1 comentários | Compartilhar no WhatsApp
  • Daniel Schroeder está desenvolvendo um renderizador em tempo real que expande a sensação de superfícies pixeladas dos jogos 3D dos anos 90 com pequenos detalhes de superfície em voxels, usando como ativos de entrada malhas triangulares low-poly e texturas familiares
  • Em vez de transformar a cena inteira em uma grade de voxels, ele faz apenas a superfície parecer voxelizada com mapas de displacement, buscando um estilo visual voltado a ambientes estáticos no estilo Doom, Quake e Duke Nukem
  • A CPU converte malhas triangulares e informações limitadas de displacement em dados de geometria para a GPU e pré-processa texturas, enquanto a renderização de cada frame é tratada quase de forma independente pela GPU
  • A demo mostra frame times de 4 a 9 ms em 1440p numa Radeon RX 5700 XT e, em 800p no Steam Deck OLED, alcança mais de 60 FPS e 90 FPS travados em muitos trechos
  • Como o ambiente ainda pode ser tratado como malha triangular, colisão, controlador de personagem e pathfinding podem ser resolvidos com bibliotecas de física existentes e processamento baseado em malha, e só alguns sistemas específicos precisam levar em conta a geometria detalhada em voxels

Expandindo a estética 3D dos anos 90 com superfícies em voxels

  • O objetivo é manter a geometria simples dos ambientes e os contornos nítidos das texturas dos jogos 3D clássicos dos anos 90, enquanto adiciona detalhes 3D em blocos às superfícies
  • Jogos 3D do início ao meio dos anos 90, como Doom, Quake e Duke Nukem, tiveram grande influência tanto na tecnologia quanto no gameplay, e recentemente as próprias limitações visuais da época passaram a ser vistas como um charme retrô
  • O ponto de partida é a pergunta: “e se os detalhes de superfície fossem feitos com voxels em vez de pixels?”
    • Por exemplo, uma parede de pedras pode manter a aparência pixelada mesmo de perto, mas ainda ter profundidade geométrica
  • O resultado foi pensado para ficar entre o visual dos jogos dos anos 90 e uma apresentação mais moderna

Limitações das abordagens tradicionais com voxels

  • Uma malha voxel típica é uma grade tridimensional que indica se cada célula cúbica está preenchida ou vazia
    • É possível aplicar texturas em voxels grandes, como em Minecraft
    • Também dá para usar voxels pequenos e monocromáticos, como em Teardown
  • Para criar um ambiente baseado em voxels, é preciso posicionar toda a geometria numa grade compartilhada ou distribuir várias malhas voxel independentes no mesmo espaço
  • Existem ferramentas para produzir geometria voxel diretamente, mas o processo costuma ser demorado e muitas vezes limitado à criação de malhas pequenas
  • Dá para criar blocos de construção, como paredes ou pisos modulares, e montar estruturas grandes com eles, mas isso funciona bem para edifícios alinhados à grade e menos bem para terrenos livres
  • Geração procedural pode ser útil para ambientes naturais e combinações de blocos, mas traz suas próprias dificuldades e só se encaixa em certos tipos de jogo
  • Também é possível rasterizar malhas triangulares existentes para uma grade voxel, mas a geometria resultante fica presa a uma única grade de voxels, o que pode gerar um resultado estético indesejado
    • Superfícies alinhadas aos eixos podem parecer placas planas de voxels
    • Superfícies a 45 graus podem ficar com aparência de escada
  • Quando a representação formal da cena passa a ser voxel, não só a renderização, mas também a física, o controlador de personagem e o pathfinding de NPCs podem precisar operar no nível dos voxels
  • Em compensação, há a vantagem de ser fácil adicionar ou remover geometria em malhas voxel, como em Minecraft e Teardown

Limites das abordagens tradicionais com displacement

  • O displacement mapping usa um mapa de displacement junto com a textura para definir quanto cada pixel da textura deve se mover para dentro ou para fora da superfície da malha
  • Softwares de modelagem 3D podem subdividir a malha e deslocar os novos vértices para transformar o displacement em geometria real
    • Isso também afeta a silhueta do objeto
    • O número de polígonos da malha resultante aumenta muito
    • Malhas de entrada com arestas ou cantos duros precisam ser ajustadas para gerar bons resultados
  • Em gráficos em tempo real, efeitos de sombreamento de superfície como parallax occlusion mapping podem fazer algo parecer geometria detalhada sem alterar a forma real
    • Isso pode funcionar bem em pisos e paredes grandes
    • Nas bordas dos objetos, a geometria continua plana e a ilusão se quebra
  • shell mapping é uma abordagem intermediária que permite ver displacement na silhueta do objeto sem exigir uma malha altamente subdividida
    • É difícil de lidar em regiões da malha de entrada com alta curvatura
    • Também não é simples adaptar malhas com arestas ou cantos duros a essa técnica

Como funciona: combinando voxels e displacement mapping

  • Esse renderizador constrói ambientes no estilo dos jogos 3D clássicos com malhas triangulares low-poly, define detalhes de superfície em escala voxel com mapas de displacement e depois renderiza tudo para parecer montado com voxels reais
  • Como o foco são ambientes com muitas arestas agudas, como cantos de edifícios, é preciso obter um resultado voxelizado mesmo em áreas que o displacement mapping tradicional trata mal
  • A implementação atual é um projeto standalone em C++ / Vulkan
  • A infraestrutura executa três tarefas principais
    • Recebe malhas triangulares e informações limitadas do mapa de displacement e as converte em dados de geometria que a GPU usa para desenhar a malha deformada
      • Esse processo roda na CPU antes da renderização de cada frame
      • Em um jogo lançado, o resultado pode ser baked em disco
      • A conversão de todo o ambiente da demo no vídeo leva 0,5 segundo em uma única thread
    • Pré-processa texturas para gerar informações necessárias na renderização, como normal maps
      • O trabalho em si é básico, mas lento, então faz sentido fazer bake
    • Usa o estado gerado de malhas e texturas para desenhar na GPU a geometria de displacement com voxels
      • Quase não há participação da CPU por frame
  • O desempenho já está em nível utilizável na prática
    • Na Radeon RX 5700 XT, a sequência de demonstração é renderizada com frame times de 4 a 9 ms em 1440p
    • Isso corresponde a 250 a 110 FPS
    • Na resolução nativa de 800p do Steam Deck OLED, mantém mais de 60 FPS, com muitos trechos travados em 90 FPS

Como os ativos de arte são produzidos

  • A produção de conteúdo exige dois tipos de ativos: texturas e malhas
  • Cada textura é criada com um albedo map e um displacement map
    • Fazer o albedo imitar a paleta limitada dos jogos retrô ajuda a tornar o estilo visual mais convincente
    • O displacement map fornece valores finos de altura, e o renderizador pode ajustar a escala para mudar a intensidade
    • Depois do ajuste de escala, a unidade de altura indica quantos voxels a superfície deve se mover para dentro ou para fora
  • O renderizador desloca apenas em unidades inteiras de voxel mais próximas, mas os valores exatos de altura são usados no cálculo de normal maps
    • Recursos menores que um voxel ainda podem influenciar a iluminação
  • As malhas são malhas triangulares low-poly comuns com mapeamento de textura e normais de sombreamento
    • As normais indicam quais partes são superfícies suavemente curvas e quais arestas são arestas agudas
    • O renderizador faz trabalho extra para obter bons resultados nas arestas agudas
  • Para o estilo visual, tenta-se manter o tamanho dos voxels consistente no mapeamento de textura, mas isso não é uma exigência absoluta
  • Há restrições na estrutura das malhas e no mapeamento de textura
    • Algumas podem ser removidas no futuro
    • Outras não podem ser evitadas por causa da forma como o renderizador funciona
  • Como os ativos são malhas triangulares, e não uma representação voxel dedicada, eles podem ser criados com várias ferramentas
    • O ambiente da demo foi modelado no Blender
    • Atualmente, o formato exportado do Blender para a demo é arquivo OBJ

Vantagens e escopo de aplicação no desenvolvimento de jogos

  • Essa abordagem permite criar conteúdo com workflows familiares, em vez de depender de ferramentas especiais de edição voxel
  • Produzir boas texturas pode ser difícil, mas, depois de feitas, elas são fáceis de reaproveitar em várias geometrias
    • Boa parte da geometria da demo em vídeo usa uma única textura de bloco de pedra em três cores
  • Como os ambientes são criados como malhas triangulares e os elementos voxelizados são decoração de superfície, é possível tratar o ambiente como geometria poligonal quando for mais conveniente
  • A aplicação de demonstração suporta movimentação em primeira pessoa, colisão, subida de escadas e colisão com paredes
    • Não foi necessário escrever um motor de física nem um controlador de personagem próprios
    • Ela integra o Jolt Physics, que é open source
    • Usa a malha triangular original como geometria de colisão
  • Movimento de inimigos e pathfinding também podem ser resolvidos com base nessa mesma malha
  • Apenas alguns sistemas de gameplay precisam ter consciência dos voxels
    • Por exemplo, em um FPS, é possível implementar uma função de raycast compatível com displacement para que os projéteis sigam a forma exata da geometria deslocada
  • Muitos jogos baseados em voxels acabam exigindo sistemas de jogo personalizados e, por isso, usam engine própria, mas nessa abordagem a maior parte da lógica além da renderização não precisa conhecer os detalhes em escala voxel
  • O caminho mais realista parece ser integrar essa técnica de renderização a engines existentes

Desafios restantes e próximos passos

  • A implementação atual funciona bem para construir a geometria do nível, mas ambientes de jogo também precisam de elementos dinâmicos, como objetos pequenos, decoração e inimigos
  • No futuro, o plano é adicionar formas de integrar pequenos objetos ou objetos animados a esse estilo artístico
  • A iluminação da demo já parece boa, mas a implementação atual tem limitações
    • Suporta apenas um número pequeno de luzes
    • Não há sombras, ambient occlusion nem recursos mais avançados
  • Esse renderizador foi pensado para ambientes majoritariamente estáticos, como ocorre na maioria dos jogos, e não para geometria extremamente dinâmica típica de jogos voxel mais tradicionais
    • Dependendo das necessidades da aplicação, ainda há espaço para diferentes soluções de iluminação, incluindo abordagens com bake
  • Atualmente não há anti-aliasing, algo especialmente perceptível em pisos distantes
  • Os planos futuros do projeto e a discussão voltada a desenvolvedores e estúdios continuam em um segundo texto

1 comentários

 
GN⁺ 2024-05-25
Opiniões no Hacker News
  • Talvez por eu ter idade suficiente para lembrar da época em que baixava jogos com um modem de 2400 baud, essa estética me parece realmente atraente
    O vídeo também ficou excelente e, pessoalmente, evocou uma atmosfera muito forte
    Nos trechos em que o teto era baixo demais, cheguei a sentir claustrofobia e sufocamento; as cavernas com rochas e chão de areia, e as cavernas com pedras, eram realmente bonitas, a ponto de me fazer querer jogar um Myst ou um adventure no estilo LucasArts feito com esse renderizador
    Parece combinar bem com temas como exploração de cavernas ou escavações arqueológicas

    • Concordo. Pessoalmente, isso me remete mais a uma vibe de pixel art/retrô do que à sensação low-poly de Doom/Wolfenstein
    • Isso me faz imaginar um Noita 3D feito com essa estética
      Para expandir uma engine de areia caindo para 3D, talvez também desse para usar algo como dinâmica de fluidos com partículas suaves
    • Concordo totalmente quanto à estética, mas, em comparação com o visual incrível, a estrutura arquitetônica parece estranha
      Nas partes de teto baixo, os blocos pendurados no teto pareciam desafiar as leis da física
  • https://web.archive.org/web/20240524065427/https://blog.dani...
    https://www.youtube.com/watch?v=1xFEbXWstCM

  • Uma abordagem diferente é o Deep Bump. Ele lida com o mesmo problema de uma forma completamente diferente
    O Deep Bump é uma ferramenta de aprendizado de máquina que gera mapas de normais plausíveis a partir de imagens de textura
    Ele funciona especialmente bem com texturas de pedra ou tijolo como as usadas por esse renderizador de deslocamento por voxels; em texturas de tecido, também reconhece até certo ponto dobras, bolsos e golas, gerando normais que expressam profundidade
    Funciona razoavelmente em cascas de árvore e mal em plantas, provavelmente por influência do conjunto de dados de treinamento
    Se a ideia for modernizar jogos da linhagem Doom/Wolfenstein, já existe uma ferramenta open source utilizável
    [1] https://github.com/HugoTini/DeepBump

    • Se você leu o post do blog direito, isso é um modelo que infere mapas de normais a partir de texturas, não uma nova forma de renderizar geometria
      Este texto está mais próximo de tratar mapas de deslocamento como uma pequena representação baseada em voxels, e ferramentas como o Deep Bump poderiam talvez ser usadas de forma auxiliar para criar assets de textura para o sistema descrito aqui
    • Como o texto também diz, mapas de normais não “funcionam” em todas as situações
      Como eles não alteram a geometria real, apenas a ilusão de iluminação e relevo, quando vistos nas bordas da malha o deslocamento continua sendo a opção de maior qualidade
      Ainda assim, talvez o DeepBump possa ser usado para extrair mapas de altura unidimensionais para deslocamento tradicional, ou seja, mapas que têm apenas altura, não deslocamento vetorial 3D completo
  • É bacana, mas fico curioso para saber quão bem essa abordagem se encaixaria em modelos 3D animados
    Mesmo no melhor caso, acho que ficaria parecido com o 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...

    • O texto até tem uma nota de rodapé sobre Voxel Doom, mas é sobre a abordagem de ambientes do Voxel Doom, não tanto sobre os monstros
      “Agora que expliquei todo esse contexto, quero elogiar o mod Voxel Doom para o Doom clássico. O criador do mod substituiu os monstros e outros sprites do jogo por malhas de voxels para adicionar profundidade, e foi um trabalho realmente impressionante. Depois, no fim de 2022, ele começou a experimentar mapeamento de paralaxe para adicionar detalhes em voxels à geometria dos níveis. Na minha opinião, essa parte não ficou muito boa, não por causa da arte do criador, mas por limitações fundamentais que surgem ao renderizar com mapeamento de paralaxe. Esse mod não foi a inspiração para o meu projeto. Eu já estava trabalhando nele. Mas ver a boa recepção do mod online me deu muita motivação para continuar meu trabalho. ↩”
      A abordagem em si aparentemente também suporta coisas como portas animadas, então, combinando malhas e flipbooks de textura, talvez dê para usá-la também em monstros com aparência parecida com a do Doom original
      Ainda assim, áreas de curvatura acentuada parecem ser onde o shell mapping teria os artefatos mais fortes, e o texto também menciona limitações da geração de malhas de nível, então talvez não seja o caso
  • Parece bastante parecido com o que o Notch está fazendo. Pelo feed dele no Twitter, ele está trabalhando em outro tipo de renderização por voxels
    Só que isto usa C++/Vulkan e parece realmente muito bonito

  • Fico curioso para saber como essa abordagem se compara ao Unreal Engine 5 Nanite. Talvez a Unreal Engine também faça algo parecido
    Pelo que lembro, uma das motivações para usar voxels em jogos antigos, por exemplo em Comanche[1], era conseguir terrenos complexos de forma convincente, que seriam mais caros de modelar como malhas de triângulos em hardware semelhante
    O autor menciona 110 FPS em uma RX 5700 XT, mas não sei muito bem que nível isso representa em comparação com outras abordagens
    [1] https://en.wikipedia.org/wiki/Comanche_(video_game_series)

    • Como o texto original não descreve em detalhes a malha usada em tempo de execução, é difícil afirmar com certeza, mas eu chutaria que é bem diferente do Nanite
      O Nanite parte do pressuposto de objetos com muitos polígonos e faz streaming de chunks simplificados para que os triângulos renderizados não fiquem menores que os pixels
      Como é possível tornar a geometria naturalmente muito detalhada, mapas de deslocamento ficam um tanto redundantes, e não há motivo especial para tratar isso como um mapa de textura
      Claro, terrenos são um caso separado, mas é um caso especial
      O método deste texto parece gerar, no carregamento, uma geometria altamente poligonal, porém “voxelizada”, usando deslocamento e uma malha low-poly
  • Pelo que me lembro, Comanche usava uma abordagem de traçado de raios para renderizar o terreno[1]
    Não eram voxels de verdade, e sim um mapa de altura 2D amostrado
    Como chamaram isso de “VoxelSpace”, é compreensível a confusão
    [1] https://github.com/s-macke/VoxelSpace

    • Meu palpite é que é exatamente a mesma técnica usada no jogo Comanche, ou pelo menos uma forma capaz de produzir o mesmo resultado
      Ao contrário da crença comum, aqueles jogos não usavam voxels 3D de verdade; eles desenhavam, por ray marching, um mapa de altura que armazenava valores de cor e altura na textura do terreno
      Se você fizer ray marching em direção à textura no shader, consegue reproduzir a mesma aparência, e acho que ficaria muito parecido com o resultado obtido no post do blog
    • Na prática, quase não tem relação. Aqui, parece que eles geram detalhes de malha voxel com um geometry shader, e provavelmente também fazem algumas otimizações em etapas mais detalhadas
      Já o Nanite é uma tecnologia de renderização conduzida pela GPU que ajusta a densidade de triângulos de acordo com a qualidade-alvo
      O Nanite também pode usar mapas de deslocamento e tesselação, mas usa um caminho separado que não é necessariamente mais eficiente do que simplesmente inserir e renderizar assets com muitos polígonos
  • É sempre bom ver novos métodos na área de voxels
    Mas é um pouco pena que o texto misture voxels e uma técnica específica de renderização
    Voxel é simplesmente o uso de uma grade 3D, e, vendo a parte do meio, o autor parece equiparar o uso de voxels à renderização em cubos, frequentemente chamada de renderizador blockxel no estilo Minecraft
    Ele também diz que é possível trazer geometria triangular e usá-la diretamente no engine, mas parece esquecer que blockxels, ou praticamente qualquer processo de renderização, também conseguem fazer a mesma coisa
    É justamente assim que plugins comuns de renderização voxel que usam outros estilos recebem suporte de primeira classe em engines existentes

  • Eu queria que isso fosse open source. Queria muito mesmo

  • Gostei muito. Me lembrou Ultima Underworld

  • Isso deveria ser o futuro da modernização dos jogos 3D retrô. É realmente lindo