> TechDemo
PrograZine issue #9 - http://www.citeweb.net/discase/9/3DGOUR.htm Edito Sommaire Contribution Contacts


Le tracage de polygones - Gouraud et Textures (II)
par Plouf - plouf@skynet.be
Initié DOS QBasic
> fichiers attachés
3dgrd.bas
3dtxt.bas



    Dans cette partie je suposerai que vous savez déjà comment tracer des polygones flat.

    L'ombrage gouraud est tout sauf de l'ombre :) En fait, il consiste à imposer à chaque sommet la couleur du polygone, de sorte que à l'intérieur, un dégradé de couleurs se forme.

    Le placage de texture consiste tout simplement à appliquer une texture (donc un bitmap) sur le polygone et donc la déformer pour qu'elle occupe tout l'espace intérieur.

    Le maitre mot de ces deux parties est : interpolation. Et pas n'importe quelle interpolation, de l'interpolation linéaire. Cela consiste à "deviner" ce qui se passe entre deux choses connues. Quand vous tracez une droite, vous n'avez que deux points et vous devinez ce qu'il se passe entre le début et la fin. Autrement dit : vous interpollez, et pas de n'importe quelle facon, vous interpoller d'une facon linéaire, bref vous supposez que ca ne fait pas de petites ondulations :)
>1) L'ombrage gouraud

     Au lieu d'interpoller des coordonées à l'écran comme pour une droite, nous allons interpoler les couleurs. C'est exactement la même chose d'un point de vue mathématique : pour tracer une ligne horizontale, qui a gauche à une couleur a et à droite une couleur b, vous allez prendre la différence entre ces couleurs et la diviser par le nombre d'étapes, donc la longueur de la ligne. Vous aurez de cette facon calculé "le coéficent angulaire des couleurs".

     Souvenez-vous : pour tracer le polygone flat, on part d'un sommet et on se rapproche d'un autre (en fait, la aussi on interpolle). Donc nous passons d'un couple (x1,y1) vers un couple (x2,y2). A present, nous rajoutons à ce couple une troisième valeur, la couleur du sommet, pour optenir le triplet (x1,y1,c1)-->(x2,y2,c2) et pour chaque étape le long du côté, nous saurons quelle est la valeur de la couleur, comme nous savions déja la valeur de x1 et de y1.

     Ce que nous faisions à l'époque c'était pour une hauteur donnée, relier les deux (x,y) sur chacun des cotés. A présent, nous allons relier chaque (x,y,c), celui a gauche et celui à droite. Comment cela? Et bien il s'agit d'une ligne horizontale, comme l'exemple montré plus haut. On va recalculer un autre coef ang des couleurs, et c'est repartit pour un tour. Donc en gros, la seule différence ou presque avec le polygone flat, c'est qu'au lieu de pouvoir utiliser Line, il va falloir tracer sois-meme, pixel par pixel, la ligne horizontale, en mettant a jour a chaque pixel la couleur du point (donc en ajoutant a la couleur le coef angulaire) Clair? :)

     Donc nous devrons manier séparement trois coéficient angulaires : celui du côté gauche, celui de droite, et celui de la ligne horizontale. Il s'agira de ne pas les confondres.
l Note : habituellement on trace la ligne de gauche à droite, mais si vous vous souvenez, on ne sais jamais lequel des deux points sur les cotés est à gauche et lequel est à droite. Il faudra décider de quel point vers quel point vous tracez, et éventuellement inverser ces deux points pour que le premier se trouve bien à gauche. N'oubliez pas que si vous inversez les deux X, il faut également inverser les deux couleurs (et, en fait, inverser les deux Y mais ils sont les mêmes...)
l ATTENTION : inverser c'est bien, mais une fois la ligne faite, il faut que les deux points se retrouvent ou ils étaient, n'allez surtout pas inverser les points eux-memes, mais inversez des copies que vous utiliserez uniquement à cette occasion, et que vous vous empresserez d'oublier une fois la ligne tracée!
>2) Le placage de texture

     La texture n'est plus que la suite logique de l'ombrage gouraud, au lieu d'avoir le triplet (x,y,c) nous aurons le quadruplet (x,y,u,v) ou (u,v) sont les coordonées du points par rapport à la texture.

     Par exemple, si vous affichez un carré (enfin, quelque chose qui est sencé être un carré et qui se trouve déformé suite à je ne sais quelle rotation en 3D), il est logique d'affecter a chaqun des sommets un sommet de la texture.

     Une fois le polygone (donc le carré déformé) affiché a l'écran, chacun de ses sommets correspondra toujours à un sommet de la texture, l'intérieur s'étant déformé pour maintenir cette condition, et c'est bien ce que l'on voulait.

     Remarquons que cette texture n'est pas correcte, si vous jouez avec des cubes tournant autour d'axes, avec de la texture, vous vous rendrez vite compte qu'une fois que le côté est fort penché, la texture se déforme d'une façon incorecte.

     C'est juste que notre interpolation ne devait pas être linéaire, nous nous sommes trompés (si peu...) sur le comportement réel de la vision d'une image dans l'espace... En réalité, elle dépend de Z (la profondeur).

     La facon de corriger cela est de connaitre cette petite contrainte : pour pouvoir afficher d'une facon correcte une texture sur un polygone, nous devons utiliser des scanlines correspondant à un Z constant. Remarquons tout de suite que par exemple Doom utilise deux sortes de polygones : des polygones verticaux (les murs) et des horizontaux (le sol et le plafond), et que pour les murs, les verticales sont à Z constant (donc les scanlines sont verticales, facile a faire), et pour le sol, les scanlines sont horizontales, toujours facile à faire. Cela explique pourquoi on ne peut pas pencher sa tete a gauche ou a droite dans ce jeu, les routines ne sont justes pas prévu pour...

     Mais le coup de la correction de perspective est un vrai casse-tête, et je ne m'y suis jamais essayé :)
Cet article est la propriété de Plouf. La copie et la diffusion sont libres sauf dans un but lucratif sans accord explicite de l'auteur.