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.

25.2.06

Environnements cubiques : reflets

Pour corriger tous les problèmes des reflets précédents (spherical envmap), mon système IE gère les cubemaps. C'est en fait un ensemble de six vues prises dans les trois directions (XYZ) en positif et négatif (en avant et en arrière pour chaque axe, en quelque sorte). Ce qui revient à composer un environnement cubique. C'est beaucoup plus lourd au niveau des textures (ça en consomme quand même 6 au lieu d'une -- au niveau quantité de mémoire, pas au niveau des slots dans la vga, ça tient quand même en une seule entrée ogl) mais quelle différence au niveau de la qualité des images! Ensuite, et c'est probablement tout aussi important, c'est un relfet correct, en ce qui concerne la localisation spatiale en un point (infiniment petit). Ca n'est donc plus limité à une prise de vue, on peut se balader librement autour de l'objet réfléchissant sans observer ni erreurs, ni artefacts, ni déformations.

Ici, je montre l'effet sur le poisson, et sur le même poisson qui utilise sa texture de bump... Puisque bien sûr tout se combine aisément.

24.2.06

Reflets


Le système permet de définir des reflets statiques (entendre par là qu'ils ne sont pas le reflet d'objets de la scène, mais d'une autre scène statique, via une photographie). Le premier système géré est l'utilisation d'une image particulière qui reprend un peu plus qu'une demi-sphère de reflets, mais avec de sévères déformations comme on peut le constater. Cette image sert de référence comme source de couleur. Quand on doit déterminer quelle couleur prend un pixel d'une surface (et qu'elle est une surface réfléchissante), on calcule le vecteur reflet du vecteur de vision à la surface de l'objet (en considérant en fait la normale locale calculée en chaque point par interpolation). Cette opération a pour effet de définir un nouveau vecteur, ce vecteur est alors transformé en un second vecteur de dimension inférieuse (2D) afin de pouvoir faire correspondre chaque direction de l'espace (en fait quasi un demi-espace) avec un pixel de l'image de référence, et ce de manière cohérente.

Cette méthode fonctionne très bien, mais montre très vite ses limites. En effet, de par le fait que l'image de référence est unique et ne représente qu'un quasi demi-espace, l'espace pouvant être réfléchi est particulier à un angle de vue particulier, et les reflets ne sont donc pas satisfaisants si on se déplace. De plus (mais là c'est un problème avec mon implémentation de cette méthode) j'observe quelques artefects (défauts dans les images produites) assez embêtants.

On utilisera donc cette méthode pour générer des reflets rapidement mais à des endroits où, paradoxalement, on ne les regardera pas trop en détail.

Importeur de formats externes


J'ai réalisé un importeur de formats de données externes et je peux ainsi utiliser tout ce qui sort de 3DS MAX (ou sa précédente version gratuite GMAX), et même du jeu DOOM III. L'avantage des modèles de DOOM III est qu'ils sont parfaits pour illustrer le fonctionnement de la librairie à pleine puissance. Le gros désavantage, est que ces modèles sont absolument affreux ! Les monstres et les détails sanguinolants, ne sont pas à proprement parler présentables dans un cadre sérieux.

Juste une remarque, pour information, je ne diffuse pas de modèles de DOOM III, car ils sont protégés par les droits d'auteur. Je ne compte en faire rien d'autre que de tester mon application avec.

Textures de bump

IE gère également les texture particulières servant à faire apparaitre la géométrie de l'objet comme plus complexe. On appelle ces textures particulières des textures de bump ou Bumpmaps en anglais. A nouveau tout ici est écrit en GLSL, et le système employé pour un maximum de rapidité est le précalcul d'espace tangeant. Les résultats sont visuellement satisfaisants. La texture utilisée est en fait une height map (niveau de gris symbolisant une hauteur) transformée en normal map par précalculs.

Textures


Bien entendu le système est capable d'appliquer des textures aux modèles. Je pense que ce n'est pas très intéressant en soit de le signaler, si ce n'est qu'ici tout est géré via des shaders spécifiques en GLSL, je le rappelle. La texture peut être considérée comme une image que l'on applique telle une peau sur la surface d'un objet pour lui donner plus d'une seule couleur.

Reflets spéculaires


Les matériaux peuvent être perçus comme des matières plastiques (ce n'est pas obligatoire, le tout est hautement paramétrable) et afficher des reflets que l'on appelle reflets spéculaires. L'exemple toujours cité est celui d'une boule de billard. C'est l'exemple même du matériau qui diffuse les rayons lumineux (il a donc une couleur propre), mais qui devient réfléchissant dans une direction précise (on y voit donc la couleur de la source de lumière). Je passe les détails mais c'est géré.

Eclairage multiple


IE est basé sur un système de calcul d'éclairage en temps réel en une seule passe. C'est-à-dire que la scène n'est parcourue qu'une seule fois par image pour calculer tous les points de l'image finale. Cette carractéristique ne serait pas facile à réaliser sans l'utilisation de shaders. Je me suis imposé depuis le départ de conserver un modèle d'éclairage exact, par pixel. C'est-à-dire qu'il n'est pas question ici de réaliser des approximations comme on en voit encore dans beaucoup de rendus 3D temps réel (jeux). Il n'y a biensûr rien de révolutionnaire non plus dans mon approche, j'ai simplement tenu à ne pas particulariser trop mon système à un usage précis.

On voit ici un poisson éclairé par 2 sources lumineuses, on pourrait en utiliser plus (le matériel informatique nous limite à 8 sources lumineuses par triangle, ce qui est très largement suffisant, puisque la saturation arrive rapidement au dela de 2 sources lumineuses éclairant un même point).

Ouverture


Premier message, qui ne sert grosso modo à rien. Je vais simplement tester le système et voir si il me convient pour stocker de façon simple des informations concernant l'avancement du projet "IE". Je ne sais pas encore comment je vais gérer ces mini-articles, ni si je vais régulièrement en publier. Cela n'a finalement aucune importance pour l'instant, puisque je suis juste en train de tester!