3/5

3. Textures

goal

Objectif de scène 3D obtenue en fin de séance

Code d’exemple

Compilez le code d’exemple 02_texture/example_texture (INF443_EXAMPLE_TEXTURE). Ce code affiche un quadrangle muni d’une texture. L’application d’une texture nécessite deux étapes

  • Le choix des coordonnées de textures (ici stockées dans le vecteur texture_uv)

  • Le choix d’une image stockée sur le GPU. Similairement aux buffers OpenGL, un identifiant (ici texture_id) est accessible dans le code.

Au moment d’afficher la surface, l’activation d’une image de texture est réalisée par la commande glBindTexture qui permet de définir l’identifiant de texture à utiliser (reste valide tant qu’une autre texture n’est pas activée).

Note. Le shader (appelé par shaders["mesh"]) utilise dans tous les cas une texture. Lorsque des objets "non texturés" sont affichés, on utilise par défaut une image blanche, qui ne modifie ainsi pas la couleur de l’objet.

texture basic
  • Si vous modifiez les positions des coordonnées dans l’espace, la texture reste attachée à chaque sommet. Elle peut alors subir des compressions ou élongations en fonction de la géométrie.

  • Modifiez les coordonnées de textures, observez que l’image se répète lorsque vous considérez une valeur (u,v) supérieure à 1?

Ce comportement (mise en place dans vcl::texture_gpu) peut être adapté à l’aide de la fonction OpenGL glTexParameteri avant l’affichage de la surface.

Exemple d’une répétition de type mirroir sur la texture

glBindTexture(GL_TEXTURE_2D, texture_id);


glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT);


surface.draw(shaders["mesh"], scene.camera);
texture repeat mirror

Notez la possibilité de tronquer également l’image (ex. GL_CLAMP_TO_BORDER). Chaque composante (u,v) (ou (s,t)) peut être paramétrée différemment.

Application au terrain

Reprenez l’application du terrain et modifiez celle-ci afin d’y plaquer une texture. Pensez notamment à ajouter des coordonnées de textures pour chaque sommet du maillage de terrain.

terrain texture

Bruit de Perlin

Considérez le code d’exemple exemple_perlin. Ce code applique une déformation de hauteur sur une grille régulière (initialement plane) sous la forme d’un bruit de Perlin. Celui-ci est paramétrable à l’aide des sliders de l’interface.

  • Observez l’influence des différents paramètres.

texture perlin

Rem.

  • Notez que la couleur associée à chaque sommet dépend de sa hauteur.

  • Le bruit de Perlin est évalué par une bibliothèque externe utilisant lui même l’approche du simplex noise. Notez que la bibliothèque permet de générer des bruits en dimension 1, 2, et 3 (volume).

Utilisez ce bruit de Perlin pour ajouter des détails à votre terrain déjà existant. Essayez de préserver l’apparence globale de votre fonction initiale (forme à basse résolution contrôlée explicitement par des fonctions gaussiennes) sur laquelle vous ajoutez le bruit procédural de faible amplitude pour donner l’impression visuelle de détails naturels à plus hautes fréquences.

terrain perlin

Billboards

Les billboards (ou imposteurs), consistent à utiliser des images d’objets sur fond transparent en tant que texture pour représenter des objets d’apparence complexe sur une géométrie simple (typiquement des quadrangles).

Considérez le cas du code example_billoards. Ce code utilise une texture de brins d’herbe sur fond transparent.

billboard grass

Cette texture est appliquée de deux manières différentes

  • Premièrement sur un quadrangle qui fait constamment face à la caméra: permets de donner l’impression à l’utilisateur d’être toujours en face des brins d’herbes.

  • Deuxièmement sur deux quadrangles placés orthogonalement, mais d’orientation statique: évite les artefacts du au changement d’orientation du billboard, mais géométrie visible à 45 degrés.

example billboards
  • Observez la manière dont la texture est utilisée dans la fonction d’affichage pour permettre la prise en compte de la transparence.

  • Utilisez les billboards pour ajouter des détails à votre scène, par exemple en ajoutant des fleurs et de la végétation sur le terrain.

Note.

L’utilisation d’objets transparents (ou semi-transparents) en OpenGL nécessite des précautions supplémentaires par rapport au maillage classique.
Premièrement, ils doivent être affichés en dernier (après les objets standards de la scène), afin de permettre l’utilisation du "blending" par le paramètre alpha.
Deuxièmement, les objets transparents ne peuvent pas utiliser le buffer de profondeur, en effet, la géométrie du quadrangle n’indique pas si un objet peut être visible ou non derrière lui puisque c’est la texture qui porte cette information. L’absence d’utilisation du buffer de profondeur lors de l’affichage de plusieurs billboards peut apporter des artefacts visuels: le billboard affiché en dernier apparait toujours devant celui affiché précédemment. Pour éviter ces artefacts, il est possible de trier les billboards afin d’afficher ceux-ci du plus loin au plus proche de la caméra (l’ordre devant être réactualisé à chaque frame).

Skybox (extension si vous êtes en avance)

Une skybox est un cube entourant la scène sur laquelle une texture d’environnement est plaquée. La skybox permet de donner l’illusion que la scène est plongée dans un environnement plus large. La texture utilisée doit correspondre au cas d’un cube déplié, et les couleurs au niveau des arêtes doivent être cohérentes sur l’ensemble des faces.

skybox texture

Une fois le cube créé, celui-ci est placé de manière à englober la scène, et centré en permanence autour de la position de la caméra. Cela donne ainsi l’impression d’un paysage visible au loin.