La lumière dans un monde voxel : vraies lumières ou flood fill ?
Un joueur pose une lampe dans sa base. Que se passe-t-il techniquement ? Cette question innocente a déclenché chez nous une décision de fond — et la réponse est un bel exemple du fait que la solution « plus moderne » n'est pas toujours la meilleure.
Option A : de vraies lumières Unity. Chaque bloc lumineux devient une source de lumière ponctuelle, et le moteur calcule tout. C'est superbe — mais ça ne passe pas à l'échelle. Un monde voxel peut avoir des centaines de blocs lumineux dans le champ de vision ; des lumières ponctuelles en temps réel en telle quantité font transpirer n'importe quel GPU, et encore plus dans la version navigateur.
Option B : la lumière par flood fill. Le grand classique du genre : la lumière est une valeur numérique par bloc, qui se propage depuis la source et diminue à chaque pas. Ça ne coûte presque rien, autant de sources qu'on veut — mais le résultat paraît plat, parce que la lumière n'a pas de direction. Un mur à côté de la lampe est aussi clair que la surface en dessous.
Notre choix : un flood fill avec direction. On est restés sur l'approche flood fill, mais on lui a appris la notion de direction : la lumière sait d'où elle vient, et les surfaces sont éclairées différemment en conséquence. Le résultat est intégré au mesh du chunk lors du meshing — à l'exécution, ça ne coûte pratiquement rien, mais le rendu a nettement plus de relief que la lumière de blocs classique.
Depuis, on applique cette leçon partout : d'abord se demander quel est vraiment le problème du genre (ici : énormément de sources, une géométrie statique), ensuite choisir la technique. De vraies lumières résolvaient un problème qu'on n'avait pas — et en auraient créé un qu'on ne sait pas résoudre.
Commentaires