Luce in un mondo voxel: luci reali o flood fill?
Un giocatore piazza una lampada luminosa nella sua base. Cosa succede tecnicamente? Questa domanda innocente ha innescato per noi una decisione fondamentale, e la risposta è un bell'esempio di come la soluzione «più moderna» non sia sempre la migliore.
Opzione A: luci reali di Unity. Ogni blocco luminoso diventa una sorgente di luce puntiforme e il motore calcola tutto. Sembra magnifico, ma non scala. Un mondo voxel può avere centinaia di blocchi luminosi in vista; luci puntiformi in tempo reale in quella quantità fanno sudare qualsiasi GPU, a maggior ragione nella versione browser.
Opzione B: luce flood fill. Il classico del genere: la luce è un valore numerico per blocco che si diffonde dalla sorgente e cala a ogni passo. Costa pochissimo, qualsiasi numero di sorgenti, ma il risultato sembra piatto, perché la luce non ha direzione. Un muro accanto alla lampada è luminoso quanto la superficie sotto di essa.
La nostra scelta: flood fill con direzione. Siamo rimasti sull'approccio flood fill, ma gli abbiamo insegnato l'informazione direzionale: la luce sa da che direzione arriva e le superfici vengono illuminate di conseguenza in modo diverso. Il risultato viene cotto nella mesh del chunk durante il meshing: a runtime costa praticamente niente, ma appare nettamente più tridimensionale della classica luce a blocchi.
La lezione che ne abbiamo tratto ci accompagna ovunque da allora: prima chiediti qual è il vero problema del genere (qui: moltissime sorgenti, geometria statica), poi scegli la tecnologia. Le luci reali risolvevano un problema che non avevamo, e ne avrebbero creato uno che non sappiamo risolvere.
Commenti