Afolhagem do Nanite é um conjunto de sistemas integrais que usam a renderização de geometria virtualizada do Nanite para obter uma folhagem densa e altamente detalhada em escala. A folhagem do Nanite utiliza técnicas antigas e novas para renderizar mundos abertos com grandes vistas abertas com maior qualidade e por uma fração dos custos originais de quadro , com instanciação, malhas revestidas, voxelização, animação e características de material. Quando combinados, isso permite que mundos mais robustos sejam imaginados com folhagens realistas e animadas.
Para entender os objetivos da Folhagem do Nanite e para onde ela está indo, é importante entender que o que funcionou no passado não é eficiente para o futuro na criação desses tipos de mundos totalmente realizados.
Vejamos algumas maneiras em que o "modo antigo" de desenvolver folhagem não funciona bem para a Folhagem do Nanite:
Alfa Mascaramento | Representação de triângulos 100% Nanite | Material de Deslocamento da Posição do Mundo (WPO) |
Mascaramento alfa: o Nanite não funciona bem com ele, pois introduz muitos overdraw , além de ter que executar uma função de máscara que pode custar caro. O uso do mascaramento alfa também significa que a folhagem continuaria a ser renderizada como cards planos, em vez da complexidade geométrica que é capaz.
"Full Nanite Triangle Representation: causaria remoção de agrupamento abaixo do ideal e simplificação ruim à distância." Além disso, cada tipo de folhagem precisaria de muito espaço em disco para ser armazenado.
World Position Offset (WPO): O uso de WPO em um material para mover folhas e galhos de folhagem tem sido uma maneira de simular o vento. Isso não é uma boa opção para o que o Nanite pode renderizar, pois adiciona cálculos por vértice e força limites de agrupamento abaixo do ideal. Não há como saber como um material moverá um vértice, o que significa que os cálculos devem ser mais conservadores.
Agora que você tem uma ideia do que não vai funcionar bem, vamos dar uma olhada o pipeline de folhagem do Nanite para renderizar árvores modeladas completas, incluindo folhas e folhas individuais. Ele precisa ser redimensionado para grandes mundos abertos e, ao mesmo tempo, ser eficiente em memória , ter bom desempenho e ser altamente dinâmico, sem a necessidade de malhas de níveis de detalhe (LOD).
Para fazer isso, a Folhagem do Nanite é composta de três sistemas:
Montagens do Nanite são as "partes" que se tornam instâncias altamente detalhadas em uma porção de folhagem. Isso pode reduzir significativamente o tamanho da memória e do disco .
Os Voxels do Nanite são voxels agregados com tamanho aproximado de um pixel que preservam os detalhes do triângulo, a animação e as propriedades do material com base na distância da câmera. Os triângulos mudam perfeitamente para voxels para resolver o problema de renderização de malhas de triângulo agregadas densas e dinâmico . Esses voxels são imperceptíveis aos olhos por causa de seu tamanho na tela.
O Revestimento do Nanite define como a folhagem se comporta dinamicamente com sistemas, como o vento, onde o vento é simulado por meio de uma hierarquia de ossos. Por não usar WPO para simular animação de vento, a Folhagem do Nanite pode usar limites de agrupamento otimizados.
No exemplo a seguir, veja como tudo isso funciona em conjunto. Conforme a câmera dá um zoom nos detalhes, você pode ver o quão densa e detalhada é a árvore, com suas folhas individuais de pinheiro. À medida que a câmera se afasta, os agrupamentos do Nanite ficam pequenos o suficiente para fazer a transição perfeita para voxels. Isso permite que as árvores mantenham sua aparência volumétrica à distância sem recorrer a outdoors ou LODs à distância.
Com esta árvore, temos o seguinte:
41 milhões de triângulos
12 partes de montagem exclusivas
2160 instâncias de peça de montagem
850 ossos esqueléticos
Habilitando a Folhagem do Nanite
Para habilitar a Folhagem do Nanite em seu projeto, vá até "Configurações de Projeto" > "Rendering" e marque a caixa "Folhagem do Nanite". Você precisará reiniciar o editor para que as alterações entrem em vigor.
Conjuntos do Nanite
As Montagens do Nanite são um componente-chave da Folhagem do Nanite e são projetadas para lidar com eficiência com a renderização de geometria complexa e repetível, como galhos e folhagens de uma árvore. As montagens funcionam com ativos de malha estático e do esqueleto, permitindo a microinstanciação de peças pequenas e altamente detalhadas. Elas podem conter até 65 mil instâncias de outras malhas. Essas instâncias são chamadas de "partes" do conjunto. Essa abordagem economiza uma quantidade significativa de espaço em disco e espaço de transmissão , com uma pequena perda de desempenho durante a remoção de agrupamento .
As montagens do Nanite funcionam ao codificar os agrupamentos das malhas das peças na hierarquia da malha final sem duplicar a geometria das peças durante o tempo de compilação. No tempo de execução, o Nanite gerencia as instâncias de parte calculando a transformar final sob demanda durante a oclusão de agrupamento conforme ele desce na hierarquia.
Em plataformas que não são Nanite, os triângulos das partes são transformados e combinados em uma única malha. A partir daí, é possível gerar uma malha reserva que funciona da mesma forma que as malhas reserva normais do Nanite .
As montagens são uma parte essencial da Folhagem do Nanite. Sem eles, não haveria espaço em disco suficiente ou memória de streaming para renderizar uma floresta de um mundo grande, como a mostrada na demonstração técnica do Unreal Fest The Witcher 4. Por exemplo, o espaço em disco UASSET da maior árvore na demonstração passou de ser 3,5 gigabytes (Gb) para cerca de 29 megabytes (Mb). Medimos que a memória de transmissão de apenas uma das árvores em uma visualização específica caiu de aproximadamente 36 MB para cerca de 2,7 MB. Esse tipo de economia possibilita a renderização de 500 mil instâncias de dezenas de variantes de árvores em uma cena, com cada árvore sendo altamente detalhada e tendo entre um e 10 milhões de polígonos cada.
Para obter mais informações sobre como usar e criar montagens na Unreal Engine, confira Montagem do Nanite.
Voxels do Nanite
Voxels do Nanite são voxels com tamanho aproximado de um pixel que preservam os detalhes, a animação e as propriedades dos materiais da geometria que representam, além de preservar a aparência volumétrica das coisas, como as folhas das árvores. As técnicas anteriores do Nanite para evitar que as folhas perdessem a forma à distância funcionaram bem ao adicionar de volta uma área de superfície aos triângulos sobreviventes quando o processo de simplificação os eliminaria. Foi uma mitigação da geometria da folhagem que se tornava esparsa ao renderizar agrupamentos simplificados à distância.
Processo de Rasterização
Os Voxel do Nanite podem preservar a silhueta geral da geometria agregada (peças desconectadas) durante a simplificação à distância. Ao simplificar agrupamentos dessas malhas habilitadas para voxel, o Nanite Builder as voxeliza em agrupamentos de até 128 tijolos de voxel 4x4x4. O erro de simplificação da representação de voxel é o fator decisivo para definir se a simplificação substitui os triângulos por voxels. Ela mudará para voxels se isso resultar em um erro menor do que o uso de triângulos.
No tempo de execução, os agrupamentos de voxel são categorizados separadamente dos agrupamentos de triângulo e rasterizados com uma permutação de shader especial. Os agrupamentos são classificados em baldes de profundidade e rasterizados da frente para trás para obter alguns benefícios do teste Z inicial. O resultado final geralmente é melhor na distância do que nos triângulos rasterizados.
Veja abaixo alguns exemplos do processo de voxelização visualizado em um ativo independente e na demonstração técnica de The Witcher 4.
Processo de sombreamento
Muitas superfícies com normais diferentes podem estar contidas na região coberta por um único voxel. Então, em vez de armazenar um único normal por voxel, é armazenada uma distribuição de normais. Esse conceito é semelhante ao modo como a rugosidade do material controla a distribuição das microfacetas usadas para sombreamento.
Ao gravar no GBuffer, uma normal é escolhida estocasticamente por pixel dessa distribuição. Em uma versão futura, a distribuição será considerada diretamente no sombreamento, como a rugosidade. Isso reduzirá o ruído e já estava em uso na demo de Witcher 4.
Isso exige dados adicionais para armazenar as estatísticas da distribuição. No momento, ela está armazenada no canal alfa de cor do vértice . Ou seja, ela vai sobrepor o que estiver lá. Isso pode passar a separar dados independentemente da cor do vértice no futuro.
Habilitando Voxels do Nanite
Para habilitar a voxelização do Nanite :
No painel "Details"de uma Malha Estática, procure na categoria "Nanite Settings".
Encontre “Shape Preservation” e use o menu suspenso para selecionar “Voxelize”.
Algumas propriedades abaixo desse menu suspenso ficam disponíveis para edição quando Voxelize está definido. Eles não são feitos para a maioria dos usuários ajustarem seus projetos. Alguns ainda estão em desenvolvimento e ainda não funcionam como esperado. É provável que essas configurações mudem ou sejam removidas em versões futuras da Unreal Engine à medida que a Folhagem do Nanite amadurecer.
Uso do Revestimento do Nanite para animação de Folhagem do Nanite
Quando se trata de animação de folhagem em jogos, grande parte dela é feita usando deslocamento de posição de mundo (WPO) no material, geralmente para os materiais usados para galhos e folhas de árvores. Como o WPO de um determinado vértice pode ser qualquer deslocamento arbitrário, os artistas precisam definir o Deslocamento Máximo de WPO em qualquer material para o pior caso, a fim de ajudar a ajustar os limites de culling para uma oclusão adequada desses ativos de folhagem. No entanto, isso pode resultar em limites muito conservadores que contribuem para um alto custo de overdraw .
Como o WPO também altera a lógica do shader de vértice , cada material é categorizado em expedidores separados, o que tem custos associado à GPU . Em muitos materiais, essas caixas de rasterização programáveis podem ser um problema de desempenho .
O Revestimento do Nanite resolve isso porque é possível calcular limites mais precisos a partir de matrizes de revestimento e tudo pode usar o rasterizador de função fixo.
Esta tomada a seguir mostra a atualização de cem mil ossos, que leva cerca de 0,1 milissegundo na GPU, tornando a Folhagem do Nanite muito rápida e dimensionável. A animação deixa de ser aplicada automaticamente em árvores abaixo de um determinado tamanho de tela , e o vento pode afetar árvores muito distantes para uma melhor imersão. Isso também se aplica a grama e arbustos que usam malhas do esqueleto.
Plugin Vento Dinâmico
Este plugin é experimental.
O plugin Vento dinâmico foi projetado para funcionar com a Folhagem do Nanite. Ela exige uma configuração adicional usando um ativo "Vento dinâmico Skeletal Data" para uma malha do esqueleto específica. Os dados nesse ativo classificam os ossos do esqueleto em grupos de simulação que ajudam o sistema a identificar de forma lógica as cadeias de ossos na simulação, além de permitir que você ajuste a influência do vento por grupo.
Você pode habilitar o plugin no navegador Plugins , na categoria Rendering .
O plugin fornece uma ação de ativo com código para importar os dados necessários de um arquivo .JSON. Ele também inclui um esquema de descrição da cena universal (USD) que pode ser aplicado a um esqueleto para fornecer esses dados, além de um código Python de exemplo para criar um arquivo JSON a partir do USD.
Dados do provedor de transformação de vento dinâmico
As malhas do esqueleto que contêm dados do usuário de um ativo de Vento dinâmico podem usar esses dados para gerar uma animação de vento em um Componente de malha revestida instanciada.
Para habilitar o vento em uma malha revestida, use o menu suspenso "Transform Provider" no componente para selecionar "Transform Provider Data". Isso cria um ativo de Vento dinâmico Data para a malha.
Esse ativo é necessário para registrar o componente no sistema de ventos . Ele não serve para nenhum outro propósito (no momento).
As limitações atuais são:
Adição de simulações com base na mais , como campo próximo.
Só tem suporte para a direção global do vento.
Sem colisão com jogadores ou objetos.
Os dados de esqueleto de Vento dinâmico devem ser importados com um arquivo JSON.
O trabalho futuro inclui a importação automática de USD.
Adicionar ajustes nos dados do provedor de Vento dinâmico.
Dicas de desempenho para o Revestimento do Nanite
Embora o Revestimento do Nanite funcione melhor do que o WPO para o movimento do vento da folhagem, é necessário prestar atenção no desempenho.
Lembre-se destas áreas:
O desempenho em Mapas de Sombras Virtuais (VSM) exige que você desabilite a animação à distância.
As malhas instanciadas desabilitado mudam para um bin de rasterização sem revestimento e renderizam como uma malha estático de função fixo (em pose vinculada).
Use "Animation Min Screen Size" no componente para desabilitar revestimento quando o objeto for pequeno na tela.
É semelhante à configuração "mundo Position Offset Disable Distance", mas está sempre ativa. Se deixado em 0, o valor padrão global será usado, que é 1/10 (0,1) do tamanho da tela do objeto quando a animação for interrompida. Para mudar isso, use o comando do console
"r.Skinning.DefaultAnimationMinScreenSize".