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.
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_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
Cela n'a pas fonctionné et la couleur apparaît sur l'ensemble du rectangle, pas seulement les sections dessinées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part glBlendFunc(GL_DST_ALPHA, GL_SRC_COLOR);
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 :
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é.
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); }
Quelqu'un aurait-il une solution soit pour corriger ce code, soit pour obtenir différemment le même résultat ?
Merci d'avance.
Partager