Le mipmapping sous OpenGL sous Windows
Petit Problème rencontré:
Je reprends le code du chapitre précédent pour le modifier un peu...
La rotation est figée à 45°, et je fais une homothétie sur le cube...
et vous constatez un petit problème:
Des carrés apparaissent dans la texture !
En fait, nous sommes partis d'une assez petite texture, pour afficher celle-ci sur la surface de notre objet, OpenGL a donc été obligé d'agrandir l'image (Le filtre d'agrandissement positionné).
Vous allez alors me répondre qu'il suffit d'avoir une texture plus grande...
Oui, mais alors si maintenant vous éloignez le cube, OpenGL sera obligé d'utiliser un filtre pour réduire la taille de la texture. L'ennui, c'est qu'il fera cela sur un nombre important de texel (n'oubliez pas qu'il y a 4 octets par texels !) Le traitement risque alors d'être long...
Le mipmapping
La solution va donc être de charger la texture dans différentes tailles. OpenGL se chargera de trouver la texture répondant le mieux en taille par rapport à celle de la surface à afficher.
Et pour cela, vous utiliserez la fonction glTexImage2D() déjà vu.
void glTexImage2D(GLenum target,
GLint level,
GLint components,
GLsizei width,
GLsizei height,
GLint border,
GLenum format,
GLenum type,
const GLvoid *pixels)
avec level qui valait jusqu'ici 0 pour en fait indiquer l'image de base, les autres valeurs indiquant les réductions d'images.
Il vous faut donc avoir votre texture dans les différentes tailles, ce qui peut devenir lourd !
Ou, utiliser une fonction qui fait cela très bien:gluBuild2DMipmaps()
int gluBuild2DMipmaps(GLenum target,
GLint components,
GLint width,
GLint height,
GLenum format,
GLenum type,
const void *data)
La fonction fait appel à gluScaleImage() pour générer différentes images réduites puis lance glTexImage2D() pour stocker les textures dans ces différentes tailles.
Autre avantage,
cette fonction accepte des images qui ne sont pas dans des puissances de 2,
elle fera alors automatiquement une correction de celle-ci pour être en
puissance de 2.
Les images réduites
seront forcement en puissance de 2.
Code
Bon soyons sérieux, il n'y a rien de bien difficile, alors reprenez le code précédent, et remplacer la fonction glTexImage2D() par gluBuild2DMipmaps() par exemple...