vendredi 10 décembre 2010

La 3D 101 : Les images de synthèses: genèse

   Quoi de mieux pour commencer ce blog sur la synthèse d'image qu'un petit topo sur la technique d'affichage d'une image en 3D actuellement?

    Commençons par le moyen d'afficher cette image.
Petit rappel rapide sur votre écran : un écran est une grille de "pixel" (picture element : morceau d'image dans la langue de Molière). Ces pixels peuvent prendre diverse couleurs (par un procédé qui sera expliqué dans un autre billet ;) ) et en en colorant certain d'une couleur et d'autre d'une autre on dessine quelque chose à l'écran.

    Ça c'est pour le moyen de l'afficher, voyant maintenant le moyen de la décrire :
Il faut savoir qu'on peut décrire une surface (et donc un volume) dans l'espace par rapport à une fonction mathématique appliqué dans un "espace". Un espace, c'est tout simplement un point de référence qui va servir à positionner nos objets les uns par rapport aux autres.

  Petit exercice pratique :

  Prenons une pièce avec une table.

Oui je suis un très mauvais graphiste....

     Prenons comme espace les arêtes formé par le coin des murs et du sol



     Là on vient de former un espace en 3 dimensions : chaque point de notre pièce peut être exprimé en un nombre de fois ces 3 vecteurs rouge vert et bleu.
    Exemple fictif : le coin de la table est à 3.15 x le vecteur rouge, 2.15 x le vecteur vert et 1.2 x le vecteur bleu du coin.
     Si pour simplifiez la chose on appelle le vecteur rouge "x", le vert "y" et le bleu "z", on peut dire que le coin de la table est, dans cette espace {3.15x, 2.15y, 1.2z}. Et donc le coin est le point{0x,0y,0z}

De ce fait on peut ensuite définir la surface de la table par une fonction mathématique :



     Ici , si notre table est plane, la surface jaune ce sera tout les points qui ont pour z 1.2 (même hauteur qu'un coin) et dont les x et y sont compris entre ceux des 4 coins. Bien sur ça, c'est pour la surface la plus simple, le plan. Pour les surfaces courbes, les fonctions sont bien plus complexe, à base de nombre Pi et de plein d'autre trucs qui amusent beaucoup les amoureux des nombres =).

     Faite ceci avec toute vos surfaces dans votre pièce et vous avez, désigné par des nombres dans un espace, votre pièce qui est décrite en terme mathématique, seul chose qu'une machine peut "comprendre" : les nombres!

     Seulement voilà, les nombres, c'est infini. Vous avez donc une infinité de points (3,150....01 || 3,150....02 etc...) qui sont contenue dans votre surface. Or votre écran comme on l'a vu, lui, il n'a qu'une quantité fini de pixels. Il va donc falloir non seulement calculé quelle forme afficher à l'écran pour donner l'impression de profondeur, mais également "discrétiser" cette surface, c'est à dire la définir en un nombre de points finis, sans virgule. Quel pixel de la grille à allumer dans la couleur de la table pour que cette forme apparaisse à l'écran.

Et là pour rendre une scène en 3D deux techniques majeurs existent : une lente et une rapide ;)!

Rendu très réaliste (photo-réaliste) : le lancer de rayon.

     Première solution : refaisons ce que fait la nature mais de manière inverse.
     Si vous voyez un objet, c'est qu'un rayon de lumière qui vient d'une source lumineuse (soleil, lampes etc...) va "rebondir" sur l'objet, qui va absorber certaine couleurs et n'en renvoyer que certaines, et venir dans votre œil. Les capteurs au fond de votre œil capte ce rayon de lumière et transmettent l'information à votre cerveau qui forme l'image.



     Pour plus de facilité (et surtout parce qu'il y a une infinité de rayons qui viennent de partout, et la plupart n'atteindront jamais votre œil!), on fait généralement dans les rendus par ordinateur, l'opération inverse : on fait partir le rayon de l'œil, à "travers" un pixel, et on va regarder si il est intercepter par un objet en faisant la encore des calculs mathématique complexe appelés calculs d'interceptions.
    • Si le rayon "touche" un objet, on regarde si ce rayon peut atteindre une source lumineuse depuis le point où il "touche" l'objet.
      • Si il peut alors il est éclairé (un rayon partant de cette source peut rebondir en ce point et venir dans notre œil), et on calcul par des formules sa couleur en prenant en compte la couleur de l'objet sur lequel il a "rebondi" et celle de la lampe. Et on donne cette couleur au pixel par lequel est passé le rayon.
      • Si il ne peux pas alors il est dans l'ombre, donc tout noir.

         Oui c'est en anglais, Mais j'ai tout expliquer au dessus =)
        merci à http://www.fataltechs.com pour l'image.
     L'avantage de cette technique, c'est qu'on a la meilleur discrétisation possible de notre scène, on ne peux pas être plus précis, on a fait un calcul pour chaque pixel. Et vus qu'on calcul si un rayon touche un objet avec la formule qui décrit cet objets, les objets complexes comme les sphères seront très détaillés, très proche de la réalité.

     Le problème, c'est que c'est très lent. La machine doit faire beaucoup beaucoup de calcul pour chaque rayon, et plus l'écran est grand (plus il a de pixel), plus les surfaces sont décrite par des fonctions compliquées, plus les calculs seront nombreux. Il n'est donc pas possible de calculer les 30 images en une seconde qu'il faut afficher pour donner l'illusion du mouvement, et cette technique n'est pas encore utilisé pour la 3D temps réel comme le jeux vidéo. 
    Cependant c'est cette technique (ou plutôt des dérivés beaucoup plus performants et donnant des rendus encore meilleurs) qui est utilisé pour les films en images de synthèse. Là il n'est pas rare que pour calculer UNE image, les ordinateurs (car plusieurs ordinateurs travaillent conjointement pour aller plus vite!) mettent des heures! Car il y a des objets transparents, beaucoup de source de lumières, etc...ce qui alourdit encore plus les calculs....

