Bonjour,

Je réalise un jeu 2D dans lequel j'aimerais que le joueur soit en mesure de personnaliser la couleur de son véhicule.

Le véhicule est dessiné grâce à une texture 2D ayant une forme rectangulaire à l'origine mais dont les sections inutiles sont effacées grâce au blending alpha.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
J'ai pensé à appliquer une couleur personnalisable sur la texture en utilisant un rectangle coloré de même dimension que la texture. J'ai d'abord pensé que là encore, le blending serait suffisant pour me débarasser des bords inutiles du rectangle :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
glBlendFunc(GL_DST_ALPHA, GL_SRC_COLOR);
Cela n'a pas fonctionné et la couleur apparaît sur l'ensemble du rectangle, pas seulement les sections dessinées.

En potassant, j'ai décidé d'employer le stencil dont le but semble bien de restreindre la zone de dessin. Ça me donne le code suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
44
45
46
47
48
49
50
51
52
53
54
55
56
void Sprite::affiche()
{
	traceStencil();
	testStencil();
}
 
void Sprite::traceStencil()
{
	glClear(GL_STENCIL_BUFFER_BIT);
	glDisable(GL_DEPTH_TEST);
	glEnable(GL_STENCIL_TEST);
	glStencilFunc(GL_ALWAYS, 1, 1);
	glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
	glEnable(GL_ALPHA_TEST);
	glAlphaFunc(GL_GREATER, 0.1f) ;
		traceTexture();
	glDisable(GL_ALPHA_TEST);
}
 
void Sprite::traceTexture()
{
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, texture->textu);
	glColor4f(1.0f,1.0f,1.0f,alpha);
	glBegin(GL_QUADS);
		creeSommetHautGauche();
		creeSommetHautDroite();
		creeSommetBasDroite();
		creeSommetBasGauche();	
	glEnd();
	glDisable(GL_TEXTURE_2D);
}
 
void Sprite::testStencil()
{
	glStencilFunc(GL_EQUAL, 1, 1);
	glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
		traceMasque();
	glDisable(GL_STENCIL_TEST);
	glEnable(GL_DEPTH_TEST);
}
 
void Sprite::traceMasque()
{
	glBlendFunc(GL_ZERO, GL_SRC_COLOR);
	glEnable(GL_BLEND);
	glColor4f(couleurmasque.rouge, couleurmasque.vert, couleurmasque.bleu, alpha);
	glBegin(GL_QUADS);
		creeSommet(HautGauche);
		creeSommet(HautDroite);
		creeSommet(BasDroite);
		creeSommet(BasGauche);		
	glEnd();
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	glEnable(GL_BLEND);
}
Je n'entre pas plus dans le détail des fonctions de dessin, hors-sujet ici, mais comme vous pouvez le constater, j'ai quand même ajouté un test Alpha afin d'essayer de me débarrasser des zones vides, mais rien n'y fait le rectangle est toujours entièrement colorié.

Quelqu'un aurait-il une solution soit pour corriger ce code, soit pour obtenir différemment le même résultat ?

Merci d'avance.