texturas - La transparencia de textura OpenGL no funciona
texturas en opengl ejemplos (3)
Tengo una textura OpenGL que está vinculada a un simple quad.
Mi problema es: mi textura es 128x128 píxeles de imagen. Solo estoy rellenando unos 100x60 píxeles en esa imagen, los otros píxeles son transparentes. Lo guardé en un archivo .png. Cuando estoy dibujando, la parte transparente de la textura ligada es blanca.
Digamos que tengo un fondo. Cuando dibujo este nuevo quad en este fondo, no puedo ver a través de la parte transparente de mi textura.
¿Alguna sugerencia?
Código:
// 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();
He intentado casi todo, desde habilitar la mezcla para cambiar a GL_REPLACE, sin embargo no puedo hacer que funcione.
Editar:
// 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);
Además, si se procesa en un búfer de cuadros y se copia el resultado en una textura, compruebe que el búfer de cuadros tiene alfa activado. Por ejemplo, cuando se usa osgViewer, esto puede lograrse mediante (haga esto antes de llamar a setUpViewInWindow):
osg::DisplaySettings *pSet = myviewer.getDisplaySettings();
if(pSet == NULL)
pSet = new osg::DisplaySettings();
pSet->setMinimumNumAlphaBits(8);
myviewer.setDisplaySettings(pSet);
y bajo qt debería funcionar con (desde 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)
Normalmente, es mejor renderizar directamente en un búfer de fotogramas, pero surgió esto mientras preparaba un código heredado y al principio fue muy difícil encontrarlo.
Verifique que su textura tenga formato RGBA, habilite la mezcla y configure la función de fusión:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Y dibuja la textura. Si su textura no es RGBA, entonces no hay alfa y la mezcla no hará nada.
EDITAR: Desde que publicó su código, puedo detectar un error grave:
glTexImage2D(gl.GL_TEXTURE_2D, 0, (int)gl.GL_RGBA, imgWidth, imgHeight, 0, gl.GL_BGR_EXT, gl.GL_UNSIGNED_BYTE, bitmapdata.Scan0);
Le está diciendo a GL que la textura tiene RGBA interno de formato, pero que los datos de mapa de bits tienen formato BGR, por lo tanto, no hay alfa de sus datos de textura. Esto supone alfa = 1.0.
Para corregirlo, cargue su PNG con formato RGBA y use GL_RGBA como formato interno y parámetros de formato para glTexImage2D.
When I''m drawing, the transparent part of the binded texture is white.
Eso significa que su analizador PNG convirtió las regiones transparentes al valor de blanco. Si desea representar capas transparentes con OpenGL, normalmente no depende de los archivos de textura para mantener la transparencia, sino que utiliza GLBlendFunc()
. Más información aquí:
http://www.opengl.org/resources/faq/technical/transparency.htm