Rendu rapide : la rastérisation.

     Cette méthode est celle actuellement utilisé par les logiciels de 3D temps réel (jeux vidéo, simulation, application interactive...). Cette méthode consiste de partir d'une surface en 3D, et lui appliquer une série de transformation pour avoir son aspect en 2D. Puis on transforme cette forme 2D en "petit points" qui seront les pixels à l'écran.

     Là où le lancer de rayon se base sur des calculs physiques et donc donne des résultats proches du réel, la rastérisation, elle, "approxime". Il ne faut pas perdre de vue qu'il faut faire 25 à 30 rendus (images) minimum par seconde pour avoir une impression de mouvement.

     La première approximation est de transformer toute surface en "plan". L'exemple le plus probant est la sphère :



     On ne peux appliquer les transformations pour calculer le rendu en 2D d'une surface que sur des polygones, c'est à dire des formes fermées faite par des segments avec des angles, pas sur les courbes. En effet une ligne c'est un point de départ et un point d'arrivé. Si on connait la position des deux il suffit de les relier pour obtenir le segment. 
    Donc si on applique le calcul mathématique qui permet de faire l'opération suivante : de la position x,y,z de l'espace pour deux points on obtient une position en largeur et hauteur de mon écran à ces deux point, et qu'on relit ces points, on as ce segment telle qu'on le verrait depuis ce point de vue (avec un effet de profondeur). 
    Alors que pour une courbe il faudrait pour chaque position entre le point de départ et le point d'arrivé calculer sa positon, or il y a une infinité de point sur une ligne...! C'est pourquoi les courbes sont découpées en plusieurs petits segments ! Plus on aura de lignes petite, plus on aura l'impression que notre courbe est "lisse", mais plus on aura de points sur lesquelles faire des calculs!

 Chaque point bleu est un point, et les ligne rouge les segments.
 
    Donc si on fait ce calcul pour tout les points "d'angle" d'une surface, on obtient le polygon qui à un effet 3D, un effet de profondeur. 
    Reprenons l'exemple de notre table tout à l'heure. Si on applique notre transformation au 4 coins de la table, on va obtenir 4 point sur notre écran. Une fois ces 4 points relié, on obtient cette forme :



