TP OpenGL : Multitextures et Bump Mapping

Transcription

TP OpenGL : Multitextures et Bump Mapping
TP OpenGL : Multitextures et Bump Mapping
16 avril 2008
1
Multitextures
Nous avons vu dans les TP précédents comment utiliser une texture sur un objet. Aujourd’hui, nous
allons voir comment utiliser plusieurs textures sur un même objet en une seule passe et comment les
combiner. OpenGL permet de spécifier plusieurs unités de textures qui seront utilisées simultanement
dans le pipeline graphique. Lorsqu’on utilise plusieurs textures, il faut penser a spécifier dans quelle
unité de texture on travaille (avec la commande glActiveTexture(GL_TEXTUREi)). La texture 0 est
la texture active par défaut.
Lorsque l’on désire associer des coordonnées de textures différentes pour chaque texture à un même
sommet, on utilise la commande glMultiTexCoord2f(GL_TEXTUREi,s,t)(avec i l’unité de texture a
utiliser avec ces coordonnées). Pour spécifier a OpenGL comment combiner les différentes textures, on
utilise les textures combiners. Grace à ces instructions , il est facile de combiner efficacement plusieurs
textures :
–
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE)};
Permet de spécifier a OpenGL qu’on souhaite combiner les différentes unités de texture.
– glTexEnvi (GL_TEXTURE_ENV, GL_COMBINE_RGB, combine_function);
Spécifie la fonction utilisée pour combiner les unités.
– glTexEnvi (GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0);
Indique que l’argument 0 de la fonction qui combine les textures sera la texture 0.
Par défaut , l’environnement openGL utilise GL_MODULATE. Ceci signifie que les unités de textures sont
combinées les une aux autres dans l’ordre (la couleur finale d’un fragment sera Ctexture0 ×Ctexture1 ×...).
Ceci va nous permettre de réaliser rapidement un petit exemple. On souhaite afficher un plan texturé
et utiliser une carte de lumière (une lightmap) pour simuler un eclairage sur ce plan. Le but est de
multiplier pour chaque pixel la valeur contenue dans la carte de lumiere par la valeur de couleur
contenue dans la texture affichée sur le plan. Cette technique permet de simuler un eclairage statique
et est utilisée dans de tres nombreuses applications. Affichez un plan ayant comme première texture
une texture de votre choix et en deuxième unité de texture la texture light.png et observez le resultat.
2
Bump Mapping
Le bump mapping est une technique permettant de donner l’illusion de relief, sans augmenter la
géométrie. Pour cela, il suffit d appliquer une perturbation de la normale à la surface d’un objet. En
effet, la normale d’une surface intervient dans le calcul d’eclairage. C’est ce calcul d’eclairage qui donne
une impression de 3D a nos objets. Une perturbation de la normale a une surface permet de donner
l’illusion de relief sur une surface quelconque.
1
Nous allons voir dans ce TP une des techniques de Bump Mapping les plus répandue : le Normal
Mapping. Pour ce faire, nous allons utiliser une texture (une normal map) qui encode dans ses canaux
de couleurs une collection de normales perturbées (les coordonnées XYZ d’une normale sont encodées
dans les canaux RGB d’un texel). L’idée est de remplacer les normales par pixel d’une surface par une
normale tirée de la normal map et d’effectuer les calculs d’eclairage avec cette normale perturbée.
La question qu’il convient de se poser est :
Dans quel système de coordonnées sont exprimées les normales de la normal map ? Elles ont été
encodées par rapport au plan de la texture. Or notre carte de normale sera utilisée comme une texture.
Pour garder une coherence dans les operations d’eclairage réalisées, il faut que le vecteur L ( le vecteur
pointant dans la direction de la lumière pour chaque pixel) et la normale N soient exprimés dans le
même repère. Soit :
– Il faut transformer les normales N exprimées dans l’espace tangent a la surface dans l’espace objet.
– Il faut exprimer le vecteur L dans l’espace tangent pour chaque sommet.
La deuxieme solution est la plus efficace dans notre cas.
2.1
Espace tangent
L’espace tangent est un espace constitué des 3 vecteurs N,T et B. ( Normal, Tangent , Binormal ).
Pour le construire, il faut exprimer le vecteur tangent (dans la direction de la coordonnées de texture s)
dans le repere objet (pensez a normaliser). Le vecteur B peut s’obtenir a l’aide d’un produit vectoriel.
Ces 3 vecteurs forment une base.
L’idée est d’exprimer le vecteur lumiere pour chaque sommet dans cette base. Pour cela , il suffit de
multiplier le vecteur lumiere par la matrice formée par les vecteurs S T et N :
(Sx Sy Sz)
(Tx Ty Tz)
(Nx Ny Nz)
Pour utiliser ce vecteur par la suite, il est commun de l’encoder dans le canal de couleur (avec glColor).
2.2
Preparer le pipeline
Nous avons desormais la direction de la lumiere stockée dans le canal de couleur. Ce que nous voulons
ici c’est réaliser l’opération d’eclairage diffuse :
C = N ∗ L ; Il faut pour cela specifier a OpenGL que nous utilisons une texture contenant une normal
map et qu’il faut effectuer un produit scalaire entre le vecteur contenu dans cette texture et le canal
de couleur. Ceci s’effectue avec le code suivant :
glActiveTextureARB(GL_TEXTURE0_ARB) ;
glBindTexture(GL_TEXTURE_2D,NormalMap) ;
glEnable(GL_TEXTURE_2D) ;
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_COMBINE_EXT);
glTexEnvf(GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT,
GL_DOT3_RGB_EXT);
Ce code signale à openGL qu il faut utiliser l’operateur Dot3 (extension openGL disponible sur la plupart des cartes) pour combiner les textures. Essayez d’abord ce principe pour afficher un plan avec des
details en relief grace au bump mapping. Vous pouvez pour cela utiliser les textures normalmap1.png et
couleurmap.png (une normal map correspondant a un bruit de Perlin est aussi disponible : normalmap2.png).
Vous pouvez par la suite l’appliquer à vos objets préférés. Il est de même possible de générer vos
propres normal map.
Ceci est un premier (petit) exemple qui permet de se familiariser avec le concept du bump mapping.
Il existe bien sur d’autres éléments pouvant etre rajouté. De meme cette technique peut etre combinée
avec des technique de cube mapping pour rajouter encore plus de réalisme à vos scenes.

Documents pareils

Techniques de rendu avancées en OpenGL Journées de formation

Techniques de rendu avancées en OpenGL Journées de formation • Spécifier-Modifier les données sources glBufferData(GLenum target, GLsizei size, void *data, GLenum usage) glBufferSubData(GLenum target, GLint offset, GLsizei size, void *data) – GL_ARRAY_BUFFER...

Plus en détail