Une texture est stockée dans un emplacement mémoire situé dans la carte graphique contenant des données de couleurs et de transparence de telle sorte que le processeur graphique y accède de manière directe sans passer par le bus de la carte mère. Notez que les derniers ordinateurs de chez Apple font exception avec une mémoire unifiée, ils ont d'ailleurs carrément décidé d'abandonner OpenGL au profit de librairies comme Metal ou Vulkan. Revenons à OpenGL sur PC.

Pour accéder à une texture on l'appelle par un index qui a été préalablement fourni par OpenGL lors du transfert des données vers la carte graphique.

Processus d'utilisation d'une texture :

  1. Avoir les données de l'image en mémoire et ses dimensions. On peut charger une texture à partir d'un fichier ou créer une zone de mémoire et y dessiner quelque chose.
  2. Transférer les données à Opengl et obtenir l'index de la texture crée.
  3. L'appeler par cet index à chaque fois quand on dessine avec.
  4. Au final on pourra soit effacer la texture durant le programme soit automatiquement effacée lorsqu'on mettra fin au Rendering Device Context.

Exemple de création d'une image RGBA :

ExempleCreationImageRGBA

Résultat :

creationrgbapourtexture

Exemple de chargement d'un fichier PNG en mémoire :

ExempleChargerUneImageRGBAEnMemoire

Envoi des données de l'image à OpenGL et récupération de l'index de la texture :

RGBAtoTexture

Utiliser une texture :

glBindTexture(GL_TEXTURE_2D, TextureIndex)

Suppression d'une texture :

glDeleteTextures(1, V:TextureIndex)

La transparence

Il y a 2 façons de coder la transparence : absolue ou graduelle, elles sont complémentaires l'une de l'autre. Pour être vraiment technique on devrait plustôt parler de couche Alpha et non de transparence, puisqu'il s'agit de modifier des opérations logiques entre les données RGB de la texture et les données du z-buffer et de couleur du buffer.

La transparence absolue :

Elle concerne le z-buffer et définit si la texture est dessinée. La couche Alpha est comparé à un seuil unitaire (0 à 1) qui s'il est passé annule le dessin du pixel, dans ce cas, le z-buffer ne sera pas mis à jour. L'ordre d'affichage n'a pas d'importance.

OpenGL CubeZtransp

La semi-transparence ou transparence graduelle :

Elle concerne seulement les composantes RGB et la texture est toujours dessinée. La valeur de la couche Alpha sert de facteur unitaire (0 à 1) de mélange des couleurs de la texture avec celles du rendu. L'ordre d'affichage doit donc être décroissant en Z afin de faire apparaitre les faces situées en arrière d'une transparence.

Dans l'image de gauche les faces ne sont pas triées, la face du dessous et celle de droite ayant été dessinées en dernier n'apparaissent pas en transparence car le z-buffer a été mis à jour par les précédentes faces du cube. A droite, si on trie les faces, le rendu est correct.

 OpenGL CubeSemiTransp

 

La matrice de texture

Elle sert à tranformer les coordonnées de la texture, elle s'applique à toutes les textures. On peut lui appliquer les mêmes transformations que les matrice de projection et de modèle par exemple. Pour l'appeler il faut écrire glMatrixMode(GL_TEXTURE)

Le paramètre GL_TEXTURE_WRAP de la texture

Il est possible de spécifier de quelle manière sont gérés les débordements, c'est à dire l'appel à une coordonnée de texture inférieure à zéro ou supérieure à un.Il faut écrire pour X (WRAP S) et Y (WRAP T) :

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, TextureParameter)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, TextureParameter)

Où TextureParameter est l'une de ces valeurs :

GL_REPEAT (10497), GL_MIRRORED_REPEAT (33648), GL_CLAMP (10496), GL_CLAMP_TO_EDGE (33071) et GL_CLAMP_TO_BORDER (33069).

Vous pourrez tester ces paramètres avec ce programme de démonstration :

OpenGL demotexture

OpenGL-Textures

Précédent

 

 

 

Comments est propulsé par CComment