Chargement d'une texture sous OpenGL sous Linux

 

 

Une texture est une image que l'on applique sur une face d'un objet. Qui dit image dit chargement de celle-ci. Elle peut provenir d'un fichier, ce qui sera à priori souvent le cas !

Cependant, et pour rappel, OpenGL se veut portable et ne gère donc que le rendu de l'image en 3D (ce qui n'est déjà pas mal !). Hors l'accès au système de fichiers est spécifiques à chaque système. OpenGL ne gérera donc pas cette partie.

 

Fonctions perso.

Il pourra donc être nécessaire de créer une fonction (ou une DLL) pour charger une image.

Pour cela:

  • Il faut connaître la structure de la zone mémoire qui va recevoir l'image sous OpenGL. Concernant cette structure, il s'agit en fait de définir les différentes composantes d'un point qui sera dessiné (sa position, sa couleur). L'utilisation la plus classique étant de défniir sa position avec celle que le point à dans la zone mémoire et sa couleur au format RVBA.
  • Charger ensuite une image dans cette zone mémoire. Chargement de l'image pouvant elle même être assez complexe suivant le type de fichier (compacté ou non) et la structure utilisée pour cette image.
  • Ensuite, vous indiquerez simplement à OpengL où se trouve l'image et le format de cette image.

Concernant le fichier image, j'utiliserais le format BMP de Microsoft(annexe structure d'un BMP) sur 24 bits pour avoir le format RVB. Ce format reste assez simple à coder.

Sachant que dans ce format:

  • L'image est inversée (haut en bas) par rapport au repère couramment utilisé en informatique. Cependant, et comme vous le verrez par la suite, OpenGL utilise le même repère pour afficher l'image. Il n'y a donc rien à faire dans ce cas.
  • et est codée BVR: Ce format est lié à l'encode des octets sur un microprocessaur Intel, mais il reste ainsi assez proche du format final que l'on veut, càd RVBA.

Il va falloir réserver de la mémoire pour charger le fichier BMP. Pour ma part, j'utiliserais un malloc , l'image pour cet exemple n'étant pas trop grosse. Idem pour la zone mémoire utilisée par OpenGL pour la texture. Ne pas oublier de libérer les ressources à la fin du programme ! La taille à allouer sera donc:

- Pour le BMP:largeur * hauteur * 3 (RVB = 24 bits soit 3 octets pour définir un point)

- Pour la texture: largeur * hauteur * 4 (RVBA = 32 bits soit 4 octets pour définir un point)

Reste ensuite à charger un fichier en mémoire et à convertir le fichier image BVR inversé dans le format RVBA de haut en bas.

J'utilise une fonction pour faire tout ce que j'ai indiqué:char* LoadFileBmp (char *szFileName).

Comme vous le verrez, il s'agit du stricte minimum...

Vous pourrez aussi utiliser des librairies déjà toutes faites pour lire des fichiers contenant des images. Par exemple libjpeg qui est gratuit.

Je ne passe pas par une définition des types comme le fait Microsoft, en effet, la taille d'un long est de 4 octets sous Microsoft ou certains systèmes Unix, mais il peut aussi être de 8 octets (C'est le cas de Mandriva 2007 sur 64 bits par exemple). D'où l'utilisation des char sur 1 octets... Et puis je suis certain aussi de ne pas avoir de problème entre la partie basse ou haute d'un nombre codé sur 16 bits dont la position diffère suivant le type de CPU !

 

Exemple de code de lecture:

Image non trouvée !Le code n'étant pas réutilisable tel quel !

 

DIB/BMP sous OpenGL avec GLAUX

La librairie glaux met à disposition une fonction permettant de lire un dib/BMP: auxDIBImageLoad(char*);

Cependant, cette librairie n'existe pas sous Unix, et est dépréciée sous Windows... Donc ne pas utiliser.

 

Annexes

OpenGL pour Linux, Windows, Android...