O Nanite é o sistema de geometria virtualizada do Unreal Engine, que usa um novo formato de malha interna e tecnologia de renderização para renderizar detalhes em escala de pixels e altas contagens de objetos. Funciona de forma inteligente apenas nos detalhes que podem ser percebidos e nada mais. O formato de dados Nanite também é altamente compactado e é compatível com transmissão refinada com nível automático de detalhes.
Benefícios do Nanite
Várias ordens de magnitude sofrem aumento na complexidade da geometria, maior contagem de triângulos e objetos do que era possível antes em tempo real.
Os orçamentos de quadro não são mais limitados por contagens de polígonos, draw calls e uso de memória de malha.
Agora é possível importar diretamente artes de origem com qualidade de filme, como modelos ZBrush e digitalizações de fotogrametria.
Use detalhamento de alta contagem de polígonos em vez de incorporar detalhes em texturas de mapa normais.
O Nível de detalhe (LOD) é tratado automaticamente e não requer mais configuração manual para LODs de malha individual.
A perda de qualidade é rara ou inexistente, especialmente com transições de LOD.
Embora as vantagens possam ser um divisor de águas, existem limites práticos que ainda permanecem. Por exemplo, contagens de instâncias, triângulos por malha, complexidade do material, resolução de saída e desempenho devem ser medidos cuidadosamente para qualquer combinação de conteúdo e hardware. A Nanite continuará expandindo seus recursos e melhorando o desempenho em versões futuras do Unreal Engine.
Diferenças entre uma malha Nanite e uma malha estática.
Uma malha Nanite é uma malha estática com a Nanite habilitada. Uma malha Nanite ainda é essencialmente uma malha triangular em seu núcleo com muito nível de detalhe e compactação aplicada aos dados. Além disso, a Nanite usa um sistema totalmente novo para renderizar esse formato de dados de maneira extremamente eficiente.
Tudo o que é necessário para que uma malha estática aproveite a Nanite é um sinalizador para habilitá-la. A criação de conteúdo para a Nanite é a mesma das malhas tradicionais, mas a Nanite pode lidar com ordens de magnitude de mais triângulos e instâncias do que é possível para a geometria renderizada tradicionalmente. Mova a câmera para perto o suficiente, e a Nanite desenhará os triângulos de origem originais, os quais foram importados.
As malhas Nanite são compatíveis com vários UVs e cores de vértice. Os materiais são atribuídos a seções da malha de forma que esses materiais possam usar diferentes modelos de sombreamento e efeitos dinâmicos que podem ser feitos nos shaders. A atribuição de materiais pode ser trocada dinamicamente, assim como qualquer outra malha estática, e a Nanite não requer nenhum processo para reduzir os materiais.
O uso de texturas virtuais não é obrigatório com o Nanite, mas é altamente recomendado. Texturas virtuais são uma funcionalidade ortogonal do Unreal Engine com objetivos semelhantes para dados de textura que a Nanite alcança com dados de malha.
Os fluxos de trabalho de malhas estáticas devem estar familiarizados com a Nanite, mas há muitas coisas ainda não compatíveis. Consulte a seção Funcionalidades compatíveis desta página para obter mais detalhes.
Como o Nanite funciona?
O Nanite se integra da maneira mais perfeita possível aos fluxos de trabalho existentes da engine, enquanto usa uma nova abordagem para armazenar e renderizar dados de malha.
Durante a importação: as malhas são analisadas e divididas em grupos hierárquicos de grupos de triângulos.
Durante a renderização: os agrupamentos são trocados em tempo real em vários níveis de detalhes com base na visão da câmera e se conectam perfeitamente sem rachaduras aos clusters vizinhos dentro do mesmo objeto. Os dados são transmitidos sob demanda para que apenas os detalhes visíveis precisem residir na memória. A Nanite é executada na própria passagem de renderização que ignora completamente as draw calls tradicionais. Os modos de visualização podem ser usados para inspecionar o pipeline do Nanite.
Como a Nanite depende da capacidade de transmitir rapidamente dados de malha do disco sob demanda, unidades de estado sólido (ou SSDs) são recomendadas para armazenamento de tempo de execução.
Para quais tipos de malhas o Nanite deve ser usado?
A Nanite deve ser habilitada sempre que possível. Qualquer malha estática que a tenha habilitada normalmente será renderizada mais rapidamente e ocupará menos memória e espaço em disco.
Mais especificamente, uma malha é uma candidata especialmente boa para a Nanite se:
Contém muitos triângulos ou tem triângulos que ficarão bem pequenos na tela.
Tem muitas instâncias na cena.
Atua como um importante oclusor de outras geometrias Nanite.
Projeta sombras usando Mapas de sombras virtuais.
Um exemplo de exceção a essas regras é algo como uma esfera do céu: os triângulos serão grandes na tela, ela não obstrui nada e há apenas um triângulo na cena. Normalmente, essas exceções são raras, e a perda de desempenho ao usar o Nanite com elas é mínima, por isso a recomendação é não se preocupar excessivamente com onde o Nanite não deve ser habilitado se o Nanite for compatível com o caso de uso.
Alguns casos de uso não são compatíveis com a Nanite no momento. Consulte a seção Funcionalidades compatíveis desta página para obter mais detalhes.
Como habilitar o suporte a Nanite em malhas
A Nanite pode ser habilitada na geometria compatível das seguintes maneiras:
A conversão de geometria para a Nanite requer algum tempo de processamento para cada malha. Em grandes projetos, o uso de um Cache de Dados Derivados (DDC) compartilhado é especialmente útil se houver muitos Recursos Nanite. Consulte a documentação do CDD compartilhado para obter mais informações.
Como importar uma malha
Ao importar uma malha destinada a nós com o Nanite, marque a caixa para Construir Nanite.
Recomendamos desabilitar a propriedade Gerar UV de mapa de iluminação quando não estiver usando iluminação pré-computada com o Lightmass.
Quando habilitada, a geometria altamente detalhada adiciona um tempo significativo para importar e compilar dados de malha estática. A propriedade também adiciona um canal UV adicional, que inclui uma quantidade significativa de dados para malhas muito densas. Se o seu projeto não requer iluminação incorporada, não há necessidade de incorrer em nenhum custo.
Como habilitar o Nanite em ativos
Nos casos em que você já tem seu projeto preenchido com o conteúdo no qual deseja habilitar o Nanite, há duas opções: habilitar ativos em lotes usando o Navegador de Conteúdo ou habilitar ativos individuais por meio de seus próprios editores.
Habilitar o Nanite em malhas em lotes
Para lotes de ativos de malha estática ou de Malha esquelética para os quais você deseja habilitar o Nanite, use o Navegador de Conteúdo para selecionar todos eles. Clique com o botão direito e escolha Nanite > Habilitar no menu de contexto.
Habilitar Nanite em malhas individuais
Abra o editor de qualquer malha que seja compatível com o Nanite, como malhas estáticas e Coleções de Geometria (malhas de fratura conduzida por física do Chaos) e habilite o Nanite por meio do painel Detalhes.
No Editor de Malha Estática, localize as Configurações do Nanite e marque a caixa para Habilitar o suporte do Nanite.
No Editor de Coleções de Geometria, localize a seção Nanite e marque a caixa Habilitar Nanite.
Funcionalidades compatíveis do Nanite
Esta seção descreve a melhor forma de trabalhar com a Nanite em um projeto do Unreal Engine com detalhes sobre o que é e não é compatível e possíveis limitações.
Geometria
O Nanite pode ser habilitado em Malhas Estáticas e Coleções de Geometria.
Uma malha habilitada para a Nanite pode ser usada com os seguintes tipos de componentes:
Malha estática
Malha esquelética
Malha estática instanciada
Malha de spline
Malha estática instanciada hierárquica
Coleção de Geometria
Pintor de folhagem
Grama de paisagem
O Nanite tem suporte limitado para deformação de malhas rígidas. O Nanite é compatível com translação dinâmica, rotação e dimensionamento não uniforme dessas malhas, sejam elas dinâmicas ou estáticas. Isso significa mover qualquer posição de uma malha do Nanite de uma forma que seja mais complexa do que pode ser expressa em uma única matriz 4x3, aplicada uniformemente a toda a malha.
A deformação é limitada com:
(Beta) Deslocamento de posição no mundo (WPO) em Materiais.
As malhas do Nanite que usam deslocamento WPO são divididas em agrupamentos menores, em que cada um deles tem seus próprios limites individuais e são selecionados individualmente na GPU. Utilize a fixação do WPO para gerenciar quantos clusters de malha do Nanite são removidos.
A folhagem que usa WPO é menos problemática porque a folhagem é preenchida com buracos e não pode realmente se ocluir.
A deformação não é compatível com:
Alvos de transformação
O número máximo de instâncias que podem estar presentes na cena é bloqueado para 16 milhões de instâncias, o que inclui todas as instâncias transmitidas, não apenas aquelas habilitadas para uso com a Nanite. Somente as instâncias transmitidas são contadas no total.
As tangentes por vértice não são armazenadas na malha estática quando ela está habilitada para a Nanite. Em vez disso, o espaço tangente é derivado implicitamente no shader de pixel. Os dados tangentes não são armazenados para reduzir o tamanho dos dados. Essa diferença no espaço tangente usando essa abordagem pode causar descontinuidades nas arestas. No entanto, esse problema específico não se mostrou significativo e há planos para oferecer suporte a tangentes de vértice em uma versão futura.
Materiais
O Nanite oferece suporte para materiais que têm o Modo de Mesclagem definido como Opaco e Com máscara. Quando um tipo de material incompatível é detectado, um material padrão é atribuído à malha habilitada para Nanite e um aviso é colocado no Log de Saída com informações adicionais.
Notas adicionais sobre as funcionalidades do material:
As malhas habilitadas para Nanite podem receber decalques projetados em suas superfícies, mas não são compatíveis com Decalques de Malha, que exigem que os materiais usem um Modo de Mesclagem Translúcido.
A caixa de seleção Wireframe não é compatível.
O nó de Interpolador de vértice e PersonalizarUV são compatíveis, mas serão avaliados três vezes por pixel.
Os nós de expressão personalizada, ou qualquer nó que as use (como a função de material
ParallaxOcclusionMapping), pode resultar em artefatos com o Nanite. Isso é esperado, pois o Nanite ainda não tem suporte para derivadas analíticas.
Renderização
As seguintes funcionalidades de renderização não são compatíveis no momento:
Filtragem específica de exibição de objetos com:
Raio mínimo da tela
Culling de distância
Renderização direta
Renderização estéreo para Realidade Virtual
Tela dividida
Antisserrilhado Multiamostra (MSAA)
Canais de iluminação
Traçado de raios contra malhas Nanite
A malha reserva é usada para malhas habilitadas para Nanite por padrão. Diminua o parâmetro Erro relativo de reserva no Editor de Malha Estática para usar mais triângulos da malha de origem.
(Experimental) O suporte inicial para traçado de raios nativo de malhas Nanite é habilitado com a variável de console
r.RayTracing.Nanite.Mode 1. Isso preserva todos os detalhes enquanto usa significativamente menos memória de GPU do que malhas de fallback sem erro.
Alguns modos de exibição de visualização ainda não são compatíveis com a exibição de malhas Nanite.
Tenha cuidado com alguns modos de visualização no Editor de Malha Estática ao visualizar geometria altamente detalhada. A visualização de Normais e UV pode causar problemas no desempenho do editor.
Plataformas compatíveis
No momento, a Nanite é compatível com PlayStation 5, Xbox Series S|X e PCs com placas de vídeo que atendem a essas especificações, usando os drivers mais recentes com DirectX 12 com Shader Model 6 (SM6):
NVIDIA: cartões da geração Maxwell ou mais recentes.
AMD: cartões da geração GCN ou mais recentes.
Todas as versões mais recentes do Windows 10 (mais recentes que a versão 1909.1350) e do Windows 11 com suporte para DirectX 12 Agility SDK são compatíveis.
Windows 10 versão 1909 — O número da revisão deve exceder ou ser igual a 0.1350.
Windows 10 versão 2004 e 20H2 — O número da revisão deve exceder ou ser igual a 0.789.
DirectX 12 com Shader Model 6.6 Atomics ou Vulkan (VK_KHR_shader_atomic_int64).
Apple Silicon M2 ou mais recente.
Linux com NVIDIA GeForce 2080 ou mais recente.
Drivers de vídeo mais recentes
O PlayStation 4 e o Xbox One também oferecem suporte à Nanite, mas o suporte nessas plataformas é atualmente considerado experimental. Espera-se que o desempenho da Nanite nessas plataformas com conteúdo de alta fidelidade não atenda aos requisitos de um jogo entregável.
Para obter mais informações sobre as especificações de hardware e software recomendadas pela Epic Games, consulte Especificações de hardware e software.
Malha reserva e configurações de precisão do Nanite
Malhas estáticas e esqueléticas incluem propriedades adicionais que controlam a precisão da representação do Nanite e a malha de fallback gerada a partir da malha de detalhes completos.
Essas configurações estão localizadas no painel Detalhes do Editor de Malha na seção Configurações do Nanite.
As configurações da Nanite incluem as seguintes propriedades:
| Propriedade | Descrição |
|---|---|
Habilitar Suporte para Nanite | Permite que esta malha seja usada com o Nanite e gere uma malha reserva em situações em que o Nanite não pode ser usado. |
Preservar área | Permite que as malhas Nanite que perderiam área de superfície devido à simplificação redistribuam essa área perdida para os triângulos restantes, dilatando as arestas de limite abertas. Isso é mais útil para folhagem, onde as folhas tendem a se tornar triângulos e quadrângulos disjuntos por meio da simplificação. O efeito dessa configuração é aumentar a escala de cada folha. Para fitas geométricas, como folhas de grama, tem o efeito de engrossá-las. Esta configuração deve ser habilitada em todas as malhas de folhagem e nada mais. |
Tangentes explícitas | Quando verdadeiro, as tangentes do modelo original são armazenadas e usadas a cada ativo. Essa configuração indica que as tangentes são armazenadas explicitamente no disco, em vez de serem derivadas implicitamente no tempo de execução. A configuração de precisão da tangente fica disponível para controlar melhor as tangentes dos vértices. Habilitar essa configuração aumenta o armazenamento em cerca de 10%, mas isso pode ser preferível quando as tangentes implícitas não forem precisas o suficiente. |
UV de lerp | Determina se UVs devem ser interpolados ao simplificar. Isso deve ser habilitado sempre que possível. Para coordenadas UV reais, permite calcular os UVs ideais de menor erro para novos vértices ao simplificar, desde que os UVs sejam usados como coordenadas normais de textura e interpolarão entre a face dos triângulos. Deve ser desabilitado se os dados armazenados em UVs não forem válidos para interpolação. Por exemplo, se os índices estiverem armazenados em UVs. Aplicar interpolação linear a um índice não faz sentido e quebraria o shader que tentasse usá-lo. Se for desabilitado, o erro dos UVs não será mais considerado quando o Nanite selecionar o LOD para renderizar, porque erros decorrentes de atributos de vértice arbitrários que não são interpoláveis geralmente não podem ser fundamentados. |
Precisão da posição | Escolha a precisão que esta malha deve usar ao gerar as posições dos vértices de uma malha Nanite. Automático determina a precisão apropriada com base no tamanho da malha. A precisão pode ser substituída para melhorá-la ou otimizar a pegada do disco. |
Precisão das normais | Escolha a precisão que esta malha deve usar ao gerar as normais dos vértices de uma malha Nanite. Automático determina a precisão apropriada com base no tamanho da malha. A precisão pode ser substituída para melhorá-la ou otimizar a pegada do disco. |
Residência mínima (geometria da raiz) | Define o tamanho do byte de memória que esta malha deve sempre manter na memória e tem o restante transmitido. Valores mais altos requerem mais memória, mas para algumas malhas, isso pode atenuar a ocorrência de problemas de pop-in de transmissão. |
Manter porcentagem do triângulo | A porcentagem de triângulos a manter da malha de origem. Reduza essa porcentagem para otimizar o tamanho do disco. |
Aparar erro relativo | Define a quantidade máxima de erro relativo que pode ser removido para a malha Nanite. Todos os detalhes na malha de origem com menos impacto visual do que essa quantidade relativa de erro são removidos. O erro relativo não tem tamanho unitário e é relativo ao tamanho da malha. Por padrão, o Nanite armazena todos os triângulos da malha de origem original. |
Reserva de destino | Determina qual é o sistema de mira a ser usado ao gerar uma malha de fallback. Automático: crie automaticamente uma malha reserva com base nas configurações do projeto. Porcentagem do triângulo reserva: define a porcentagem de triângulos que permanecem ao reduzir a malha de origem do Nanite. Erro relativo de reserva: reduza até que o erro especificado seja alcançado em relação ao tamanho da malha. Todos os detalhes na malha de fallback gerada com menos impacto visual do que essa quantidade de erro relativo é removida. |
Nome do arquivo de importação de origem | O caminho do arquivo usado para importar uma malha em alta resolução para usar com o Nanite. A versão de alta resolução da malha é usada no lugar do LOD0 por sistemas que podem se beneficiar de geometria mais detalhada, com o Nanite e Modelagem de Geometria no Unreal Engine. |
Canal UV de deslocamento | Canal UV a ser usado ao criar amostras de mapas de deslocamento. |
Mapas de deslocamento | Adicione e edite mapas de deslocamento. |
Fator máximo de extensão da aresta | Controla a distância máxima permitida entre cada vértice da malha na tela. Isso pode ser usado para evitar a simplificação excessiva de malhas que devem ser deformadas, como animações que usam deslocamento de posição no mundo e malhas de spline. Isso deve ser deixado em 0 por padrão, a menos que seja explicitamente necessário para corrigir problemas causados por simplificação excessiva. |
Precisão do vértice
A Nanite quantifica as posições dos vértices da malha para maximizar a densidade da memória e minimizar o espaço ocupado pelo disco. O tamanho do passo de quantização é uma potência de dois que pode ser selecionada para corresponder aos requisitos de malhas individuais usando a propriedade Precisão da posição. Por padrão, o Automático escolhe a precisão apropriada com base no tamanho da malha e na densidade do triângulo. Você pode substituir manualmente selecionando um tamanho de precisão para melhorar a precisão ou otimizar a pegada do disco.
Qantinização é uma forma de compressão com perdas. A compactação com perdas é particularmente desafiadora ao trabalhar com peças de malha modular ou outras malhas que compartilham limites. Especialmente quando esses limites precisam se alinhar perfeitamente para não introduzir buracos ou rachaduras na geometria.
Para garantir a consistência, a quantização ocorre em coordenadas de objeto não normalizadas centralizadas em torno da origem da malha. Isso garante que a quantização nunca cause rachaduras quando a malha usar a mesma configuração de precisão e a translação entre o centro da malha seja um múltiplo dessa precisão.
Como aparar os dados
Há momentos em que você precisará reduzir a quantidade de dados que o Nanite armazena para otimizar o tamanho do disco. O Nanite inclui configurações que permitem aparar os dados detalhados de uma malha do Nanite armazenada a qualquer momento durante a produção, o que significa que você pode ultrapassar com segurança a qualidade no início e ajustar de acordo posteriormente.
Para aparar os dados detalhados, você deve usar as propriedades Manter porcentagem do triângulo e Aparar erro relativo. Você pode pensar neles como uma opção pré-decimada antes de serem armazenados como uma malha Nanite. No caso do Nanite, os detalhes não precisam ser uniformes em toda a malha. Ele remove os dados menos significativos primeiro e é mais semelhante à compactação com perdas.
Use Manter porcentagem do triângulo para definir a porcentagem de triângulos a serem mantidos na malha de origem.
Use Aparar erro relativo para definir a quantidade máxima de erro relativo que é permitido ao aparar os dados da malha de origem. Qualquer triângulo que, se removido, incorreria em um erro relativo menor que se esse valor fosse removido. Ou outra maneira de pensar sobre isso é que todos os detalhes com menos impacto visual do que esse valor serão aparados. O erro relativo não tem tamanho unitário e é relativo ao tamanho da malha.
Os padrões para ambas as propriedades são tais que nada é aparado por padrão, e o Nanite armazena todos os triângulos da malha de origem original.
Aparar dados é importante para reduzir o tamanho do disco (em outras palavras, o tamanho do download), não para melhorar o desempenho. Consulte a seção Tamanho dos Dados abaixo para obter mais informações sobre este tópico.
Malha reserva
Muitas partes do Unreal Engine precisam acessar o buffer de vértice tradicional fornecido por malhas renderizadas tradicionalmente. Ao habilitar o Nanite está habilitada para uma malha estática, ela gera uma representação aproximada (chamada Malha de Fallback) da malha altamente detalhada. A malha de fallback é usada quando a renderização do Nanite não é compatível. Também é usada quando não seria ideal usar a malha de detalhes completos, como quando é necessária uma colisão complexa. É preciso usar mapas de iluminação para iluminação incorporada e para reflexos de traçado de raios de hardware com Lumen.
A propriedade Porcentagem do triângulo reserva representa a porcentagem de triângulos da malha de origem que são usados para gerar a malha reserva. Você pode especificar a porcentagem de triângulos para manter entre 0 e 100 por cento, onde grandes porcentagens mantêm mais detalhes da malha original.
O Erro relativo reserva define a quantidade máxima de erro relativo que é permitido ao remover detalhes da malha de origem. Quaisquer triângulos que, se removidos, incorreriam em um erro relativo menor que esse valor, são removidos com detalhes de menor impacto visual sendo os primeiros a serem removidos. O erro relativo não tem tamanho unitário e é relativo ao tamanho da malha.
Por exemplo, se você quiser que sua malha não tenha nenhuma decimação, você deve usar uma porcentagem do triângulo de fallback de 100 e um erro relativo a fallback de 0.
Na comparação abaixo, há a malha Nanite altamente detalhada criada a partir da malha de origem que é comparada com as configurações padrão de uma Malha de Fallback Nanite gerada.
Use Erro Relativo a Fallback para especificar quanto do detalhe original é retido da malha de origem original e Porcentagem de Fallback para definir quanto desse detalhe é usado.
Na comparação abaixo, a Malha de Fallback mantém 100 por cento da Porcentagem do Triângulo de Fallback, mas ajusta o Erro Relativo a Fallback para usar mais triângulos da malha de origem original. Ao ajustar esses valores, você pode usar os detalhes da Nanite para Triângulos Nanite na janela de janela de visualização como um indicador ao alterar seus valores.
Visualização de malha reserva
No Editor de Malha Estática, você pode alternar entre a malha Nanite totalmente detalhada e a malha reserva do Nanite usando a opção Reserva do Nanite das janelas de visualização no menu suspenso Exibir. Como alternativa, você pode usar a tecla de atalho Ctrl + N para alternar rapidamente entre as duas opções de visualização.
Como usar LODs de malha reserva personalizados para malhas habilitadas para Nanite
A Malha de Fallback é usada para funcionalidades do Engine, como colisão complexa por polígonos, traçado de raios, incorporação de iluminação e assim por diante. Também é usada para plataformas que não são compatíveis com o Nanite. Ao gerar a malha reserva, uma malha habilitada para a Nanite sempre usa o slot LOD0 da malha de origem para gerar automaticamente a malha reserva. No entanto, há momentos em que é desejável usar uma malha de fallback especificada manualmente ou uma série de LODs tradicionais, em vez de uma gerada automaticamente.
Esse nível de controle permitiria que você usasse o Nanite em um projeto, mas também controlasse diretamente a geometria vista em reflexos rastreados por raios ou em plataformas incompatíveis com a Nanite.
Siga as etapas abaixo para especificar sua própria malha de fallback personalizada ou para usar uma série de LODs:
Defina a Porcentagem do triângulo reserva como 0 para que a malha reserva seja a menor possível, pois ela será ignorada ao usar essa abordagem.
Adicione um ou mais LODs à malha usando este procedimento tradicional de configuração de LOD.
Use o menu suspenso Importação de LOD para Importar LOD Nível 1 na seção Configurações de LOD.
Defina o LOD mínimo como 1 na seção Configurações de LOD. Isso faz com que a Malha de Fallback gerada pelo Nanite seja ignorada.
A Colisão Complexa apresenta um caso especial. Use a propriedade LOD para colisão em Configurações gerais para especificar qual LOD deve ser usado para colisão. Qualquer LOD pode ser usado para colisão, incluindo LOD0.
Essa abordagem específica pode não ser viável para tornar os projetos Nanite automaticamente compatíveis com plataformas não compatíveis com a Nanite e deve ser testada e avaliada para o seu projeto.
A Nanite lida com um número muito grande de instâncias com eficiência, mas se a Nanite estiver desabilitada, pode haver um número esmagador de draw calls para o pipeline de renderização tradicional. Você pode testar esse recurso em seu projeto para determinar a viabilidade usando r.Nanite 0 para ativar e desativar o suporte Nanite.
Consulte a seção Variáveis e comandos do console desta página para obter mais informações.
Como trabalhar com conteúdo habilitado para Nanite
Na maioria dos casos, a Nanite realiza um dimensionamento muito bom dentro da resolução da tela. Ele faz isso com base em duas técnicas: nível de detalhamento refinado e seleção de oclusão. Normalmente, isso significa que, independentemente da complexidade geométrica dos dados de origem na cena, o número de triângulos que o Nanite tenta realmente desenhar na tela é consistente e proporcional ao número de pixels.
A Nanite segue o princípio de design de que não adianta desenhar muito mais triângulos do que pixels.
No entanto, existem alguns casos de conteúdo que quebra as técnicas que o Nanite usa para realizar o dimensionamento, mas isso não significa que ele não deva ser usado para esse conteúdo ou que não será renderizado mais rapidamente do que o pipeline de renderização tradicional. Significa apenas que, para esse tipo de conteúdo, o dimensionamento com pixels — e não a complexidade da cena — não se aplica mais a eles. Use os recursos de Criação de perfil fornecidos pela Unreal Engine para monitorar esses tipos de situações quando elas ocorrerem.
Geometria agregada
Geometria Agregada é a geometria que tem muitas partes desarticuladas que se tornam um volume à distância, como cabelo, folhas de árvores e grama. Esse tipo de geometria quebra o nível de detalhe e as técnicas de seleção de oclusão da Nanite. A Nanite é inerentemente um nível hierárquico de estrutura de detalhes que depende da capacidade de simplificar pequenos triângulos em triângulos maiores e escolher o mais grosseiro quando determina que a diferença é menor do que pode ser percebida. Para superfícies contínuas, isso funciona bem, mas não para geometria agregada que, à distância, parece mais uma nuvem parcialmente opaca do que uma superfície sólida. Como tal, é mais provável que o Nanite determine que não pode reduzir a geometria agregada quase tão agressivamente quanto faria com superfícies sólidas típicas, resultando assim em mais triângulos sendo desenhados para o mesmo número de pixels cobertos.
Outra otimização que quebra a geometria agregada é a Seleção de Oclusão. Embora seja refinado, a granularidade não é por pixel. A geometria que é preenchida com buracos — e pior ainda, camadas sobre camadas de geometria cheia de buracos — causa overdraw excessivo porque muitas camadas de profundidade precisam se acumular antes que aquela área na tela bloqueie qualquer coisa atrás dela. Uma maneira de pensar sobre isso é considerar uma região de 8x8 pixels na tela e quantas camadas de profundidade precisam ser desenhadas antes que cada pixel seja preenchido. O overdraw excessivo significa que, para o mesmo número de pixels cobertos, o Nanite tenta desenhar mais triângulos, tornando a renderização mais lenta.
A folhagem é o caso mais óbvio para causar problemas com seleção de oclusão, mas mesmo assim, isso não significa que a Nanite não deva ser usado em malhas do tipo folhagem. Consulte a seção Folhagem usando o Nanite abaixo para obter mais informações. É bom experimentar diferentes casos de uso e ver o que funciona bem para seus projetos. Use ferramentas de perfil para confirmar o bom desempenho da Nanite com esses tipos de malhas.
Superfícies muito próximas
A seleção de oclusão com malhas tradicionais torna os fluxos de trabalho de kitbashing quase impossíveis em grande escala devido a limitações práticas. A natureza refinada da seleção de oclusão com a Nanite torna possível usar esses tipos de fluxos de trabalho durante o desenvolvimento com menos preocupação. Conforme explicado na seção Geometria Agregada acima, o overdraw pode vir de superfícies ocultas muito próximas das superfícies visíveis abaixo delas. Se qualquer geometria estiver enterrada bem abaixo da superfície visível, a Nanite a detecta e a seleciona de forma bastante barata, de modo que pode ser considerada livre de custos. No entanto, quando há geometria empilhada que está próxima da superfície superior, a Nanite não consegue determinar qual está na parte superior ou inferior, fazendo com que ambas sejam desenhadas simultaneamente.
Esse problema específico com seleção é o pior cenário em que o Nanite não sabe qual superfície está no topo e apenas desenha todas as camadas. Imprecisões como essa são dimensionadas com o tamanho da tela e a distância, portanto, enquanto 10 centímetros podem separar as camadas e parecer bem quando próximas à superfície, distâncias maiores podem fazer com que a diferença de distância seja menor que um pixel, resultando em overdraw.
No exemplo abaixo, se a câmera for movida para olhar para baixo na área onde o personagem está, a visualização de Overdraw do Nanite mostra como essas superfícies empilhadas estão sendo renderizadas. Áreas mais brilhantes indicam que mais overdraw está acontecendo nessas áreas do que em outras.
A visualização Overdraw é a maneira mais eficaz de encontrar problemas de overdraw. Embora alguma quantidade de overdraw deva ser esperada, quantidades excessivas resultam em custos de seleção e rasterização do Nanite cada vez mais altos, e o dimensionamento do Nanite independentemente da complexidade da cena se tornará menos eficaz no processo.
Normais facetadas e de borda rígida
Um problema a ser considerado é ao importar malhas altamente detalhadas que possuem normais facetadas, o que significa que a normal entre dois polígonos diferentes não foi suavizada. Esse problema é comum e fácil de passar despercebido e deve-se tomar cuidado para evitar esse problema em particular, porque pequenas quantidades de compartilhamento de vértices em uma malha podem se tornar significativamente mais caras, tanto no desempenho da renderização quanto no tamanho dos dados. Idealmente, o número de vértices de uma malha deve ser menor que o número de triângulos que ela possui. Se a proporção for 2:1 ou superior, provavelmente haverá um problema, especialmente se isso resultar em uma contagem alta de triângulos. Ter uma proporção de 3:1 significa que a malha é completamente facetada, onde cada triângulo tem seus próprios três vértices, nenhum dos quais é compartilhado com outro triângulo. Na maioria das vezes, isso é causado pelo fato de as normais não serem as mesmas porque não são suavizadas.
Com isso em mente, mais vértices significam mais dados para armazenar. Isso também significa mais trabalho de transformação de vértice e proporções maiores que 2:1 caem em alguns caminhos de renderização lentos. O uso intencional na modelagem de superfícies duras não deve causar problemas e não há motivo para não usá-las. No entanto, malhas muito densas de facetas acidentais de 100% são muito mais caras do que o pretendido. Outra coisa a se observar são as normais importadas em superfícies densas de tipo orgânico geradas em outros pacotes DCC que possuem limites normais rígidos que podem ser sensíveis em malhas de polígonos inferiores, mas podem adicionar despesas desnecessárias com o Nanite.
Por exemplo, nas duas malhas abaixo, a malha à esquerda tem normais facetadas, enquanto a da direita tem normais suavizadas. Ao compará-las usando a visualização de Triângulos do Nanite, há diferenças perceptíveis no número de triângulos usados pelo Nanite para desenhá-las. A facetada à esquerda desenha significativamente mais triângulos do que a suavizada à direita.
Malhas habilitadas para Nanite com normal facetada (esquerda) e suavizada (direita) | Visualização de triângulo do Nanite de malhas habilitadas para o Nanite com normais facetadas (à esquerda) e suavizadas (à direita) |
Clique na imagem para ver em tamanho grande. | Clique na imagem para ver em tamanho grande. |
### Malha esquelética do Nanite
Atualmente, este recurso do Nanite é experimental.
As malhas esqueléticas do Nanite são compatíveis com:
Uma nova API de Malha esquelética que simplifica a renderização.
Um draw call para uma malha inteira.
Sombreamento de mapas de sombras virtuais.
Nenhum LOD de geometria. A malha esquelética do Nanite usa LODs de animação.
Instanciação com bancos de animação.
Folhagem usando Nanite
A folhagem que usa o Nanite é considerada Beta e está sendo ativamente pesquisada e desenvolvida. Esta seção fornece algumas orientações sobre como usar a geometria de folhagem com o Nanite.
Para recursos como árvores com configurações Nanite padrão, você pode descobrir que as copas tendem a diminuir com a distância. Esses casos são uma forma particular de Geometria agregada em que cada parte disjunta (uma folha ou lâmina de grama) tem arestas abertas em seu limite. Habilitar a Preservar área é útil para evitar esse afinamento quando o Nanite está habilitado. Quando a Nanite simplifica a geometria na distância reduzindo o número de triângulos, ela consequentemente precisa começar a remover completamente alguns desses elementos disjuntos. Sem a Nanite ter mais informações, o resultado parecerá afinado porque houve uma grande perda de área de superfície. A opção Área de Preservação redistribuirá essa área perdida para os triângulos restantes, dilatando as bordas dos limites abertos. A dilatação para formas simétricas como folhas tem o mesmo efeito que aumentá-las. Em casos não simétricos como fitas, por exemplo folhas de grama, tem o efeito de engrossá-las.
Recomendamos usar o recurso Preservar área para todas as malhas de folhagem, mas não para malhas que não devem ser usadas como folhagem de cena.
A visualização de Cluster do Nanite fornece uma visão mais clara de como a configuração Preservar área redistribui a área perdida.
Abaixo estão algumas recomendações ao usar e criar recursos de folhagem com a Nanite em mente. Ainda estamos experimentando e aprendendo quais são as melhores abordagens. Até agora, vimos que a folhagem com o Nanite deve ser criada de forma diferente do que antes, mas se você aproveitar os pontos fortes anteriores, poderá obter resultados mais rápidos e de maior qualidade usando o Nanite.
Use Preservar área (habilitada no Editor de Malha Estática).
Use geometria em vez de cards com máscara.
Os materiais com máscara são bastante caros em comparação com os opacos. Os resultados mais rápidos provavelmente são obtidos por não usá-los.
A abordagem de card tradicional (muitos elementos são representados com um único card) com o Nanite pode ser mais lenta do que a não Nanite. Não espere que habilitar a Nanite em folhagem baseada em cartão seja sempre uma melhoria de desempenho.
Os pixels com máscara custam quase tanto quanto os pixels desenhados.
A folhagem de geometria mostrou ser mais rápida com Nanite do que com abordagens de card, tanto cards Nanite quanto cards não Nanite. Também tem melhor aparência.
O pacote Megascans: Grass na Fab oferece bons exemplos para teste. O pacote oferece geometria mascarada e de alta contagem de polígonos, em que cada elemento é independente, e cartões mascarados com baixa contagem de polígonos, em que muitos elementos são representados por um único cartão.
Ao usar o deslocamento de posição no mundo (WPO), mais vértices equivalem a um custo mais alto. A lógica do WPO deve ser limitada e monitorada.
Os problemas explicados na seção Geometria agregada desta página ainda se aplicam. Florestas densas (como os exemplos acima) renderizarão muito mais lentamente do que a mesma cena com todas as malhas substituídas por formas sólidas da mesma contagem de triângulos.
Como usar o deslocamento máximo da compensação de posição no mundo com o Nanite
Nos seus materiais e instâncias de material, você pode usar a configuração Deslocamento máximo da compensação de posição no mundo para definir um limite superior para a quantidade de deslocamento que o WPO pode ter. Isso pode ser útil principalmente para as malhas do Nanite, por serem divididas em clusters menores, em que cada um deles tem seus próprios limites individuais e é selecionado individualmente na GPU. Fixar o deslocamento de posição no mundo é uma boa maneira de gerenciar isso.
Você pode localizar a configuração Deslocamento máximo da compensação de posição no mundo na categoria Detalhes > Deslocamento de posição no mundo do material ou em Substituições de propriedade material em uma instância de material.
Para obter mais detalhes, consulte Propriedade material.
Mapeamento de deslocamento estático do Nanite
Atualmente, este recurso do Nanite é experimental.
O Editor de Malha Estática inclui uma opção para adicionar detalhes a malhas ativadas pelo Nanite por meio de um tesselador off-line adaptativo. O tesselador gera uma malha do Nanite otimizada usando mapas de deslocamento incorporados a ela. Essa abordagem baseada em textura não é destrutiva e permite controlar a quantidade de tesselação e deslocamento por meio de parâmetros escalares.
No painel Detalhes, em Configurações do Nanite, faça o seguinte:
Defina o Aparar erro relativo para um valor diferente de 0 para controlar a quantidade de tesselação.
Um bom padrão é 0,04, mas você deve mantê-lo acima de 0,02. Esse valor indica o nível de erro ao tesselar a malha. Se for pequeno demais, serão usados muitos triângulos e o tempo de compilação aumentará.
Adicione Mapas de deslocamento.
Expanda o elemento Índice e adicione uma Textura para usar no deslocamento.
Se a malha tiver mais de um espaço de material, cada índice dos mapas de deslocamento será mapeado ao espaço de material correspondente. Por exemplo, o espaço de material 0 seria mapeado para o índice 0 dos mapas de deslocamento, o espaço de material 1 para o índice 1 e assim por diante.
Defina uma Magnitude para controlar a quantidade de deslocamento.
Clique em Aplicar alterações.
Tesselação do Nanite
Atualmente, este recurso do Nanite é experimental.
A tesselação do Nanite é um deslocamento programável dinâmico que permite que as malhas do Nanite sejam modificadas em tempo de execução usando um mapa de deslocamento ou material procedural. Isso é diferente do deslocamento de posição no mundo, que só pode operar nos vértices da malha original. O Nanite tessela a malha em tempo de execução em triângulos adicionais para se adequar aos detalhes do mapa de deslocamento. São gerados apenas os detalhes de triângulo necessários para a densidade de pixels atual.
Os benefícios da tesselação do Nanite incluem:
Uso de malhas de origem que incluem menos detalhes no pipeline de criação.
Deslocamento acionado por material e animado.
Criação de paisagens detalhadas do Nanite.
Clique na imagem para ampliar.
Para habilitar a tesselação do Nanite, você precisa definir as variáveis de console a seguir em ConsoleVariables.ini ou nos arquivos de configuração .ini do seu projeto:
// This is read-only and must be set in the config file for the project.
r.Nanite.AllowTessellation=1
// This can be dynamically toggled at runtime.
r.Nanite.Tessellation=1Após definir essas variáveis, você pode configurar a tesselação usando o Editor de Material seguindo estas etapas:
Selecione o nó principal do material.
No painel Detalhes, nas configurações do Nanite, marque a caixa de seleção Habilitar tesselação.
Conecte uma amostra de textura à entrada de Deslocamento no nó de material principal.
O intervalo de valores de entrada de deslocamento é 0-1.
Você deve configurar duas configurações ao usar tesselação em um material:
Magnitude: é a altura do deslocamento, medida do mínimo ao máximo, para a qual o intervalo 0 a 1 do pin de deslocamento é mapeado. Ele também determina a delimitação usada para culling, portanto, defina apenas para o tamanho necessário.
Esse valor tem um impacto significativo no desempenho e pode gerar outros efeitos indesejados. Para obter mais informações, consulte a seção “Do que você precisa saber” abaixo.
Centro: especifica qual valor de deslocamento corresponde a nenhuma alteração da malha base. Portanto, se cinza médio for o centro e você quiser um deslocamento igual dentro e fora da malha, use 0,5. Se quiser empurrar apenas para fora, defina como 0.
Além disso, em um material, você pode otimizar a tesselação do Nanite com o Fade de deslocamento habilitado no painel Detalhes. Ele tem duas configurações:
Tamanho inicial do fade (Pixels): o tamanho que deve ter o deslocamento máximo, em pixels na tela, quando o deslocamento do fade out estiver iniciando. Este valor deve ser um número maior que o valor do tamanho final do fade.
Tamanho final do fade (Pixels): o tamanho que deve ter o deslocamento máximo, em pixels na tela, quando o fade out deve terminar e o deslocamento deve ser desabilitado. Este valor deve ser menor que o tamanho inicial do fade.
Importante:
Só funciona em malhas Nanite. A tesselação e o deslocamento são ignorados em malhas que não são do Nanite ou nos casos em que o Nanite não é compatível.
O deslocamento não altera o sombreamento (ao contrário dos renderizadores off-line). Você precisa fornecer um mapa de normais correspondente ou derivar uma normal das derivadas de deslocamento. Por uma questão de qualidade e compactação, recomendamos ter um mapa de normais adicional.
Apenas deslocamento escalar. No momento, não há suporte para deslocamento de vetor.
O deslocamento ocorre ao longo da normal de vértice interpolada não normalizada. No momento, não há uma opção para controlar a direção de deslocamento no shader. Ocorre sempre ao longo da normal.
O deslocamento está no espaço local e antes de qualquer tipo de escala de objeto. Isso significa que a magnitude do deslocamento especificada no material está em unidades de espaço de objeto antes do dimensionamento da malha. Isso geralmente é o que você quer, mas pode não ser. Por exemplo, nos casos em que você deseja um tijolo de mosaico em um cubo dimensionado para ser uma parede. Provavelmente adicionaremos uma opção de espaço do mundo no futuro para resolver esses casos.
A tesselação e o deslocamento também funcionam na paisagem, desde que o Nanite tenha sido gerado para ela. Infelizmente, as malhas que a paisagem gera têm uma escala significativa aplicada automaticamente a elas. Portanto, certifique-se de usar uma magnitude muito menor para os materiais da paisagem. É 64x menor. Isso provavelmente será resolvido futuramente usando a opção mencionada no ponto anterior.
Mantenha o valor da configuração Magnitude o menor possível. Em vez disso, tente usar toda a variação de 0 a 1 da saída do deslocamento. Não defina a magnitude para 100 e depois reduza o valor a ser conectado à saída do deslocamento para compensar. Isso ocorre porque o valor da magnitude é usado para patches vinculados para seleção. Magnitudes maiores podem impactar muito o desempenho, especialmente com mapas de sombras virtuais.
No momento, não há uma solução para o deslocamento sem fraturas, como a que a Unreal Engine 4 tinha com a tesselação por hardware. Isso significa que costuras de UV, normais de borda rígidas ou qualquer atributo de vértice que afeta o deslocamento que não seja suave causará fraturas.
A tesselação pode ser combinada com o deslocamento de posição no mundo. Nesse caso, o deslocamento de posição no mundo é aplicado aos vértices da malha-base antes da tesselação. Como sempre, o deslocamento se aplica às vértices do triângulo em cubos após a tesselação.
A tesselação não é compatível com o deslocamento em profundidade de pixel. O deslocamento em profundidade de pixel será ignorado se a tesselação estiver habilitada.
A tesselação pode ser combinada com a máscara de opacidade, mas, por motivos de desempenho, o mascaramento é feito em uma taxa de triângulo cortado, não por pixel. Na maioria dos casos, isso funciona bem, mas não com pontilhamento, que precisa ser por pixel.
É possível que os artefatos de compactação de textura sejam óbvios para mapas de deslocamento e pareçam degraus de escada. A configuração de compactação de textura Alpha, que usa BC4, funciona bem em muitos casos. O armazenamento no alfa de um RGBA com padrão/DXT5/BC3 deve gerar resultados semelhantes. Às vezes, pode ser necessário descompactar, mas usar ponto flutuante provavelmente é um exagero. A compactação de canais, em especial a de altura com normais, com qualquer formato compactado provavelmente exibirá artefatos. Isso pode ser contrário à experiência anterior quando mapas de altura eram usados para outros fins.
O deslocamento é relativo aos triângulos planos da malha-base. Isso significa que ele não começa em uma superfície curva, como triângulos PN ou superfícies de subdivisão Catmull-Clark. A tesselação não suaviza a superfície de forma inerente.
Splines do Nanite
As malhas do spline são usadas para deformar malhas ao longo do formato de um spline, como estradas e caminhos sobre um terreno de paisagem. A malha habilitada para Nanite oferece suporte a spline por padrão e pode ser criada como spline de paisagem e spline de Blueprint.
Exemplo de cena com malha do Nanite em primeiro plano e spline do Nanite. Esta cena mostra a visualização de triângulos ilumináveis e do Nanite.
As malhas de spline do Nanite podem causar problemas visuais. Um deles é que, ao criar uma malha de spline com uma malha estática habilitada para Nanite, é possível que a malha de spline caia para uma resolução mais baixa à medida que a câmera se afasta dela. Isso ocorre porque o Nanite não considera a deformação das malhas de spline ao gerar seu nível de detalhe inferior (LOD). Como resultado, simplificações que são imperceptíveis à mesma distância quando não deformadas podem se tornar óbvias quando esticadas ao longo de uma curva de spline.
Você pode mitigar esse problema de deformação com a configuração Fator máximo de extensão da borda localizada no Editor de Malha Estática em Configurações do Nanite no painel Detalhes. Esse parâmetro atenua esse problema forçando o Nanite a manter detalhes suficientes para preservar uma distância desejada entre os vértices da malha na tela, evitando que ela seja renderizada abaixo de um limite de densidade de vértice.
O fator máximo de extensão da borda padrão é 0. Isso indica que o comprimento da borda não será considerado para essa malha. Valores maiores que 0 representam uma distância desejada entre dois vértices conectados no espaço de tela. De modo mais específico, essa distância é representada como um múltiplo da menor borda do triângulo do Nanite desejada (conforme configurado por r.Nanite.MaxPixelsPerEdge).
Atualização para splines do Nanite a partir de uma versão anterior da Engine
Para projetos feitos com a Unreal Engine 5.3 e versões anteriores, os componentes de spline que usavam malhas estáticas habilitadas para o Nanite renderizavam malhas de reserva geradas a partir da malha do Nanite como malhas estáticas comuns. Como a renderização de splines com o Nanite está habilitada por padrão na Unreal Engine 5.4, essas malhas serão renderizadas como Nanite, o que pode resultar em diferenças visuais.
Para manter o comportamento anterior de renderização da malha reserva do Nanite, como a malha de spline, você pode definir r.SplineMesh.RenderNanite como 0.
Fluxos de trabalho de conteúdo híbrido não Nanite e Nanite
As seções a seguir destacam os fluxos de trabalho que você pode usar em seus projetos habilitados para a Nanite, que também precisam oferecer suporte a funcionalidades e plataformas não Nanite sem duplicar recursos.
Como importar uma malha de alta resolução para o Nanite
Você pode importar uma malha de alta resolução para ser sua representação Nanite para qualquer malha estática não Nanite existente por meio do Navegador de Conteúdo ou do Editor de Malha Estática.
No Navegador de Conteúdo, você pode usar o menu de contexto do botão direito em um ativo de malha estática para selecionar Nível de detalhe > Alta resolução > Importar alta resolução e navegar até o arquivo que deseja importar.
Como alternativa, você pode usar o Editor de Malha Estática para importar uma malha de alta resolução usando as configurações do Nanite no painel Detalhes. Clique em Importar e navegue até o arquivo que deseja importar.
Usando este fluxo de trabalho, a malha estática pré-existente e sua cadeia de nível de detalhe (LOD) tornam-se a malha reserva em vez de o processo de importação gerar automaticamente uma malha reserva a partir da geometria Nanite.
Este fluxo de trabalho respeita a configuração Desabilitar Nanite em atores de malha estática em suas cenas e é explicado mais na seção Opções de componente de malha estática abaixo.
Fluxos de trabalho de materiais
Há duas maneiras de melhorar seus fluxos de trabalho não Nanite e Nanite com materiais: usando um nó no gráfico de material para quebrar caminhos lógicos ou usando um material de substituição usado apenas para renderização com a Nanite.
Nó de alternância de etapa do Nanite
O nó de Alternância de etapa do Nanite permite que você defina um comportamento especializado em um gráfico de material quando renderizado com o Nanite.
Use a entrada Padrão ao renderizar em etapas não Nanite, para lidar com o material como seria normalmente. Use a entrada Nanite para qualquer lógica de material que você deseja simplificar ou que seja especificamente renderizada para etapas Nanite. Por exemplo, nos casos em que um material usa uma funcionalidade não compatível com a Nanite, você pode manter a mesma lógica para a entrada Padrão e usar uma lógica mais amigável para a entrada Nanite.
Material de substituição do Nanite
O espaço do Material de substituição do Nanite está disponível em Materiais e Instâncias de Materiais. Quando você define um material de substituição, qualquer malha habilitada para a Nanite que tenha o Material ou a Instância de Material atribuída usará o Material de Substituição Nanite referenciado. Isso significa que você pode criar materiais específicos para fluxos de trabalho Nanite em vez de gerenciar a lógica diretamente dentro do gráfico de material usando o nó do Interruptor de Passagem Nanite.
Em Instâncias de Material, o espaço do material de substituição do Nanite é forçosamente padronizado como None de modo que definir a substituição em um Material pai não fará com que ele seja automaticamente herdado em qualquer uma das instâncias filhas desse material.
No exemplo abaixo, o Recurso de Malha Estática para a estátua tem a Nanite habilitada e tem uma Instância de Material aplicada. A Instância de Material tem o Material de substituição do Nanite definido com algumas mudanças de cor simples para fins de demonstração. O Ator de Malha Estática à esquerda exibe o Material de Substituição Nanite, pois a malha está sendo renderizada com Nanite. O ator de malha estática à direita exibe o mesmo material até que Desabilitar Nanite seja definido no ator, desabilitando o Material de substituição do Nanite para mostrar o material de base não Nanite da Instância de Material.
Opção de componente de malha estática: Desabilitar Nanite
Você pode definir quando as malhas estáticas habilitadas para o Nanite devem usar a representação Nanite usando a configuração Desabilitar Nanite em atores de cena individuais. Isso significa que você pode ter uma mistura de atores Nanite e não Nanite que usam o mesmo Recurso de Malha Estática.
O exemplo abaixo mostra um único Recurso de Malha Estática habilitada para a Nanite, onde a esquerda é a representação da malha Nanite e a direita tem a opção Desabilitar Nanite habilitada.
Tempestade de paisagem
Você pode habilitar o Nanite em atores de paisagem. As malhas de paisagem do Nanite são recompiladas em segundo plano para não interromper o fluxo de trabalho do usuário enquanto ele estiver no editor. A paisagem do Nanite não melhora a resolução da paisagem, mas fornece ao usuário as funcionalidades de tempo de execução do Nanite, como aproveitamento de GPU, transmissão automática de geometria e LODs. Em geral, melhora o desempenho em tempo de execução, especialmente para funcionalidades com alta exigência, como VSM.
Para aprender a habilitar e usar o Nanite com sua paisagem, consulte a documentação Como usar o Nanite com paisagens.
Desempenho de conteúdo típico
Para fins de comparação, os seguintes tempos de GPU foram retirados da demonstração técnica da Unreal Engine 5 Lumen na Terra do Nanite em um PlayStation 5:
A resolução média de renderização de 1400p com aumento de amostra temporal para 4K.
~2,5 milissegundos (ms) para delimitar renderização e rasterizar todas as malhas Nanite (o que foi quase tudo nesta demonstração).
Quase toda a geometria usada foi uma malha Nanite.
Quase nenhum custo de CPU, pois é 100% baseado em GPU.
~2 ms para avaliar materiais para todas as malhas Nanite.
Custo pequeno de CPU com 1 draw call por material presente na cena.
Ao considerar esses tempos de GPU juntos, são aproximadamente 4,5 ms combinados para o que seria equivalente à pré-passagem de profundidade do Unreal Engine 4 mais a passagem de base. Isso torna a Nanite adequada para projetos de jogos visando 60 FPS.
Números como esses devem ser esperados de conteúdo que não sofre com as armadilhas de desempenho mencionadas nas seções anteriores. Contagens de instâncias muito altas e um grande número de materiais exclusivos também podem causar aumento de custos e é uma área de desenvolvimento da Nanite que está sendo trabalhada ativamente.
Tamanho dos dados
Devido ao microdetalhe que a Nanite é capaz de alcançar, pode-se supor que isso signifique um grande aumento nos dados de geometria, resultando em tamanhos de pacotes de jogos maiores e downloads para os jogadores. No entanto, a realidade não é tão terrível. Na verdade, o formato de malha do Nanite é significativamente menor do que o formato de malha estática padrão devido à codificação de malha especializada do Nanite.
Por exemplo, usando o exemplo Valley of the Ancients do Unreal Engine 5, as malhas Nanite têm uma média de 14,4 bytes por triângulo de entrada. Isso significa que uma malha do Nanite triangular média de um milhão terá aproximadamente 13,8. megabytes (MB) no disco.
Comparando uma tradicional malha com baixa contagem de polígonos mais o mapa Normal com uma malha Nanite de alta contagem de polígonos, você veria algo como:
Malha com baixa contagem de polígonos
Tamanho compactado da malha estática: 1,34 MB | Malha Nanite
Tamanho compactado da malha estática: 19,64 MB |
O tamanho do pacote compactado não é o tamanho total do ativo. Existem também texturas únicas usadas apenas por esta malha que devem ser consideradas. Muitos dos materiais usados pelas malhas têm as próprias texturas únicas compostas de diferentes texturas Normal, BaseColor, Metálico, Especular, Rugosidade e Máscara.
Este recurso específico usa apenas duas texturas (BaseColor e Normal) e, portanto, não é tão caro em espaço em disco quanto um com muitas outras texturas exclusivas. Por exemplo, observe que o tamanho da malha Nanite com aproximadamente 1,5 milhão de triângulos é menor (em 19,64 MB) do que uma textura de mapa normal de 4K.
| Tipo de textura | Tamanho de textura | Tamanho no disco |
|---|---|---|
BaseColor | 4k x 4k | 8,2 MB |
Normal | 4k x 4k | 21,85 MB |
O tamanho total do pacote compactado para esta malha e suas texturas é:
Malha com baixa contagem de polígonos: 31,04 MB
Malha com alta contagem de polígonos: 49,69 MB
Como a malha Nanite já é muito detalhada, podemos tentar substituir o mapa normal exclusivo por um detalhe de mosaico normal que é compartilhado com outros recursos. Embora isso resulte em alguma perda de qualidade neste caso, é bastante pequena e certamente muito menor do que a diferença de qualidade entre versões com alta contagem e a com baixa contagem. Portanto, uma malha do Nanite triangular de 1,5 M pode parecer melhor e ser menor do que uma malha com baixa contagem de polígonos com mapa de normais de 4K.
Tamanho total do pacote compactado para a malha e texturas habilitadas para o Nanite: 27,83 MB
Há muitos experimentos que podem ser feitos com resolução de textura e detalhamento de mapas normais, mas essa comparação específica é para demonstrar que os tamanhos dos dados das malhas Nanite não são muito diferentes dos dados com os quais os artistas já estão familiarizados.
Por último, podemos comparar a compressão Nanite com o formato Malha Estática padrão usando a alta contagem de polígonos, onde ambos são idênticos em LOD0.
Malha estática com alta contagem de polígonos
Tamanho compactado da malha estática: 148,95 MB | Malha Nanite
Tamanho compactado da malha estática: 19,64 MB |
A comparação da compressão do Nanite anterior com um tamanho de 19,64 MB é 7,6x menor que a compressão da Malha Estática padrão com 4 LODs.
A compactação Nanite e os tamanhos de dados são áreas-chave que será aprimorada em versões futuras do Unreal Engine.
Recomendações gerais sobre o tamanho de dados
Os sistemas Nanite e Textura Virtual, juntamente com SSDs rápidos, diminuíram a preocupação com orçamentos de tempo de execução de geometria e texturas. O maior gargalo agora é como entregar esses dados ao usuário.
O tamanho dos dados no disco é um fator importante ao considerar como o conteúdo é entregue –— em mídia física ou baixado pela Internet —, e a tecnologia de compactação não pode fazer muito. A largura de banda média da Internet do usuário final, os tamanhos de mídia óptica e os tamanhos de disco rígido não foram dimensionados na mesma taxa que a largura de banda do disco rígido e a latência de acesso, o poder de computação da GPU e a tecnologia de software como a Nanite. Enviar esses dados aos usuários está se mostrando um desafio.
A renderização eficiente de malhas altamente detalhadas é menos preocupante com a Nanite, mas o armazenamento dos dados em disco é agora a área principal que deve ser mantida sob controle.
Modos de visualização
A Nanite inclui vários modos de visualização para inspecionar seus dados na cena atual.
Na janela de exibição Nível, no menu suspenso Modos de Visualização, passe o mouse sobre Visualização Nanite e escolha na seleção.
A visualização Visão Geral exibe a cena renderizada no centro da imagem com visualizações Nanite selecionadas ao redor da tela para referência.
Os seguintes modos de visualização da Nanite estão disponíveis para escolha:
| Visualização Nanite | Descrição |
|---|---|
Máscara | Visualização que marca a geometria Nanite (verde) e Não Nanite (vermelha). |
Triângulos | Exibe todos os triângulos das malhas do Nanite na cena atual. |
Patches | Exibe todos os patches das malhas do Nanite na cena atual. |
Agrupamentos | Exibe representações coloridas de todos os agrupamentos de triângulos sendo renderizados na visualização da cena atual. |
Primitivas | Visualização que colore todos os componentes da mesma cor para todas as instâncias em uma Malha Estática de Instância (ISM). |
Instâncias | Visualização que aplica uma cor diferente para cada instância da cena. |
Overdraw | Exibe a quantidade de overdraw acontecendo para a geometria da cena. Todos os pixels avaliados, incluindo os pixels sem máscara, são adicionados à visualização de overdraw. Objetos menores empilhados juntos criam mais overdraw do que os maiores. |
Mapa de luz UV | Visualização que exibe as coordenadas UV das superfícies de malha Nanite. |
Avaliar WPO | Colore a geometria habilitada para Nanite que está usando o deslocamento da posição mundial (verde) versus aquelas que não estão (vermelho). |
Pixel programável | |
Tesselação | Visualização de malha do Nanite usando tesselação e quantidade de tesselação que ocorrem apenas em malhas tesseladas. |
Bins de rasterização | Exibe grupos que representam lotes de geometria. |
Bins de sombreamento |
O Nanite inclui um modo de visualização Avançado que permite opções de visualização adicionais no menu Visualização do Nanite. Essas visualizações são úteis para programadores que estão depurando ou criando perfis de vários aspectos de baixo nível do Nanite.
Habilite este modo de visualização avançada com a variável de console r.Nanite.Visualize.Advanced 1.
Variáveis e comandos do console
As seguintes estatísticas e variáveis de console estão disponíveis para uso na depuração e configuração da Nanite.
A renderização Nanite pode ser habilitada e desabilitada globalmente em tempo de execução usando a variável de console r.Nanite 0. Desabilitar Nanite é uma boa maneira de emular plataformas nas quais não há suporte.
Modos de renderização de fallback do Nanite
O Nanite fornece modos de renderização de malha de fallback para quando o Nanite está desabilitado ou não é compatível com uma plataforma. Você pode controlar qual modo é usado com a variável do console r.Nanite.ProxyRenderMode.
0 é o modo padrão e volta a renderizar malhas de fallback ou LODs baseados em espaço de tela, se definido. Isso inclui o reconhecimento de LOD mín. nas propriedades do Editor de Malha Estática (descrito na seção Malha de Fallback acima).
1 desabilita toda a renderização de malhas habilitadas para o Nanite.
2 funciona de forma semelhante ao modo 1, mas permite que a visualização Exibir > Fallback Nanite no Editor de Malha Estática renderize um Fallback Nanite.
Os modos de renderização Fallback 1 e 2 são úteis para cenas que têm muito mais instâncias do que poderiam ser suportadas sem a Nanite. Eles permitem que a cena seja aberta no editor em plataformas não compatíveis com a Nanite.
Por exemplo, no projeto de exemplo Valley of the Ancients do Unreal Engine 5, desabilitar a Nanite faria com que dezenas de milhares de draw calls regulares acontecessem, dificultando a abertura do mapa em uma plataforma sem suporte.
Comando de estatísticas do Nanite
O comando NaniteStats adiciona uma sobreposição de estatísticas de eliminação do Nanite no canto superior direito da janela de visualização.
Os argumentos de comando são usados para especificar quais estatísticas o Nanite exibe na tela. Quando nenhum argumento é fornecido, a exibição principal é usada.
Use NaniteStats List para mostrar todas as visualizações disponíveis na saída de depuração:
Principal
Mapas de Sombras Virtuais
Você também pode ver outras estatísticas disponíveis para ShadowAtlas e CubemapShadows quando disponíveis. Selecione uma visualização inserindo o comando seguido pelo nome da lista de estatísticas que deseja visualizar. Por exemplo, insira NaniteStats VirtualShadowMaps.
Para exibições que usam seleção de oclusão de duas passagens, as estatísticas são divididas em compartimentos separados para passagem principal e posterior.
Como redimensionar o tamanho do pool de transmissão do Nanite
Controle a quantidade de memória dedicada a armazenar dados de transmissão da Nanite com a variável do console r.Nanite.Streaming.StreamingPoolSize. O uso de pools maiores reduz o trabalho de E/S e descompactação ao se mover pela cena, mas ao custo de um consumo de memória maior.
Se o pool não for grande o suficiente para caber em todos os dados necessários para uma visualização, poderá ocorrer debulha de cache onde a transmissão nunca se acomoda, mesmo para uma visualização estática.
Para visualizar os dados de transmissão do Nanite, você pode usar o sinalizador de exibição de geometria de transmissão, Show > Nanite > Streaming Geometry. Quando desabilitado, as malhas do Nanite são renderizadas apenas no nível de qualidade que sempre reside na memória.
Definindo o máximo de agrupamentos em uma única passagem
Você pode especificar o número máximo de candidatos e clusters visíveis usados em uma única passagem com a variável de console r.Nanite.MaxCandidateClusters e r.Nanite.MaxVisibleClusters. Os valores deles são usados para dimensionar buffers intermediários e os valores padrão foram escolhidos para funcionar em cenários de renderização comuns.
Não há nenhum mecanismo para redimensionar dinamicamente qualquer um desses buffers ou reduzir automaticamente a qualidade no excesso, o que pode resultar na renderização de artefatos muito pequenos para a complexidade da cena e, normalmente, manifestando-se como geometria ausente ou intermitente. Quando esses tipos de artefatos ocorrem, use NaniteStats para determinar limites conservadores para candidatos e clusters visíveis. Mais especificamente, observe as estatísticas de ClustersSW e ClustersHW. O custo de memória de um cluster candidato é atualmente de 12 bytes e um cluster visível é de 16 bytes.
Essa variável de console não pode ser alterada no tempo de execução e deve ser especificada em um arquivo de configuração (.ini).