Qui est bien "l'illusion" de la surface de la table vu depuis l'entrée de la pièce =)!
(En pratique on applique cette transformation sur des polygones à 3 cotés : des triangles ;)! Si vous êtes curieux, regardez la partie "Note pour aller plus loin" en bas du billet pour plus de précision sur pourquoi ceci!)

Cependant si cette méthode est rapide (on fait des calculs juste pour les points des surface de l'objet, et non plus un rayon pour chaque pixel, avec des dizaines et des dizaines d'opérations pour ce rayon...), comme on peux le voir sur la sphère présentée plus haut, on perd en "réalisme". 
    Les surface courbes (et pauvre de nous, 99% de ce qui n'est pas de fabrication humaine l'est (et encore même ce qui est de fabrication humaine maintenant ;) ), et bien ces surfaces courbes perdent en détails et sont "découpées". Heureusement maintenant on a des techniques spéciales pour encore "approximé" ces surface rapidement et les rendre plus réaliste! On appelle ça les shaders on verra ça dans un prochain billet!



     Voilà de manière rapide les deux techniques de rendu d'image de synthèse de nos jours. Prochainement, je ferrais un billet pour détailler la rastérisation, et comment elle est faite par un composant essentiel d'un pc de joueur : la carte(ou le chip =) ) graphique !



Note pour aller plus loin :

     Alors pourquoi transformer toute nos surface en triangles pour la rastérisation? Et bien pour une raison mathématique simple : trois points seront toujours dans le même "plan", il formeront donc forcement une surface "plate" (ou plane). 
    Avec 4 points ce n'est pas forcement vrai. Tendez un draps à 1m du sol, trois de ses coins solidement fixés à un mur. Maintenant essayez d'imaginer ramener le 4eme coins par exemple sur le sol au centre du rectangle formé par votre drap : vous voyez bien que votre drap à soit une "cassure" si il est bien tendu, il est alors formé de 2 surfaces planes (deux triangles =)), soit il se "bombe".
    C'est pourquoi on rasterise avec des triangles, car on est sur que ça marche, la surface étant forcement plane : il n'y a qu'une surface définis par 3 points dans l'espace. 
    Et si certaine applications 3D propose des plans rectagulaire, elles trichent, ce sont en fait 2 triangles dont les point sont tous dans le même plan. On verra d'ailleurs prochainement que les cartes graphique du coup ne comprennent que les triangles =)

Bienviendu!

Bienvenue sur ce blog!

L'idée derrière ce blog est que souvent, des amis ou de la famille me demandent de leurs expliquer comment telle ou telle chose est faite par ordinateur, notamment dans mon domaine d'étude, la 3D temps réel. A force d'expliquer ce qu'était une rasterisation, des shaders ou de la 3D anaglyphe, je me suis dit que je pourrais en faire profiter plus de monde...

Et puis tout ce que je poserais ici une bonne fois pour toute m'évitera de le répéter =)

Pour les gens qui s'y connaissent et qui passerais dans le coin, désolé d'avance pour les raccourcis énormes que je vais prendre, les approximations approximatives où les généralisations. L'idée est de vraiment apporter un semblant de notion pour des gens qui n'ont aucune idée de comment tout cela fonctionne. Mais bien sûr, je suis toujours à la recherche de connaissance, donc si je dit une grosse bêtise (et c'est plus que probable, je n'ai pas un très haut niveau d'étude et suis loin d'être un spécialiste ;) ), n'hésitez pas à corriger ça dans les commentaires, je mettrais l'article à jours!

Sur ce bonne visite!