Grâce à notre choix d'utiliser OpenGL avec la SDL, vous allez voir que la phase de chargement des textures nous sera hautement simplifiée.
Mais avant même de pouvoir charger une quelconque texture, encore faut-il en avoir... Pour cela je vous propose de travailler avec ce
pack de textures hautes résolutions. Il est assez volumineux (124 Mo) mais assez complet et contient des textures photoréalistes classées dans diverses catégories : sols, caisses, végétaux, métaux, pierres, etc.
Exemples de textures incluses dans le pack
Que vous le téléchargiez ou non je fournirai quand même les textures utilisées dans l'exemple en fin de chapitre. Vous pouvez donc vous en contenter.
Format et taille
Nous utiliserons principalement deux formats pour les textures :
.jpg et .png.
Le format
.jpg est parfait pour les textures, car il donne les plus petites tailles de fichier sur des images complexes (comme les textures photoréalistes).
Le format
.png (24 bits) quant à lui est utilisé, car il gère très bien la transparence.
La largeur et la hauteur des textures doivent
impérativement être des puissances de 2 (
64,128,512,1024). En effet si elles ne le sont pas, les textures seront de toute façon redimensionnées en interne pour respecter cette contrainte et vous risquez donc de
perdre inutilement en
qualité.
En terme de
qualité visuelle, plus la résolution de la texture est grande, meilleur est le résultat. Le pack que je vous fournis contient principalement des textures haute-résolution (512x512) avec lesquelles vous n'aurez pas de mal à avoir des rendus de meilleure qualité que Half-Life premier du nom

(effets de lumière mis à part pour l'instant).
Utiliser SDL_Image pour charger une texture
Le code nécessaire pour créer une texture OpenGL à partir d'un tableau de pixels n'est pas extrêmement compliqué. Cependant la phase la plus pénible est le chargement d'un fichier image (.jpg, .bmp, .tga ou autre).
Heureusement pour nous
SDL_Image est là ; nous aurons simplement à l'utiliser pour qu'elle nous retourne une SDL_Surface à partir d'un nom de fichier.
Une fois cette surface créée, elle doit être
retournée verticalement car SDL et OpenGL n'ont pas les mêmes conventions. Vous avez dû le remarquer lors du chapitre sur les transformations car le (0,0) en OpenGL était
en bas à gauche alors que celui en SDL (comme indiqué dans le cours de M@teo) est en haut à gauche.
La dernière chose à faire est de convertir le tableau de pixels contenus dans la surface en texture OpenGL par des appels OpenGL appropriés.
Oh là là ! Ça a l'air compliqué tout ça...

Je vais réussir à faire ça moi ?
Savoir coder vous-mêmes cette phase n'est pas nécessaire pour la compréhension de la suite du chapitre. Le plus important est
l'utilisation des textures créées. Nous reviendrons plus en détail sur les appels en question lorsque nous verrons les textures procédurales mais pour l'instant je vous donne tout ça sur un plateau d'argent, voilà :
Dans l'archive, je vous fournis deux fichiers :
sdlglutils.h et
sdlglutils.cpp. J'ai choisi ce nom car j'y rajouterai petit à petit des fonctions utiles pour ce tuto qui ne sont là que pour nous simplifier la vie mais que vous auriez pu faire vous-mêmes avec un peu plus de connaissances.
La fonction qui nous intéresse pour l'instant est
loadTexture qui s'utilise très simplement :
Code : C++1
2 | #include "sdlglutils.h"
GLuint identifiant_texture = loadTexture("ma_texture.jpg");
|
Si vous êtes curieux vous pouvez regarder le code derrière mais il n'a rien de compliqué, juste ce que je vous ai expliqué plus haut (chargement de l'image, retournement, et création texture OpenGL).
Le type renvoyé est
GLuint soit l'équivalent d'un
unsigned int. Cependant je n'utiliserai jamais le type
unsigned int pour les textures pour ne pas être tenté dans mon code de faire des calculs dessus, en effet ce nombre retourné a une signification bien précise : c'est
l'identifiant de la texture OpenGL créée. À chaque fois que nous voudrons utiliser cette texture, il suffira d'utiliser cet identifiant.
Activer le texturing
Comme nous avons déjà créé des scènes en 3D sans texture nous savons que le texturing n'est pas activé par défaut. Pour l'activer il suffit donc d'appeler :
Code : C++
Voilà nous sommes prêts, nous savons charger une texture, nous savons activer le texturing. Maintenant voyons comment, en reprenant notre cube 3D du chapitre précédent, appliquer une texture sur un objet.