Tutti gli articoli
Tutorial · 6 min read

Foreste dense senza il precipizio del framerate: LOD, impostor e instancing

Come renderizzare migliaia di alberi a framerate, con la catena LOD dal mesh completo al billboard, gli impostor ottaedrici che tengono da qualsiasi angolo, instancing e culling, e i trucchi di vento e shading che impediscono a una foresta baked di sembrare morta.

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

Una foresta densa convincente è una boss fight di performance: migliaia di alberi high-poly, trasparenza a strati, e istanze che si estendono fino all'orizzonte. La vinci con una catena LOD disciplinata che termina in impostor (billboard rivolti alla camera che simulano un albero 3D da qualsiasi angolo), instancing e culling aggressivi, e un paio di trucchi di shading così che gli alberi lontani economici non si tradiscano. Questo articolo percorre l'intera catena dal mesh completo al billboard, il trucco dell'impostor ottaedrico, e come impedire a una foresta pesantemente ottimizzata di sembrare morta.

Il margine di una foresta, alberi che si ritirano in profondità Ogni albero qui è a una distanza diversa dalla camera, quindi ogni albero dovrebbe essere a un costo diverso. L'arte di una foresta economica è spendere poligoni solo su quelli vicini e simulare il resto in modo convincente.

L'idea centrale: pagare per distanza

Un albero a 5 metri e uno a 500 metri non dovrebbero costare uguale. Una catena LOD spende dettaglio completo da vicino e rappresentazioni progressivamente più economiche con la distanza, terminando in un billboard piatto, così il costo totale rimane piatto mentre la foresta cresce.

Il gioco intero è rifiutarsi di pagare prezzo pieno per alberi che la camera risolve appena. Da vicino, un albero è un mesh completo con card di foglie individuali; da lontano, è una manciata di pixel che un'immagine piatta riproduce perfettamente. Una catena LOD (level-of-detail) formalizza questo: diverse versioni dello stesso albero a costo decrescente, scambiate per dimensione a schermo, così una foresta di diecimila alberi costa approssimativamente ciò che è visibile in dettaglio invece della somma di ogni albero a qualità piena. Senza di essa, la densità scala il tuo tempo di frame linearmente nel terreno; con essa, puoi spingere il conteggio degli alberi molto più in alto per lo stesso budget.

La catena LOD, passo per passo

LOD0 mesh completo con card di foglie (vicino); LOD1–2 geometria ridotta e foglie semplificate (medio); LOD3 poche card o una singola card; LOD finale un impostor/billboard (lontano). Ogni passo dimezza approssimativamente il costo mentre lo scambio rimane invisibile.

