GIF-23205 Qualité et performance du rendu en infographie H13-Les textures (partie 1) Patrick Hébert hebert@gel.ulaval.ca Session H09 11 février 2009
Liste des notions importantes La paramétrisation des textures L’échantillonnage Le filtrage La partie 2 traitera notamment du « bump mapping » et du « environment mapping ».
Pourquoi la texture? Elle enrichit le réalisme du modèle d’apparence tout en évitant de décomposer la géométrie trop finement pour représenter les sections de couleurs différentes + =
Deux exemples Elle peut même compenser pour une géométrie fine non modélisée Tirée du RTR
Du pixel au texel La texture peut être une image ou une procédure. L’exemple suivant montre le cas d’une image. (0,0) (1,0) (1,1) (0,1) (u0,v0) (u1,v1) (u2,v2) Image (pixel) (u,v) dans [0,1] Carte de texture (texels) Le triangle n’est pas forcément de la taille (ou forme) de celui de la carte de texture
Autre exemple
La transformation (mapping) n’est pas toujours simple! Projections sphériques, cylindriques, planes Nous verrons aussi le cube et le « environment » mappings Le défi: paramétriser un maillage (u,v) L’espace des paramètres peut aussi être représenté avec 1, 3 ou même 4 paramètres Oui, on peut définir la texture sur un droite!
Principe de la projection sur une surface intermédiaire Principe important: 1- on applique la texture sur une surface simple 2- on passe de la surface simple à la surface réelle
Extension de l’intervalle [0,1] Modes Repeat, mirror, clamp, border Le comportement peut être configuré différemment en u vs en v Notons qu’une texture peut être R, V, B, alpha et qu’elle peut aussi encoder d’autres propriétés comme la normale (2,2) (-1,-1)
L’échantillonnage de la texture Traditionnellement, les cartes de textures devaient être de dimensions égales à une puissance de 2. Des valeurs arbitraires sont maintenant possibles. On doit considérer le sur et le sous échantillonnages du tampon de couleur vs la carte de textures Carte de 256 x 256 texels Forme 80 x 80 Forme 750 x 750
Le suréchantillonnage Rappel: Reconstruire et rééchantillonner sinc(x) n’est pas pratique Le Box filter (voisin le plus proche ”nearest-neighbor”) fournit une qualité discutable
Le suréchantillonnage (suite) L’interpolation linéaire améliore significa- tivement le résultat
L’interpolation bilinéaire Les coordonnées de texture (pu , pv) sont l’intervalle [0,1] La taille de l’image de texture: n*m texels La méthode du plus proche voisin donnerait: ( floor(n*u), floor(m*v) ) L’interpolation bilinéaire peut être vue comme une combinaison de 3 interpolations linéaires
La formule équivalente On pourrait aussi pousser davantage avec une interpolation bicubique (sur une zone 4 x 4) qui serait implantée dans un shader
Le sous-échantillonnage À l’opposé, pour le sous-échantillonnage, il faudrait filtrer avant de reconstruire et d’échantillonner car un pixel couvre plusieurs texels. Il faut considérer la performance et trouver une méthode efficace.
Le mipmapping d v u Une pyramide précalculée Un rapport de 2 par étage selon chaque axe Une moyenne sur les 4 texels du niveau inférieur ou mieux, vous pouvez construire votre propre pyramide N’occupe que 33% plus d’espace 1 + ¼ + 1/16 + 1/64 + 1/256 + ... (une série géométrique: 1/(1-r) avec r= ¼) Il faut calculer le niveau d qui donne un rapport près de 1:1 Le calcul de d (valeur réelle) indique deux images On peut ensuite appliquer une interpolation bilinéaire dans les deux images, suivie d’une interpolation linéaire entre les niveaux. OpenGL peut produire la pyramide et gérer tout d v u
Le mipmapping (suite) (u0,v0,d0) d v u L’interpolation trilinéaire Requiert l’accès à 8 texels niveau n+1 (u0,v0,d0) d niveau n v u
Calcul du niveau d pour le mipmapping texel pixel projeté dans l’espace des textures Le carré englobant peut être surdimensionné si on prend la plus grande dimension Produit du flou
Exemple Voisin le plus proche Mipmapping
Une solution: le filtrage anisotropique d est choisi avec le plus petit côté 16 échantillons
Application des textures Modulation (multiplier la valeur de la texture par la valeur du rendu de base avec éclairage) Remplacement de la couleur par la valeur de la texture Combinaison avec la transparence (alpha) Autres combinaisons possibles Tomas Akenine-Mőller © 2002
Considérations pratiques en OpenGL Étape 1 Glubyte image_texture[512][512][3]; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, image_texture); /* le premier 0 est le niveau du mipmapping car on peut charger manuellement et le second est la bordure */ glEnable(GL_TEXTURE_2D); // activer le texture mapping Étape 2 glBegin(GL_QUAD); glTexCoord2f(0.0, 0.0); glvertex3f(x1, y1, z1); glTexCoord2f(1.0, 0.0); … // on pourrait aussi ajouter une normale et même une couleur glEnd();
Considérations pratiques en OpenGL (suite) Répétition de la texture glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); Échantillonnage glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); MipMap gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, 64, 64, GL_RGB, GL_UNSIGNED_BYTE, image_texture2); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
Considérations pratiques en OpenGL (suite) Fusion de la texture avec la couleur de base glTexEnvi(GL_TEX_ENV, GL_TEX_ENV_MODE, GL_MODULATE); // il y a aussi GL_DECAL Interpolation plus précise qui tient compte de la perspective glHint(GL_PERSPECTIVE_CORRECTION, GL_NICEST); Autres fonctions à explorer glTexGen(); // génère les coordonnées de texture automatiquement Le multitexturing glMultiTexCoord2f(GL_TEXTURE0, s, t);
Notion avancée: les champs lumineux En supposant un milieu transparent, un CL paramétrisé sur n’importe quelle surface fermée permet de produire le rendu de toutes les vues hors de la surface.
Produire le rendu d’un champ lumineux Champ de lumière surfacique: un ensemble multitexture: chaque triangle est couvert par les images des caméras qui le voit Pour un nouveau point de vue, l’image produite est une combi- naison des images (textures) de base
Produire le rendu d’un champ lumineux démo Une question d’interpolation 27
Références utiles Real−Time Rendering, par Tomas Akenine−Möller, Eric Haines et Naty Hoffman, A.K. Peters Ltd., 3e édition, 2008 (chap. 6) OpenGL(R) Programming Guide: The Official Guide to Learning OpenGL(R), Version 2.1, Dave Shreiner, Mason Woo, Jackie Neider, Tom Davis, Addison Wesley, 6ième édition, 2007 (chap. 9) OpenGL Shading Language, Randi J. Rost et al, Addison Wesley, 2e édition, 2006. Interactive Computer Graphics – A Top-Down Approach Using OpenGL, E. Angel, Addison-Wesley, 5e édition, 2009 (chap. 8)