8.9.1 Un premier essai

Il n'y a quasiment rien à rajouter dans la classe AppTest pour que ça fonctionne avec des textures.

Dans la fonction init rajouter ceci entre la déclaration des évènements et l'initialisation du GLUquadric* :

1
glEnable(GL_TEXTURE_2D);

On prévient OpenGl que l'on va utiliser des textures.

Voilà à quoi ressemble la fonction init maintenant :

1
2
3
4
5
6
7
8
9
10
11
12
void AppTest::init(){
	this->addKeyEvent("forward", SDLK_z, false);
	this->addKeyEvent("backward", SDLK_s, false);
	this->addKeyEvent("right", SDLK_d, false);
	this->addKeyEvent("left", SDLK_q, false);
	this->addKeyEvent("turnUp", SDLK_UP, false);
	this->addKeyEvent("turnDown", SDLK_DOWN, false);
	this->addKeyEvent("turnRight", SDLK_RIGHT, false);
	this->addKeyEvent("turnLeft", SDLK_LEFT, false);
	glEnable(GL_TEXTURE_2D);
	p_params = gluNewQuadric();
}

Toujours dans le fichier apptest.cpp ajoutez au début (juste après l'include) :

1
const std::string TERRE = "../carte-terre.jpg";

Vous trouverez cette image ici.

Mettez la dans le dossier parent de vos sources (normalement il aurait fallu faire un dossier et mettre l'image dedans, on le fera quand ça vaudra le coup).

Ajoutez dans apptest.h une variable privée :

1
GLuint p_textureTerre;

Voici à quoi ressemble le fichier apptest.h :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef APPTEST_H
#define APPTEST_H

#include "sdlopengl_app.h"

class AppTest : public SDLOpenGl_app {
	public:
		AppTest(double width = 640, double height = 480, double near = 1, double far = 1000, double angle = 70, const std::string & titre = "SDL_Application", const std::string & icon = "");
		//destructeur
		virtual ~AppTest();
		
	protected:
		virtual void draw();
		virtual void update(float dt);
		
	private:
		void init();
		GLUquadric* p_params;
		GLuint p_textureTerre; 
};

#endif

Ensuite retournez dans la fonction init de apptest.cpp et écrivez juste avant l'initialisation du GLUquadric* :

1
p_textureTerre = loadTexture(TERRE.c_str());

Maintenant la fonction init ressemble à ceci :

1
2
3
4
5
6
7
8
9
10
11
12
13
void AppTest::init(){
	this->addKeyEvent("forward", SDLK_z, false);
	this->addKeyEvent("backward", SDLK_s, false);
	this->addKeyEvent("right", SDLK_d, false);
	this->addKeyEvent("left", SDLK_q, false);
	this->addKeyEvent("turnUp", SDLK_UP, false);
	this->addKeyEvent("turnDown", SDLK_DOWN, false);
	this->addKeyEvent("turnRight", SDLK_RIGHT, false);
	this->addKeyEvent("turnLeft", SDLK_LEFT, false);
	glEnable(GL_TEXTURE_2D);
	p_textureTerre = loadTexture(TERRE.c_str());
	p_params = gluNewQuadric();
}

Maintenant il faut mettre la texture sur la sphère, pour cela, écrivez au tout début de la fonction draw dans le fichier apptest.cpp :

1
2
3
glBindTexture(GL_TEXTURE_2D, p_textureTerre);
gluQuadricDrawStyle(p_params, GLU_FILL);
gluQuadricTexture(p_params, GL_TRUE);

Traduction :

Il faut d'abord bloquer la texture que l'on veut utiliser :

1
glBindTexture(GL_TEXTURE_2D, p_textureTerre);

Ensuite on choisit le mode d'affichage (en fait c'est à cela que sert le GLUquadric*) :

1
gluQuadricDrawStyle(p_params, GLU_FILL);

Ici GLU_FILL signifie que l'on veut afficher la sphère avec sa face pleine (lisse comme une balle normale).

Si on met textit{GLU_LINE}, la sphère sera affichée comme un maillage, et la texture sera plaquée sur le maillage.

Enfin on dit à OpenGl que l'on veut plaquer la texture :

1
gluQuadricTexture(p_params, GL_TRUE);

Voici à quoi ressemble la fonction draw maintenant :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void AppTest::draw(){
	glBindTexture(GL_TEXTURE_2D, p_textureTerre);
	gluQuadricDrawStyle(p_params, GLU_FILL);
	gluQuadricTexture(p_params, GL_TRUE);
	
	glBegin(GL_QUADS);
		glColor3ub(255, 0, 0);
		glVertex3d(10.0, 10.0, 0.0);
		glVertex3d(10.0, -10.0, 0.0);
		glVertex3d(-10.0, -10.0, 0.0);
		glVertex3d(-10.0, 10.0, 0.0);
	glEnd();
	
	glTranslated(0.0, 0.0, 2.0);
	glColor3ub(255, 255, 255);
	gluSphere(p_params, 1.0, 20, 20);
	
	glTranslated(5.0, 5.0, 5.0);
	
	glColor3ub(0, 0, 255);
	gluSphere(p_params, 1.0, 20, 20);
}

Compilez tout ça, et je vous laisse la surprise.

Bon, en fait vous verrez ceci :

plop

Heu... c'est grave docteur.

Oui, alors, il y a de quoi être étonné, mais c'est tout à fait normal, on demande à OpenGl de plaquer une texture, il la plaque... mais partout.

Et il faut dire que l'on à pas plaqué la texture ou il fallait, mais au moins vous savez ce qui vous arrivera si vous vous plantez pour plaquer votre texture.