Una catena LOD di fogliame tipica va più o meno così: LOD0, il mesh a dettaglio completo con tutte le sue card di foglie, per gli alberi proprio accanto al giocatore; LOD1–LOD2, geometria del tronco ridotta e meno card di foglie, più grandi, per il piano medio; LOD3, un cluster di card drasticamente semplificato; e un impostor finale (essenzialmente un'immagine piatta) per tutto ciò che è distante. Il mestiere è nelle distanze di transizione e nel blend, così lo scambio non fa pop. Le transizioni LOD ditherate o cross-faded nascondono il cambio; un pop duro alla distanza sbagliata è il segno che rompe l'illusione. Regola le distanze contro la tua camera reale, non i default.

Impostor: simulare 3D da qualsiasi angolo

Un impostor (impostor ottaedrico) pre-renderizza l'albero da decine di angoli in un atlas, poi mostra la vista catturata più vicina come un billboard. A differenza di un billboard piatto, sembra corretto mentre la camera si muove intorno, economico ma 3D-ish.

L'estremità lontana della catena è dove vivono i risparmi più grandi, e l'impostor è il trucco ingegnoso che li rende accettabili. Un billboard semplice (un'immagine piatta che si gira per fronteggiare la camera) sembra bene di fronte ma si appiattisce e slitta in modo innaturale mentre ti muovi. Un impostor ottaedrico risolve questo pre-renderizzando l'albero da molti punti di vista disposti attorno a una sfera, impacchettandoli in un atlas di texture, e mostrando qualunque angolo catturato sia più vicino alla direzione corrente della camera (mescolando tra i pochi più vicini). Il risultato si legge come un vero albero 3D da qualsiasi angolo a una frazione del costo, che è perché gli impostor sono la spina dorsale delle foreste distanti credibili. Sono baked una volta e costano quasi nulla da disegnare.

Felci e sottobosco basso che tappezzano il suolo di una foresta Lo strato del suolo moltiplica velocemente il conteggio delle istanze. Il sottobosco ha bisogno della stessa disciplina degli alberi: istanzialo, LOD-alo, e culla-lo duro; una felce a 80 metri non dovrebbe disegnare affatto.

Instancing e culling

Disegna alberi ripetuti come istanze così migliaia costano pochi draw call, e culla aggressivamente: frustum-culla ciò che è fuori schermo e distance-culla la roba piccola. L'instancing aggiusta il costo CPU; il culling ti impedisce di pagare per l'invisibile.

Anche con LOD perfetti, inviare diecimila alberi come oggetti individuali seppellisce la CPU. L'instancing collassa tutte le copie di un albero in una manciata di draw call, che non è negoziabile per una vera foresta, ed è esattamente ciò che ti dà bakare uno scatter in istanze native del motore. In cima a questo, culla senza pietà: il frustum culling scarta qualunque cosa fuori dalla vista, e il distance culling rimuove il clutter del suolo e il piccolo fogliame che è troppo minuscolo per essere notato oltre un certo range. Erba e sottobosco specialmente dovrebbero avere distanze di cull dure e ravvicinate, perché moltiplicano il conteggio delle istanze più velocemente degli alberi. Un workflow che dipinge densità e poi bakea in mesh istanziati (come quello di Numivo) consegna al motore esattamente la forma batchata e cullable che una foresta densa richiede.

Mantenere viva la foresta economica

Un'ottimizzazione pesante può far sembrare una foresta statica e morta: contrasta con vento sottile sui LOD vicini, variazione di colore e scala tra istanze, e shading che impedisca agli impostor distanti di leggere come cartone piatto.

Il rischio di tutta questa efficienza è una foresta che gira alla grande e si sente senza vita. Tre tocchi economici la riportano indietro: vento, animazione di vertici sui LOD vicini così che il fogliame vicino si muova, anche se gli impostor distanti restano fermi (nessuno nota un albero statico a 300 metri). Variazione: randomizza scala, rotazione e un tinta per istanza così l'occhio non coglie la ripetizione; alberi identici sono il segno del copia-incolla. E cura dello shading sugli impostor: bakea la loro illuminazione così che non si appiattiscano in cartone ovvio quando cambia l'angolo del sole. Spendi il tempo di frame che hai risparmiato su questi dettagli da vicino, dove il giocatore guarda davvero, e la foresta ottimizzata si sente ugualmente viva come una non ottimizzata, mentre gira diverse volte più veloce.

Numeri di campo che vale la pena rubare

  • Principio di costo: pagare per distanza; un albero lontano non deve costare come uno vicino
  • Catena LOD: mesh completo → ridotto → cluster di card → impostor, ognuno ~dimezza il costo
  • Impostor = angoli pre-renderizzati in un atlas → billboard 3D-ish da qualsiasi vista
  • Istanzia ripetizioni (pochi draw call) + culla duro piccolo fogliame distante
  • Mantienila viva: vento su LOD vicino + variazione per istanza + shading di impostor baked

Mini-FAQ

Billboard vs impostor: qual è la differenza? Un billboard è un'immagine piatta che si volge a fronteggiare la camera e si appiattisce mentre ti muovi intorno. Un impostor immagazzina molti angoli e mostra quello giusto, così tiene in 3D. Per qualunque cosa il giocatore orbiti o superi, usa impostor; i billboard semplici vanno bene solo per fondali veramente distanti e statici.

Di quanti livelli LOD ha bisogno un albero? Comunemente da tre a quattro più un impostor. Di più non è automaticamente meglio: ogni livello è costo di authoring e memoria. Abbastanza per rendere ogni scambio un piccolo passo impercettibile è il target, non un massimo.

Nanite rende questo obsoleto? Cambia il lato della geometria (Nanite gestisce dettaglio denso del mesh senza LOD tradizionali), ma la trasparenza (card di foglie), la disciplina di instancing e il culling contano ancora, e gli impostor rimangono utili per la distanza lontana. I principi sopravvivono; il tooling si sposta.

Cosa uccide la performance della foresta più spesso? Overdraw da card di foglie trasparenti che si sovrappongono, e fogliame del suolo non cullato. Stringi le card di foglie, culla il sottobosco vicino, e istanzia tutto: quel trio recupera la maggior parte del budget prima ancora che tocchi i mesh degli alberi.

Una foresta densa è una delle cose più punitive da renderizzare e una delle più gratificanti da azzeccare. Costruisci la catena LOD, lascia che gli impostor portino la distanza, istanzia e culla senza pietà, e spendi i tuoi risparmi in vento e variazione da vicino, e avrai una foresta che si estende fino all'orizzonte e mantiene il suo framerate.