J'essaie de dessiner une texture partiellement transparente au-dessus d'un quad coloré, de sorte que la couleur brille à travers la partie transparente, en faisant un contour. Voici le code:Les textures transparentes dans OpenGL ne remplacent pas alpha alpha
// Setup
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
// (...)
// Get image bits in object 't'
glBindTexture(GL_TEXTURE_2D, textureIDs[idx]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
// (...)
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
// Underlying coloured quad
glColor4d(0.0, 1.0, 0.0, 1.0);
glBindTexture(GL_TEXTURE_2D, 0);
glBegin(GL_QUADS);
glVertex3d(coords11.first, coords11.second, -0.001);
glVertex3d(coords12.first, coords12.second, -0.001);
glVertex3d(coords21.first, coords21.second, -0.001);
glVertex3d(coords22.first, coords22.second, -0.001);
glEnd();
// Textured quad
glColor4d(1.0, 1.0, 1.0, 0.5);
glBindTexture(GL_TEXTURE_2D, textureIDs[castleTextureIndices[0]]);
glBegin(GL_QUADS);
glTexCoord2d(0.0, 0.0); glVertex3d(coords11.first, coords11.second, 0);
glTexCoord2d(1.0, 0.0); glVertex3d(coords12.first, coords12.second, 0);
glTexCoord2d(1.0, 1.0); glVertex3d(coords21.first, coords21.second, 0);
glTexCoord2d(0.0, 1.0); glVertex3d(coords22.first, coords22.second, 0);
glEnd();
La texture est noir, sauf si elle a la silhouette d'un château; cette partie est transparente (et blanche). Le comportement attendu est donc un rectangle noir avec un contour vert. Ce que je reçois à la place est un rectangle vert avec un contour blanc:
C'est avec alpha sur le quad texturé mis à 0,5. Si à la place je le mets à 1.0, je récupère la texture sans transparence, comme dans (eh bien, je ne peux pas poster la seconde capture d'écran comme un lien, c'est à s330.photobucket.com/albums/l412/TWBWar/?action = vue & current = replace10.png). Avec alpha de 0, j'obtiens un rectangle vert. Il me semble donc que le quad texturé est mélangé en utilisant la valeur alpha définie par glColor4d, au lieu de la valeur de la texture, ce que j'attendais de GL_REPLACE. (J'ai aussi expérimenté avec GL_DECAL et GL_MODULATE, mais je n'ai pas réussi à obtenir le comportement que je voulais.) Quelqu'un peut-il me dire comment utiliser OpenGL pour utiliser la texture, pas le quad, l'alpha pour le mélange?
Merci, c'était le problème. –