Je joue avec différentes approches pour gérer la lumière dans une scène complète.
En effet, alors qu'une scène de "démo" typique ne contient que quelques objets et une ou deux sources lumineuses, une scène tentant de représenter
un monde est volumineuse et, surtout, présente des centaines des sources lumineuses.
Quand un triangle est dessiné, les cartes graphiques limitent le nombre de lumière l'influençant à 8. Cela rejette déjà la possibilité de simplement stocker en mémoire graphique l'ensemble des lumières et dessiner le monde en en tenant compte.
Ensuite, quand un objet composé de milliers de triangles est dessiné à l'écran, on veut à tout prix éviter de devoir modifier l'état de la carte graphique pour chaque triangle. on désire encore plus éviter de faire transiter des informations sur le bus pour chaque triangle. Impossible donc d'envoyer un triangle à la fois avec ses lumières...
Il faut donc organiser notre scène. Le problème est qu'alors que l'on peut définir un sous ensemble de lumières affectant un objet, on ne peut pas nécessairement en fixer le nombre.
Une solution classique consiste donc à dessiner N fois le triangle (si il est éclairé par N lumières) et combiner les images produites pour afficher le résultat final.
C'est cette technique qui est employée par DOOM 3 (idtech 4). Le problème c'est qu'avec cette technique, on doit passer la scène en revue plusieurs fois pour la dessiner.
95% des jeux vidéos, autres que doom3, utilisent ce que l'on appelle des "lightmaps". C'est à dire que le décor n'est pas affecté par la lumière, mais nos le fait croire en précalculant les intensités lumineuses de chaque triangle du monde. Ils n'utilisent réellement les lumières que pour dessiner les objets dynamiques tels que les acteurs.
Uen technique assez peu répandue, mais qui semble intéressante est le deffered shading (je n'en suis pas l'inventeur !). Cela consiste en la production de plusieurs images, contenant des informations nécessaires aux calculs des éclairages.
La scène est donc parcourue une seule fois et ces images sont produites (typiquement 4).
Une fois ces images générées, appliquer une lumière sur la prise de vue ne nécessite que le dessin d'un rectangle en 2D sur l'image résultante. tous les pixels de ce rectangle vont lire les 4 images produites, pour calculer l'éclairage qu'ils devraient avoir reçus si la lumière avait été présente dans la phase de dessin de la scène. Cela permet d'avoir énormément de sources lumineuses tout en conservant un parcours unique sur la scène.
Cela semble bien en théorie mais il faut une carte graphique très costaude pour générer les images initiales.
J'ai écrit un module de rendu que j'ai ajouté à IE pour gérer cette technique. Les résultats sont assez satisfaisants, bien que tout de même lents. Mais il faut bien se rendre compte que TOUTES les lumières sont 100% dynamiques, elles peuvent changer de forme, de couleur, de position, de nature... etc. Ce que l'on ne voit JAMAIS dans des applications temps réel.