23 votes

La transparence des textures OpenGL ne fonctionne pas

J'ai une texture OpenGL qui est liée à un simple quad.

Mon problème est le suivant : Ma texture est une image de 128x128 pixels. Je ne remplis qu'environ 100x60 pixels de cette image, les autres pixels sont transparents. Je l'ai sauvegardée dans un fichier .png. Lorsque je dessine, la partie transparente de la texture liée est blanche.

Disons que j'ai un arrière-plan. Lorsque je dessine ce nouveau quad sur cet arrière-plan, je ne peux pas voir la partie transparente de ma texture.

Des suggestions ?

Code :

// Init code...
gl.glEnable(gl.GL_TEXTURE_2D);
gl.glDisable(gl.GL_DITHER);
gl.glDisable(gl.GL_LIGHTING);   
gl.glDisable(gl.GL_DEPTH_TEST);

gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE); 

// Drawing code...
gl.glBegin(gl.GL_QUADS);
gl.glTexCoord2d(0.0, 0.0);
gl.glVertex3f(0.0f, 0.0f, 0.0f);
gl.glTexCoord2d(1.0, 0.0);
gl.glVertex3f(1.0f, 0.0f, 0.0f);
gl.glTexCoord2d(1.0, 1.0);
gl.glVertex3f(1.0f, 1.0f, 0.0f);
gl.glTexCoord2d(0.0, 1.0);
gl.glVertex3f(0.0f, 1.0f, 0.0f);
gl.glEnd();

J'ai presque tout essayé, de l'activation du blending au passage à GL_REPLACE, mais je n'arrive pas à le faire fonctionner.

Edit:

// Texture. Have tested both gl.GL_RGBA and gl.GL_RGB8.
gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, (int)gl.GL_RGBA, imgWidth, imgHeight,
            0, gl.GL_BGR_EXT, gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);

45voto

Matias Valdenegro Points 16473

Vérifiez que votre texture est au format RGBA, activez le blending et définissez la fonction de blending :

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Et dessiner la texture. Si votre texture n'est pas RGBA, il n'y a pas d'alpha et le blending ne servira à rien.

EDIT : Depuis que vous avez posté votre code, je peux repérer une erreur sérieuse :

glTexImage2D(gl.GL_TEXTURE_2D, 0, (int)gl.GL_RGBA, imgWidth, imgHeight,  0, gl.GL_BGR_EXT, gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);

Vous dites à GL que la texture a un format interne RGBA, mais les données bitmap ont un format BGR, donc pas d'alpha dans vos données de texture. Cela suppose que alpha = 1.0.

Pour y remédier, chargez votre PNG au format RGBA et utilisez GL_RGBA comme paramètres de format interne et de format pour glTexImage2D.

1voto

Oliver Zendel Points 340

De même, si vous effectuez un rendu dans un tampon d'images et copiez le résultat dans une texture, vérifiez que l'alpha est activé dans le tampon d'images. Par exemple, lorsque vous utilisez osgViewer, cela peut être réalisé en (faites-le avant d'appeler setUpViewInWindow) :

osg::DisplaySettings *pSet = myviewer.getDisplaySettings();
if(pSet == NULL)
   pSet = new osg::DisplaySettings();
pSet->setMinimumNumAlphaBits(8);
myviewer.setDisplaySettings(pSet);

et sous qt, il devrait fonctionner avec (à partir de http://forum.openscenegraph.org/viewtopic.php?t=6411 ):

QGLFormat f;
f.setAlpha( true ); //enables alpha channel for this format
QGLFormat::setDefaultFormat( f ); //set it as default before instantiations
setupUi(this); //instantiates QGLWidget (ViewerQT)

Normalement, il est préférable d'effectuer le rendu directement dans un frame buffer, mais j'ai découvert cela en préparant un code ancien et au début, il était très difficile de le trouver.

0voto

eznme Points 13158

When I'm drawing, the transparent part of the binded texture is white.

Cela signifie que votre analyseur PNG a converti les régions transparentes en blanc. Si vous voulez rendre des couches transparentes avec OpenGL, vous ne dépendez pas typiquement des fichiers de texture pour conserver la transparence, mais vous utilisez plutôt la fonction GLBlendFunc() . Plus d'informations ici :

http://www.opengl.org/resources/faq/technical/transparency.htm

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X