A tecnologia Nanite da UE5 no WebGPU
(github.com/Scthe)Nanite WebGPU
Resumo
- Nanite WebGPU é um projeto que implementa o Nanite em navegadores web usando WebGPU.
- Funciona apenas no Chrome.
- Inclui hierarquia de LOD de meshlets, rasterizador por software e impostores billboard.
- Suporta culling de frustum e de oclusão.
- Suporta texturas e normais de vértice.
- Funciona offline usando Deno.
Funcionalidades
-
Hierarquia de LOD de meshlets
- Faz o pré-processamento da malha no navegador usando WebAssembly.
- Também oferece recurso de exportação de arquivos.
-
Rasterizador por software
- O WebGPU não suporta
atomic<u64>. - Compacta profundidade (
u16) e normais codificadas em octaedro (2 * u8) em 32 bits.
- O WebGPU não suporta
-
Impostores billboard
- Exibe uma mistura de 12 imagens de acordo com a posição da câmera.
- Não trata as visões de cima e de baixo.
-
Culling
- Por instância: culling de frustum e de oclusão.
- Por meshlet: culling de frustum e de oclusão.
- Por triângulo: backface culling por hardware e z-buffer.
-
Permite alternar entre renderização baseada em GPU e implementação em CPU.
-
Suporta simultaneamente modelos com textura e vários objetos.
-
Permite alterar parâmetros em tempo de execução.
-
Fornece estatísticas: memória, geometria, quantidade de meshlets, quantidade de triângulos etc.
-
Suporta formato de arquivo personalizado.
-
Suporta quantização de posição de vértice e normais codificadas em octaedro.
-
Trata redimensionamento da janela.
-
Funciona offline usando Deno.
-
É possível copiar o código de WebGPU e WGSL para o projeto.
Objetivos
- Simplicidade: começar com arquivos OBJ e processar tudo dentro do aplicativo.
- Experimentação: permitir testar desempenho alterando várias configurações.
Cenas de demonstração
- Jinx: 120*120 instâncias, 640m triângulos.
- Lucy e dragão: 70*70 instâncias, 1.7b triângulos.
- Lucy: 110*110 instâncias, 1.2b triângulos.
- Dragão: 70*70 instâncias, 1.2b triângulos.
- Coelho: 500*500 instâncias, 1.2b triângulos.
- Prévia de impostor: aumento do tamanho da textura do impostor.
Como usar
- Mova-se com as teclas [W, S, A, D] e suba/desça com [Z, SPACEBAR].
- É possível corrigir bugs alternando as opções de culling.
- É possível medir o desempenho usando o botão Profile.
FAQ
-
Principais diferenças em relação ao Nanite da UE5
- A métrica de erro de simplificação é simples.
- A simplificação de meshlets é simples.
- Não há culling de oclusão em 2 etapas.
- Não há fila de trabalho nos shaders.
- Não há remoção nem streaming de LODs não usados da VRAM.
- Não há visibility buffer.
- Não há sombras/multiview integrados.
- Não consegue lidar com muitos objetos diferentes.
- Não há profiler de GPU.
-
O que significa ter bilhões de triângulos
- Malhas densas podem impactar negativamente o desempenho.
- Um grande número de instâncias consome muita VRAM.
- O arranjo da cena afeta o desempenho.
-
Pontos surpreendentes sobre o Nanite
- O objetivo do DAG não é usar poucos triângulos para objetos distantes.
- Gasta-se mais tempo com culling e trabalho de meshlets do que com o próprio Nanite.
- A hierarquia de LOD de meshlets funciona com facilidade.
- Se a malha não for simplificada de forma limpa, o desempenho cai.
-
Simplificação de malha
- Muitos problemas podem surgir no processo de simplificação.
- A UE5 usa seu próprio código de simplificação de malha.
-
Métrica de erro
- Escolher o meshlet apropriado é o ponto central do Nanite.
-
Vale a pena escrever sua própria implementação de Nanite?
- Usar a UE5 é o caminho mais simples.
- Para fins de aprendizado, vale a pena implementar por conta própria.
-
O valor do backface cone culling de meshlets
- É eficaz em malhas densas.
- Pode se sobrepor ao culling de oclusão.
- Chamadas ao WebAssembly podem causar queda de desempenho.
Resumo do GN⁺
- O Nanite WebGPU é um projeto interessante que implementa o Nanite em navegadores web.
- Ele otimiza o desempenho por meio de várias técnicas de culling e de um rasterizador por software.
- Em comparação com a UE5, há diferenças na simplificação e na métrica de erro.
- Para fins de aprendizado, implementar por conta própria pode valer a pena, mas em projetos reais usar a UE5 pode ser melhor.
- Um projeto com funcionalidade semelhante é o Nanite do Unreal Engine 5.
1 comentários
Comentários do Hacker News
A implementação de terceiros do Nanite é interessante
O Bevy também tem o Virtual Geometry, que implementa as ideias do Nanite
Não é bom que a demo use a string do user-agent para determinar compatibilidade
O WebGPU não funciona no iPhone 12 Pro Max
Foi necessário fazer concessões para contornar a falta de atômicos de 64 bits no WebGPU
O nome e a descrição são confusos e podem violar marca registrada
Comparação com sistemas de LOD de outros motores
Li uma discussão interessante no fórum do three.js sobre implementação de geometria virtual
Pergunta sobre a afirmação de que rasterizadores por software são mais rápidos que rasterizadores por hardware
Erro de WebGPU ao executar a demo jinx em um M2 Max