• Aucun résultat trouvé

8.5 Rendu

8.5.3 Le lissage de Gouraud

FIG. 8.11: Profondeur maximale de subdivision des obstacles selon tmax

méthodes hiérarchiques, il peut-être intéressant de les simuler au moment du rendu pour améliorer la qualité des images. Nous proposons pour cela d’utiliser l’extension

Depth-TextureEXT d’OpenGL dans un algorithme de rendu en trois passes (Voir également la

figure 8.14) :

1. le récepteur est rendu off-screen depuis le centre de la source et la carte Izdes valeurs de profondeurs des pixels est lue dans l’image obtenue (Figure 8.14.a). On relève également la matrice M1de la projection utilisée.

2. le récepteur est ensuite rendu off-screen, depuis le point de vue de l’observateur en spécifiant que M1doit être utilisée pour transformer chaque pixel dessiné pour connaître sa profondeur vu du centre de la source. Il est alors possible de spécifier à OpenGL (Grâce à l’extension DepthTextureEXT) de ne dessiner que les pixels dont la profondeur ainsi calculée est inférieure à celle du pixel correspondant dans l’image Iz. Lorsque la profondeur d’un pixel est supérieure, celui-ci est considéré comme étant dans l’ombre de la source.

3. l’image ainsi calculée est utilisée pour construire un masque (Figure 8.14.b) au tra-vers duquel est finalement dessiné le récepteur avec sa texture de radiosité. Les pixels passant au travers du masque sont ceux ne se trouvant pas dans l’ombre propre du récepteur (Figure 8.14.c). Le masquage est réalisé automatiquement grâce au stencil

buffer d’OpenGL.

8.5.3 Le lissage de Gouraud

Comme nous l’avons vu en 1.2.5.(a), le lissage de Gouraud (ou smooth-shading) est une technique consistant à calculer, au moment de l’affichage, la couleur des pixels d’un polygone par interpolation à partir des couleurs aux sommets du polygone. Cette technique améliore la qualité de l’image rendue en supprimant les discontinuité d’ordre zéro de la radiosité.

Lorsque la radiosité est représentée à la fois par des valeurs uniformes et par des tex-tures, on ne peut pas calculer les valeurs aux nœuds du maillage comme étant une moyenne pondérée de la radiosité des mailles adjacentes à chaque sommet. En effet, en ces points, une partie de la couleur est imposée par la contribution des textures de radiosité, qui cor-respond à la valeur du pixel de la texture.

6400 3600 10000 14400 400 1600 2.2 2 E = 7.04 max max max E = 0.063 E = 0.126 Nombre de pixels 19600

t

0.2 0 0 max 0.4 0.6 0.8 1 1.2 1.4 1.6 1.8

FIG. 8.12: Nombre moyen de pixels par texture en fonction de tmax (voir texte). L’échelle est logarithmique.

RenderPolygon(Polygone P)

SetColor(P!Radiosity() - P!Textures()!MeanValue() ) DrawSimplePoly(P)

Enable(BLENDING) SetZBufferFunction()

ForAll Tin P.Textures()

n = SmallestIntegerLargerThan(T!MaximumLuminance()) for i=1 to n

DrawPolyWithTexture(P,T,n) Disable(BLENDING)

FIG. 8.13: Algorithme de rendu ajoutant la radiosité de textures à la radiosité uniforme. Nous ne pouvons donc pas nous contenter d’ajouter les textures de radiosité au rendu in-terpolé des valeurs de radiosité uniformes, comme le montre la figure 8.15. Cette difficulté provient du fait que les valeurs calculées aux nœuds du maillage pour le smooth-shading sont globales et ne peuvent donc pas concorder avec les valeurs des textures de radiosité en ces points, qui elles, sont locales.

Pour obtenir une parfaite concordance de l’illumination des polygones partageant un sommet, nous décidons donc à l’avance d’une valeur de référence la plus juste possible, et nous forçons, au moment du rendu, les différents éléments de maillage partageant ce sommet, à concorder en ce point :

Au moment du push/pull, une valeur de radiosité uniforme vI est attribuée à chaque sommet du maillage par moyennage des valeurs de radiosité uniforme des mailles voisines avec les poids décrits sur la figure 1.15. Cette valeur a un caractère global. Dans le même temps, une valeur de radiosité de textures de référence vRest attribuée à chaque sommet du maillage. Cette valeur vaut 0 si aucune des mailles adjacentes n’admet de texture de radiosité. En revanche, Si l’un au moins des polygones adjacent admet de la radiosité de texture, la valeur choisie est le maximum des valeur des textures de radiosité des polygones

