16.3 Les modifications à faire à l'initialisation

Il faut demander à OpenGl de générer les mipmaps au chargement de l'image. Donc dans la fonction bool loadTextureGl3(GLuint & id, const std::string & fichierImage) du fichier load_texture_Gl3.cpp.

Comme pour les modification précédentes, nous allons rajouter une macro pour pouvoir revenir à tout moment à l'ancien système d’inutilisation, sans les mipmaps :

1
#define __USE_MIP_MAP_OPENGL__

Ce qui fait que le fichier load_texture_Gl3.h, ressemble maintenant à ceci :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef LOAD_TEXTURE_Gl3_H
#define LOAD_TEXTURE_Gl3_H

#define GL3_PROTOTYPES 1
#include <GL3/gl3.h>
#include <iostream>
#include <string>
#include <math.h>
#include <SDL2/SDL.h>
#include <SDL/SDL_image.h>

#define __USE_MIP_MAP_OPENGL__

bool loadTextureGl3(GLuint & id, const std::string & fichierImage);

SDL_Surface* verticalMirror(const SDL_Surface *imageSource);

#endif

Maintenant changeons le fichier load_texture_Gl3.cpp.

La fonction bool loadTextureGl3(GLuint & id, const std::string & fichierImage) devient :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
bool loadTextureGl3(GLuint & id, const std::string & fichierImage){
	// Chargement de l'image dans une surface SDL
	SDL_Surface *imageSDL = IMG_Load(fichierImage.c_str());
	if(imageSDL == NULL){
		std::cout << "Erreur, le fichier " << fichierImage<< " n'existe pas" << std::endl;
		return false;
	}
	// Détermination du nombre de composantes
	GLenum format(0);
	if(imageSDL->format->BytesPerPixel == 3) format = GL_RGB;
	else if(imageSDL->format->BytesPerPixel == 4) format = GL_RGBA;
	else{   // Dans les autres cas, on arrête le chargement
		std::cout << "Erreur, format de l'image inconnu" << std::endl;
		SDL_FreeSurface(imageSDL);
		return false;
	}
	SDL_Surface* imageOpenGl = verticalMirror(imageSDL) /*imageSDL*/;
	SDL_FreeSurface(imageSDL); //on n'oublie pas de dégommer l'image de SDL
// 	Copie des pixels 
#ifdef __USE_MIP_MAP_OPENGL__
	//on s'occupe des mipmaps si on a l'option
	glEnable(GL_TEXTURE_2D);
	glGenTextures(1, &id);
	glBindTexture(GL_TEXTURE_2D, id);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
	glTexImage2D(GL_TEXTURE_2D, 0, imageOpenGl->format->BytesPerPixel, imageOpenGl->w, imageOpenGl->h, 0, format, GL_UNSIGNED_BYTE, imageOpenGl->pixels);
	glGenerateMipmap(GL_TEXTURE_2D);  //Generate num_mipmaps number of mipmaps here.
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4);
#else
	glTexImage2D(GL_TEXTURE_2D, 0, imageOpenGl->format->BytesPerPixel, imageOpenGl->w, imageOpenGl->h, 0, format, GL_UNSIGNED_BYTE, imageOpenGl->pixels);
	// Application des filtres
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
#endif
	
	glBindTexture(GL_TEXTURE_2D, 0);    // Déverrouillage
	SDL_FreeSurface(imageOpenGl);      //on n'oublie pas de dégommer l'image de OPENGL
	return true;
}

Voici les deux fichiers load_texture_Gl3.h et load_texture_Gl3.cpp modifiés :