Question

Je suis en train de dessiner une texture partiellement transparente au-dessus d'un quad de couleur, de sorte que la couleur brille à travers la partie transparente, ce qui rend les grandes lignes. Voici le code:

// 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 blanc). 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:

Capture d'écran

C'est en alpha sur le quad texturé fixé à 0,5. Si, au contraire je l'ai mis à 1,0, je rentrerai la texture sans transparence, comme dans (oh bien, ne peut pas poster la seconde capture d'écran comme un lien, il est à s330.photobucket.com/albums/l412/TWBWar/?action = view & courant = replace10.png). Avec alpha de 0, je reçois un rectangle vert. Il me semble donc que le quad texturé est mélangé en utilisant la valeur alpha fixée par glColor4d, au lieu de la valeur de la texture, qui est ce que je pensais de GL_REPLACE. (J'ai expérimenté avec GL_DECAL et GL_MODULATE aussi bien, mais je n'ai pas pu obtenir le comportement que je voulais.) Quelqu'un peut-il me dire comment faire OpenGL utiliser la texture, pas le quad, l'alpha pour le mélange?

Était-ce utile?

La solution

Préparez-vous pour un voyage dans la mémoire.

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

Ce 3 là est votre problème. La partie droite des arguments (RGBA + UNSIGNED_BYTE) mentionne ce que votre type de données source est. destination type de données est le troisième argument (à savoir ce que GL va stocker votre texture comme).

Comme il arrive, quand GL 1.0 a été créé, texturation é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, avec la mise en correspondance

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 encore.

Alors ... Votre texture est stockée sous forme GL_RGB, sans alpha.

Le reste est simple application de la spécification. Une remplacer sur une texture au format interne RGB fait final_color=texture_color et final_alpha=fragment_alpha (alias la source de glColor dans votre cas). Voir cette page de manuel pour les tables pleines de l'environnement de texture à base de formats internes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top