8.5. RENDU 157

FIG. 8.14: Méthode en trois passes pour simuler au

mo-ment du rendu l’ombre que porte un récepteur sur lui-même. La scène (à gauche) est tout d’abord rendue (a) depuis la source. La composante de profondeur de cette image est utilisée pour créer une image des ombres (b) utilisée comme masque au travers du quel on effectue le rendu final (c).

(a) Vue depuis la source (b) Masque (c) Rendu final

x

I y (a) (b) S z

FIG. 8.15: Cette figure illustre la raison pour laquelle on ne peut pas rendre les textures

de radiosité par dessus la radiosité uniforme après interpolation. La figure représente la radiosité calculée le long de deux arêtes (a) et (b) partageant un sommet S, l’arête (a) appartenant à une maille A et l’arête (b) à une maille B. On suppose de plus que A ne reçoit que de la radiosité uniforme (valeur x, courbe en pointillé) et B que des textures de radiosité (courbe de droite, valeur y en S). La valeur z attribuée à S pour le smooth-shading n’a alors aucune raison de concorder avec y et une discontinuité apparaît.

adjacents à ce sommet. Cette valeur a un caractère local.

Ayant fixé à chaque sommet une valeur de radiosité uniforme et une valeur de radiosité de texture de référence, le rendu est effectué en rendant les textures par dessus la radiosité interpolée à partir de la valeur calculée en chaque sommet S comme :

vS=vI+vR,T(S)

où T(S)est la valeur totale des textures de radiosité au sommet S du polygone affiché. L’utilisation du maximum dans le calcul de vRpermet d’assurer que vSest toujours positive et donc jamais modifiée par OpenGL lors du rendu.

En procédant ainsi, chaque polygone admettant le nœud S du maillage comme sommet est rendu, après accumulation de la radiosité des textures et de la radiosité uniforme, avec la même valeur au point S : vI+vR. Dans l’exemple de la figure 8.15, on a donc vI=z et vR=y. L’arête (a) est donc rendue avec vS=z+y et l’arête (b) avec vS=z+y,y=z.

Après ajout des textures, on a donc bien la même valeur en vSpour les deux arêtes. Cette méthode est apparemment discutable puisqu’elle ne donne pas aux sommets la

valeur qui y a effectivement été calculée (parfois avec raison, notamment dans le cas où un des polygones adjacents n’admet que de la radiosité de textures), mais l’erreur produite n’est que la répercussion de l’approximation d’une certaine proportion de la radiosité par des valeurs uniformes.

Le smooth-shading ne permet cependant pas d’éliminer certaines discontinuités ob-servables par exemple le long d’une arête partagée par un polygone ayant une texture de radiosité et un polygone n’en n’ayant pas. De telles discontinuités sont dues à la différence de variation de la radiosité sur les deux polygones ; l’une varie en effet approximativement comme x7,!

1

1+x2 et l’autre de façon affine (C.f figure 8.16).

Pour supprimer de tels artefacts, il faut alors subdiviser le polygone n’ayant pas de texture de radiosité et contraindre la subdivision pour qu’elle coïncide, le long de l’arête commune aux deux polygones, au maillage d’affichage de la texture de radiosité de l’autre polygone. Le problème se complique encore lorsque les deux polygones ont des textures de radiosité en nombre différent, avec des maillages d’affichage de résolutions différentes. La méthode précédente se généralise alors au cas de plusieurs textures après raffinement des maillages d’affichage pour mettre en accord leurs résolutions respectives.

(Interpolation linéaire)

(Quadratique inverse)

smooth-shading

Eclairage réèl

FIG. 8.16: Exemple de discontinuité observée lorsqu’un polygone texturé (en bas) jouxte

un polygone n’ayant que de la radiosité uniforme (en haut). Bien qu’elle permette la concordance des valeurs de radiosité aux sommets communs des polygones, l’utilisation du smooth-shading produit alors une variation linéaire de la radiosité qui contraste avec la variation en 1

1+x2 de l’éclairage direct associé au maillage d’affichage de la texture de radiosité, le long de l’arête commune aux deux polygones.