Bonjour,

J'essaye de dessiner une image (partiellement) transparente dans le buffer de destination sans y parvenir. Mes étapes sont:
  1. Créer un fond opaque à l'aide de ClearColor(avec 1.0 en dernier paramètre) et glClear(GL_COLOR_BUFFER_BIT)
  2. Appliquer une texture ne contenant qu'un canal alpha avec glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA)


J'espérais ainsi obtenir un buffer dont le canal alpha est complémentaire à 1.0 de ma texture. Or si la couleur au niveau des zones opaques de la texture est bien devenue noire, le buffer semble toujours opaque. Je le détermine en faisant du blending d'une couleur opaque avec glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA). Ce blending se comporte comme si DST_ALPHA est 1.0.

Voici le code correspondant:
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
57
58
59
60
61
62
63
64
65
 
void Renderer::CreateScene()
{
    glGenTextures(1, &mTexID);
    glBindTexture(GL_TEXTURE_2D, mTexID);
 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 
    unsigned char *imageData = LoadMonocolour();  // Fournit une bitmap 64x128 monochrome 8bits par pixel
    glTexImage2D(GL_TEXTURE_2D, /*level*/0, GL_ALPHA8, 64, 128, /*border*/0, GL_ALPHA, GL_UNSIGNED_BYTE, imageData);
    free(imageData);
}
 
void Renderer::Draw(const wxSize &ClientSize)
{
    glViewport(0, 0, ClientSize.x, ClientSize.y);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glScalef(1.0, (float)ClientSize.x/ClientSize.y, 1.0);
    glMatrixMode(GL_MODELVIEW);
 
    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);  // vert de gris comme couleur de fond
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
 
    glBindTexture(GL_TEXTURE_2D, mTexID);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);  //-- "Trouer" le fond avec les zones opaques de la texture
 
    //-- Applique la texture sur une zone rectangulaire
    glBegin(GL_QUADS);
      glTexCoord2f(0.0f, 1.0f);
      glVertex2f(-0.5f, -1.0f);
      glTexCoord2f(1.0f, 1.0f);
      glVertex2f( 0.5f, -1.0f);
      glTexCoord2f(1.0f, 0.0f);
      glVertex2f( 0.5f,  1.0f);
      glTexCoord2f(0.0f, 0.0f);
      glVertex2f(-0.5f,  1.0f);
    glEnd();
 
 
    glDisable(GL_TEXTURE_2D);  //-- Désactiver la texture pour utiliser la couleur
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE);  //-- Utilise la transparence du buffer pour ne peindre que dans les "trous"
 
    glColor3f(1.0f, 0.0f, 1.0f);  //-- Couleur à faire apparaître dans les "trous" du fond
 
    //-- Applique la couleur sur la même zone rectangulaire
    //-- Sans aucun effet car manifestement la fonction GL_ONE_MINUS_DST_ALPHA retourne toujours 0
    //-- Note: J'ai utilisé d'autre valeurs que GL_ONE_MINUS_DST_ALPHA qui corroborent l'hypothèse. 
    glBegin(GL_QUADS);
      glVertex2f(-0.5f, -1.0f);
      glVertex2f( 0.5f, -1.0f);
      glVertex2f( 0.5f,  1.0f);
      glVertex2f(-0.5f,  1.0f);
    glEnd();
 
    glFlush();
}
Je suis débutant en OpenGL et pour avoir longtemps lutté contre des oublis de glEnable, j'imagine que j'ai oublié un de ces enable magique! Mais je n'arrive pas à savoir lequel.