InExtremis

Projet de programmation. Librairie 3D - TEMPS REEL - utilisant OpenGL et GLSL écrite avec le langage C++. Cette librairie représente mes études dans le domaine de la 3D temps réel et n'a pas d'autres ambitions pour l'instant. Ce travail est réalisé comme travail de fin d'études pour le département d'algorithmique de l'Université de Liège.

4.7.08

Que la lumière soit (en retard) !

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.

4 commentaires:

À 18:57 , Blogger Adrien a dit...

Salut,

Super intéressant le site!
Je ne sais pas si tu te souviens de moi mais je suis l'élève à qui tu avais montré le moteur 3D en fin de cours d'ingénierie du logiciel...

D'après ce que j'ai entendu, il semblerait que l'id tech 4 ne gèrent pas dynamiquement les effets d'ombre sur les personnages (contrairement à d'autre jeux un peu plus récents, le premier jeu étant "les Chroniques de Riddick")... Est-ce le cas sur ton implémentation?

 
À 17:53 , Blogger PypeBros a dit...

bon, je suis pas ultra-calé en implémentation de moteur 3D (plutôt n00b, même), mais j'avais l'impression qu'à moins d'avoir des scènes particulièrement tordues, les 8 sources lumineuses les plus proches auraient eu suffisamment d'impact sur un objet pour qu'on puisse considérer les autres comme négligeables.

 
À 14:51 , Blogger JFD a dit...

@adrien: sisi, id tech 4 gère très bien les ombres dynamiques, ce n'est simplement pas activé dans les jeux l'utilisant...

mais, oui, l'éclairage est ici 100% dynamique (et 100% par pixel, ce qui n'est pas le cas de id tech4), mais bon à l'utilisation, c'est pas toujours absolument nécessaire, disons que c'est très satisfaisant de savoir que ce n'est pas "de la triche" d'une certaine manière

 
À 14:54 , Blogger JFD a dit...

@sylvain :

en fait, comme je l'ai dit, on a même 8 lumières par triangle, ce qui est plus que très suffisant.

Le problème est en amont. Quand tu dois éclairer un objet arbitraire dans une scène et que les lumières sont aussi dynamiques que les objets, il devient difficile de savoir quelles lumières sont plus influençantes sur ton objet en temps réel.

Des solutions existent bien entendu, mais c'est toujours un peu problématique

ici, ce qui est joli c'est qu'on ne s'en tracasse plus vraiment, puisque l'éclairage n'est plus qu'une sorte de "filtre" 2D en post traitement (grosso-modo)

 

Enregistrer un commentaire

Abonnement Publier les commentaires [Atom]

<< Accueil