Radiosité, BomberFrag et captures d’écran 3D

Grmphf. Raydium ne sait faire que de l’éclairage "dynamique", au travers des capacités "de base" (lire : hors shaders) d’OpenGL. Ca à l’avantage d’être furieusement rapide, et de donner un effet bluffant dans la majorité des cas si on se débrouille bien. Mais il est évident que les lightmaps, même si j’ai beaucoup cherché à les éviter au début, deviennent de plus en plus intéressantes pour donner un cachet réaliste à une scène.
Pour rappel, une lightmap est une "carte d’éclairage", en général précalculée, que l’on applique pour moduler l’intensité lumineuse des textures de la scène. Pour réaliser ça à une vitesse intérressante, une carte vidéo doit disposer de plusieurs unités de texturage, qu’elle va utiliser en parallèle (multitexturing). Le principe est utilisé par la quasi totalité des moteurs 3D, même si ces lightmaps peuvent êtres complémentaires d’une autre technologie pour l’éclairage et la gestion des ombres (en particulier pour tout ce qui concerne l’éclairage dynamique).

Et justment, Raydium à toujours cherché à offrir un éclairage "puissant" (donc dynamique) que je n’ai jamais réussi à obtenir avec d’autres techniques (notez que je parle de mes capacités, et non de celles des autres techniques en question ;).
Ouais mais voilà, les techniques de génération de lightmaps par "Global Illumination" (principe qui consite à prendre en compte l’éclairage au sens large de la scène, en gros) commencent à donner des résultats franchement bluffants.. et c’est pour ça que je me suis penché sur un des ces algo : la radiosité.
Les résultats me scient : c’est magnifique ! Pour faire court, la radiosité consiste donc à générer des lightmaps "en placant la caméra sur chaque pixel de chaque triangle de la scène", pour compter la quantité de lumière reçue par ce point. Là ou ca tourne au génie, c’est que par défaut, tout est plongé dans le noir, sauf la (ou les) source de lumière, comme un simple point, par exemple. Seuls les "pixels" qui sont orientés vers ce point vont êtres lumineux, en fonction de l’éloignement et de l’angle. Sauf que la radiosité est récursive : on refait tout une seconde fois, en utilisant la lightmap générée à l’étape précédente … résultat, un mur qui est dos à la lumière (complétement noir après la première passe, donc) va du coup "voir" la luminosité du mur qui est face à lui, ce dernier ayant recu de la lumière à la première passe. Ce mur, qui resterait noir avec une lightmaps "classique" va donc maintenant être légérement éclairé par la lumière ambiante qu’il percoit … et on recommence comme ça des centaines de fois.

(image tirée de cette excellente documentation, à lire absolument : http://freespace.virgin.net/hugo.elias/radiosity/radiosity.htm)
Regardez bien ces ombres, douces, réalistes, …

Je vous rassure tout de suite, la méthode que j’ai décrite un peu plus haut était volontairement fausse, il est bien sûr impossible de réaliser ce calcul pour chaque point de chaque triangle… des algos sont là pour aider à cette tâche (même si elle reste très lourde à réaliser).
Précisons au passage que c’est la méthode d’éclairage principale utilisée par Half-Life 2, qui reste à mon sens une des références du moment pour le réalisme de ses éclairages.

Bref, ça fait pas mal de temps que je louche sur ce principe de radiosité. Sauf que des documents comme celui ci (http://www.owlnet.rice.edu/~comp360/lectures/RadiosityText.pdf), même s’ils sont intéressants, dépassent de beaucoup les moyens de développement dont dispose Raydium !
Je me suis donc lancé à la recherche du Graal : le code opensource d’un algo compétent et viable de génération de lightmaps par radiosité… ca a duré des dizaines d’heures, mais je l’ai eu : http://www.fluidstudios.com/rad/

C’est une énorme application, en C++, pour Windows uniquement (et du vrai … MFC, code dégeulasse style Visual C++, ..), qui ne sait travailler que sur ses formats de fichiers à elle.
Ouais, ça semble pas une bonne affaire au premier coup d’oeil, et c’est bien pour ça que je suis passé à coté au moins une dizaine de fois. Mais après 5 heures de recherches sous Google vendredi soir, je me suis résigné : c’est le seul morceau de code valable qui existe sur le net 🙂

Je vous passe les détails, mais après une lutte sans fin (la nuit de samedi à dimanche y est passée), j’ai réussi à compiler et linker l’application, et à la dompter petit à petit pour y intégrer nos propres formats de fichiers… c’est le tout début, mais les premières lightmaps de l’histoire de Raydium vont arriver sous peu, et avec la radiosité, monsieur !
Alors oui, vous allez surement trouver ça laid, mais faut pas oublier que c’est le tout début, que ca bug encore de partout, et qu’il va y’avoir des textures par dessus, et qu’une fois l’appli bien modifiée, les lightmaps vont passer de 128×128 à 512×512.
Ca donne ca, donc :

Avec encore un peu de boulot, on risque d’arriver à des choses très très sympas d’ici quelque temps.

Changement total de sujet pour aborder rapidement 2 points :

– BomberFrag : le projet avance, nous avons 2 modèles 3D de Seldaek (cf son blog), je dois envoyer une liste des sons dont nous avons besoin à G_T_O pour qu’il abuse de son talent, et j’ai enfin des idées neuves pour les problèmes (tout à fait normaux, je vous rassure) que je rencontre avec le code de l’appli : la physique du déplacement du perso, et la gestion des parties desctrucibles des niveaux au travers du réseau. Sachez aussi que Seldaek à disposé d’une version d’alpha preview 0.00001 très privée pour évaluer son boulot "ingame", et par un énorme hasard, nous a permis de découvir un sombre bug pour les version windows des applications Raydium sur certains P4 (détails ici :
http://memak.cqfd-corp.org/viewtopic.php?t=190 ).
Joignez vous.

– J’ai décidé d’implémenter dans Raydium une sorte de "capture d’écran 3D". Le principe consiste à faire une capture de la scène à un instant donné. Au lieu d’avoir un .JPG, le joueur (ou le développeur en phase de debug) disposera d’un modèle 3D de toute la scène à ce moment là (joueurs, balles, explosions, …). J’y vois un bon argument marketing en faveur de Raydium, des possibilités pour faciliter le développement des applications Raydium, et surtout une feature assez fun pour le joueur !

Désolé pour les fautes ou les explications floues, la relecture va trainer un peu, le manque de sommeil se fait sentir 🙂


Publié

dans

par

Étiquettes :

Commentaires

4 réponses à “Radiosité, BomberFrag et captures d’écran 3D”

  1. Avatar de Seldaek
    Seldaek

    Pas mal les screenshots 3D, bonne idée mais faudrait quand même penser à laisser une fonction jpeg pour les gens qui s’en foutent/qui n’ont pas d’appli 3D, a moins qu’on puisse les relancer avec raydium, ouais ça doit être ça en fait. J’imaginais un export en 3ds ou quoi mais c’est sans doute plus simple de le reloader dans raydium directement.

  2. Avatar de divide
    divide

    Originale l’idée de faire une capture 3d ! Mais attention à tout les problemes d’export que ca va sans doute generer !

  3. Avatar de Quasar
    Quasar

    super article, bravo. J’ai hâte de voir ce que ça va donner tout ça!

  4. Avatar de Judge
    Judge

    j’aime beaucoup tes articles Xfennec, continu 🙂

Laisser un commentaire