Todos os artigos
Tutoriais · 6 min read

Florestas densas sem o precipício de framerate: LODs, impostors e instancing

Como renderizar milhares de árvores a framerate, com a cadeia de LOD do mesh completo ao billboard, impostors octaédricos que aguentam de qualquer ângulo, instancing e culling, e os truques de vento e sombreamento que impedem uma floresta bakeada de parecer morta.

Spruce forest on a green alpine slope with a handful of wooden cabins below

Em resumo: uma floresta densa convincente é um combate de chefe de performance: milhares de árvores high-poly, transparência em camadas, e instâncias se estendendo até o horizonte. Você vence com uma cadeia de LOD disciplinada que termina em impostors (billboards voltados à câmera que fingem uma árvore 3D de qualquer ângulo), instancing e culling agressivos, e um par de truques de sombreamento para as árvores distantes baratas não se entregarem. Este artigo percorre a cadeia inteira do mesh completo ao billboard, o truque do impostor octaédrico, e como evitar que uma floresta muito otimizada pareça morta.

A borda de uma floresta, árvores recuando na profundidade Cada árvore aqui está a uma distância diferente da câmera, então cada árvore deveria ter um custo diferente. A arte de uma floresta barata é gastar polígonos só nas próximas e fingir o resto de forma convincente.

A ideia central: pagar por distância

Uma árvore a 5 metros e uma a 500 metros não deveriam custar o mesmo. Uma cadeia de LOD gasta detalhe completo de perto e representações progressivamente mais baratas com a distância, terminando num billboard plano, então o custo total fica plano enquanto a floresta cresce.

O jogo todo é recusar pagar preço cheio por árvores que a câmera mal resolve. De perto, uma árvore é um mesh completo com cards de folha individuais; de longe, é um punhado de pixels que uma imagem plana reproduz perfeitamente. Uma cadeia LOD (nível de detalhe) formaliza isso: várias versões da mesma árvore a custo decrescente, trocadas pelo tamanho na tela, para que uma floresta de dez mil árvores custe aproximadamente o visível em detalhe em vez da soma de cada árvore em qualidade completa. Sem ela, densidade escala seu tempo de frame linearmente para o chão; com ela, você pode empurrar a contagem de árvores muito mais alto pelo mesmo orçamento.

A cadeia LOD, passo a passo

LOD0 mesh completo com cards de folha (perto); LOD1–2 geometria reduzida e folhas simplificadas (médio); LOD3 alguns cards ou um único card; LOD final um impostor/billboard (longe). Cada passo aproximadamente divide o custo pela metade enquanto a troca permanece invisível.

Uma cadeia LOD de folhagem típica corre algo como: LOD0, o mesh de detalhe completo com todos os seus cards de folha, para árvores bem ao lado do jogador; LOD1–LOD2, geometria de tronco reduzida e menos cards de folha, maiores, para o plano médio; LOD3, um cluster de cards drasticamente simplificado; e um impostor final: essencialmente uma imagem plana: para tudo distante. O ofício está nas distâncias de transição e no blend, para que a troca não pipoque. Transições de LOD ditheradas ou em cross-fade escondem a mudança; um pop duro à distância errada é o denunciante que quebra a ilusão. Ajuste as distâncias contra sua câmera real, não padrões.

Impostors: fingir 3D de qualquer ângulo

Um impostor (impostor octaédrico) pré-renderiza a árvore de dezenas de ângulos num atlas, depois mostra a vista capturada mais próxima como um billboard. Diferente de um billboard plano, ele parece correto enquanto a câmera se move ao redor: barato, mas 3D-ish.

A ponta distante da cadeia é onde vivem as maiores economias, e o impostor é o truque engenhoso que as torna aceitáveis. Um billboard simples (uma imagem plana que se vira para a câmera) parece bem de frente mas achata e desliza de forma não natural quando você se move. Um impostor octaédrico resolve isso pré-renderizando a árvore de muitos pontos de vista arranjados em torno de uma esfera, empacotando-os num atlas de textura, e mostrando qualquer ângulo capturado que esteja mais próximo da direção atual da câmera (misturando entre os mais próximos). O resultado lê-se como uma árvore 3D real de qualquer ângulo por uma fração do custo, que é por que impostors são a espinha dorsal de florestas distantes críveis. São bakeados uma vez e custam quase nada desenhar.

