2009-04-15 25 views
5

He intentado investigar esto en Google, pero no me parece que haya respuestas simples y coherentes. ¿Esto es porque no es simple, o porque no estoy usando las palabras clave correctas?¿Cómo puedo hacer que las texturas sean transparentes en OpenGL?

Sin embargo, este es el progreso que he hecho hasta ahora.

  1. Creado 8 vértices para formar 2 cuadrados.
  2. Creó una textura con un valor alfa de 200 bits (por lo tanto, aproximadamente 80% transparente).
  3. Asignado la misma textura a cada cuadrado, que se muestra correctamente.
  4. Noté que cuando uso una textura con 255 alfa, aparece más brillante.

El inicio es algo como lo siguiente:

glClearColor(0.0, 0.0, 0.0, 0.0); 
glShadeModel(GL_FLAT); 
glEnable(GL_DEPTH_TEST); 

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

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glGenTextures(1, textureIds); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

int i, j; 
GLubyte pixel; 
for (i = 0; i < TEXTURE_HEIGHT; i++) 
{ 
    for (j = 0; j < TEXTURE_WIDTH; j++) 
    { 
     pixel = ((((i & 0x8) == 0)^((j & 0x8) == 0)) * 255); 
     texture[i][j][0] = pixel; 
     texture[i][j][1] = pixel; 
     texture[i][j][2] = pixel; 
     texture[i][j][3] = 200; 
    } 
} 

glBindTexture(GL_TEXTURE_2D, textureIds[0]); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

glTexImage2D(
    GL_TEXTURE_2D, 0, GL_RGBA, 
    TEXTURE_WIDTH, TEXTURE_HEIGHT, 
    0, GL_RGBA, GL_UNSIGNED_BYTE, texture); 

Esto es algo similar al fragmento de código de la página 417 del libro, OpenGL Guía de programación y crea un patrón de prueba.

Y entonces, la función de visualización contiene ...

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glEnable(GL_TEXTURE_2D); 

// Use model view so that rotation value is literal, not added. 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 

// ... translation, etc ... 

glBindTexture(GL_TEXTURE_2D, textureIds[0]); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, +1.0, 0.0); // top left 
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0); // bottom left 
glTexCoord2f(1.0, 1.0); glVertex3f(+1.0, -1.0, 0.0); // bottom right 
glTexCoord2f(1.0, 0.0); glVertex3f(+1.0, +1.0, 0.0); // top right 
glEnd(); 

    // not neccecary to repeat, just good practice 
glBindTexture(GL_TEXTURE_2D, textureIds[0]); 
glBegin(GL_QUADS); 
glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, +1.0, -1.0); // top left 
glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, -1.0, -1.0); // bottom left 
glTexCoord2f(1.0, 1.0); glVertex3f(+1.5, -1.0, -1.0); // bottom right 
glTexCoord2f(1.0, 0.0); glVertex3f(+1.5, +1.0, -1.0); // top right 
glEnd(); 

glFlush(); 
glDisable(GL_TEXTURE_2D); 

glPopMatrix(); 

SwapBuffers(); 

lo tanto, esto haga que el segundo cuadrado en el fondo; Puedo ver esto, pero parece que está siendo mezclado con el fondo (supongo que esto porque son más oscuro con alfa 200 bits a 255 bits) en lugar de la textura detrás ...

Transparent textures not working

Como puedes ver, sin transparencia ... ¿Cómo puedo solucionar esto?

+0

Tienes TEXTURE_HEIGHT dos veces en ese bucle en lugar de TEXTURE_WIDTH – shoosh

+0

Ah gracias, pero eso no importa, ya que ambos son 64. –

Respuesta

9

Así que la otra respuesta que estaba aquí pero fue eliminada lo mencionó: generalmente, para que la fusión alfa funcione correctamente, debe ordenar los objetos desde lejos hasta cerca en el sistema de coordenadas de la cámara.
Es por eso que sus polígonos se mezclan con el fondo. Puede confirmar que este es realmente el problema al deshabilitar la prueba de profundidad. Sin la prueba de profundidad, se muestran todos los fragmentos y podrás ver la mezcla alfa.

Más sobre esto en this page.

Cuestiones relacionadas