2011-01-05 2 views
0

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:

Screenshot

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?

Répondre

9

Préparez-vous pour une sortie dans la mémoire.

glTexImage2D(GL_TEXTURE_2D, 0, 3, ..., ..., 0, GL_RGBA, GL_UNSIGNED_BYTE, ...); 

3 là est votre problème. La partie droite des arguments (RGBA + UNSIGNED_BYTE) mentionne quel est le type de données source. le type de données de destination est le troisième argument (c'est-à-dire que GL va stocker votre texture).

En fait, lorsque GL 1.0 a été créé, texturing était un peu plus simple. Donc, le seul paramètre était nécessaire de préciser le nombre de canaux que vous vouliez pour votre texture finale, la cartographie

1=GL_LUMINANCE 
2=GL_LUMINANCE_ALPHA 
3=GL_RGB 
4=GL_RGBA 

Je crois que cette utilisation est déconseillée, mais comme vous pouvez le voir, fonctionne toujours. Donc, ... Votre texture est stockée sous GL_RGB, sans alpha.

Le reste est une application simple de la spécification. Un remplacement sur une texture au format interne RVB fait final_color=texture_color et final_alpha=fragment_alpha (alias la source de glColor dans votre cas). Voir this man page pour les tables complètes de l'environnement de texture basé sur des formats internes.

+0

Merci, c'était le problème. –

Questions connexes