Samambaias e vegetação rasteira acarpetando um chão de floresta A camada de chão multiplica a contagem de instâncias rápido. O sub-bosque precisa da mesma disciplina que as árvores: instancie-o, LOD-o, e culle-o duro: uma samambaia a 80 metros não deveria estar desenhando de jeito nenhum.

Instancing e culling

Desenhe árvores repetidas como instâncias para milhares custarem poucos draw calls, e culle agressivamente: frustum-culle o que está fora da tela e distance-culle o pequeno. O instancing conserta o custo de CPU; o culling impede que você pague pelo invisível.

Mesmo com LODs perfeitos, submeter dez mil árvores como objetos individuais enterra a CPU. O instancing colapsa todas as cópias de uma árvore num punhado de draw calls, o que é inegociável para uma floresta real, e é exatamente o que bakear um scatter para instâncias nativas da engine te dá. Além disso, culle sem piedade: o frustum culling descarta qualquer coisa fora da vista, e o distance culling remove o clutter de chão e a folhagem pequena que é minúscula demais para ser notada além de certo alcance. A grama e o sub-bosque especialmente deveriam ter distâncias de cull duras e próximas, porque multiplicam a contagem de instâncias mais rápido que as árvores. Um workflow que pinta densidade e depois bakeia em meshes instanciados (como o do Numivo) entrega à engine exatamente a forma batcheada e cullable que uma floresta densa precisa.

Mantendo viva a floresta barata

Otimização pesada pode fazer uma floresta parecer estática e morta; contrarie com vento sutil nos LODs próximos, variação de cor e escala entre instâncias, e sombreamento que impeça impostors distantes de lerem como papelão plano.

O risco de toda essa eficiência é uma floresta que roda ótimo e se sente sem vida. Três toques baratos a trazem de volta: vento: animação de vértices nos LODs próximos para que a folhagem próxima se mova, mesmo que os impostors distantes fiquem parados (ninguém percebe uma árvore estática a 300 metros). Variação: randomize escala, rotação e um tint por instância para que o olho não capte a repetição; árvores idênticas são o denunciante do copiar-colar. E cuidado de sombreamento nos impostors: bakeie a iluminação deles para que não achatem em papelão óbvio quando o ângulo do sol muda. Gaste o tempo de frame que economizou nesses detalhes de perto, onde o jogador realmente olha, e a floresta otimizada se sente tão viva quanto uma não otimizada: enquanto roda várias vezes mais rápido.

Números de campo que vale a pena roubar

  • Princípio de custo: pagar por distância: uma árvore longe não pode custar como uma perto
  • Cadeia LOD: mesh completo → reduzido → cluster de cards → impostor, cada um ~divide o custo pela metade
  • Impostor = ângulos pré-renderizados num atlas → billboard 3D-ish de qualquer vista
  • Instancie repetições (poucos draw calls) + cull-duro folhagem pequena distante
  • Mantenha viva: vento em LOD próximo + variação por instância + sombreamento de impostor bakeado

Mini-FAQ

Billboard vs impostor: qual a diferença? Um billboard é uma imagem plana que se vira para a câmera e achata quando você se move ao redor. Um impostor armazena muitos ângulos e mostra o certo, então aguenta em 3D. Para qualquer coisa que o jogador orbita ou passa, use impostors; billboards simples só servem bem para telões de fundo verdadeiramente distantes e estáticos.

Quantos níveis LOD uma árvore precisa? Comumente três a quatro mais um impostor. Mais não é automaticamente melhor: cada nível é custo de autoria e memória. Suficiente para tornar cada troca um passo pequeno e imperceptível é o alvo, não um máximo.

Nanite torna isso obsoleto? Muda o lado da geometria. Nanite lida com detalhe denso de mesh sem LODs tradicionais, mas transparência (cards de folha), disciplina de instancing e culling ainda importam, e impostors continuam úteis para a distância longe. Os princípios sobrevivem; o ferramental se desloca.

O que mata performance de floresta mais frequentemente? Overdraw de cards de folha transparentes que se sobrepõem, e folhagem de chão sem culling. Aperte os cards de folha, culle o sub-bosque perto, e instancie tudo: esse trio recupera a maior parte do orçamento antes de você sequer tocar nos meshes de árvore.

Uma floresta densa é uma das coisas mais punitivas de renderizar e uma das mais recompensadoras de acertar. Construa a cadeia LOD, deixe impostors carregarem a distância, instancie e culle sem misericórdia, e gaste suas economias em vento e variação de perto, e você terá uma floresta que se estende até o horizonte e segura seu framerate.