2010-07-02 19 views
7

Obtuve 2 imágenes png, que se utilizan como texturas en una aplicación Qt/C++ 2D OpenGL. El primero se usa como un tipo de terreno "medio" y el segundo se usa como un "objeto" que se representa "ontop" (Nota: todos tienen el mismo valor z atm, obtengo el comportamiento deseado al representarlo en un orden definido). El "objeto" -textura es parcialmente translúcido. La textura de "middleground" es en su mayoría sólida. El problema es que la parte translúcida de mi textura de "objeto" tiene el color de fondo sólido y no la textura de "plano intermedio".Textura translúcida OpenGL sobre otra textura

¿Algún consejo sobre cómo lograr esto?

Siguiendo falgs OpenGL se utilizan para mis texturas de renderizado

glEnable (GL_TEXTURE_2D); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glEnable (GL_BLEND); 
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

Gracias por cualquier ayuda.

Editar:

Más código:

glColor4f(1.0f, 1.0f, 1.0f, 1.0f); 

glEnable(GL_DEPTH_TEST); 
glDepthMask(GL_TRUE); 

glEnable(GL_ALPHA_TEST); 
glAlphaFunc(GL_GREATER, 0.1f); 

glEnable(GL_TEXTURE_2D); 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glBindTexture(GL_TEXTURE_2D, c->_texture); 

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

glBegin(GL_QUADS); 
{ 
    glTexCoord2i(0,0); 
    glVertex2i(-128,-128); 

    glTexCoord2i(0,1); 
    glVertex2i(-128,128); 

    glTexCoord2i(1,1); 
    glVertex2i(128,128); 

    glTexCoord2i(1,0); 
    glVertex2i(128,-128); 

} 
glEnd(); 

glDisable(GL_TEXTURE_2D); 

glDisable(GL_ALPHA_TEST); 
glDisable(GL_DEPTH_TEST); 

Editar: ¿Cómo cargo mi textura y por lo que yo puedo decir que lo carga con el canal alfa

QImage img("./images/dummycar.png","PNG"); 
QImage t(QGLWidget::convertToGLFormat(img)); 
glGenTextures(1, &_texture); 
glBindTexture(GL_TEXTURE_2D, _texture); 
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 

Captura de pantalla : http://img824.imageshack.us/img824/1912/blackbox.png

El Skyimage es el "segundo plano", el fondo es negro sólido.

+0

Las capturas de pantalla con explicaciones serían agradables. – SigTerm

Respuesta

7
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); 

Usted está especificando 3 canales para el internalFormat, por lo que es RGB, RGBA no. Intenta usar GL_RGBA en esa posición.

+1

Sabía que era algo estúpido. Muchas gracias, eso me salvó el día :) – drahnr

4

¿Ha intentado tocar el violín con glAlphaFunc? Puede usarlo para descartar el dibujo de las partes translúcidas de la textura de su objeto en función del valor alfa.

¿Qué pasa con cualquiera

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND)

o

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)?

Espero que ayude.

+0

Eso no funcionó. Intenté glEnable (GL_ALPHA_TEST); glAlphaFunc (GL_GREATER, 0.1f); pero no hay cambio GL_MODULATE no cambió nada, GL_BLEND cambió el color, pero la "caja" alrededor de mi objeto seguía allí – drahnr

+1

Esto fue realmente útil para mí. Usando BB, cuando habilité la prueba alfa y usé GL_GREATER, funcionó como un amuleto. – bobobobo

3

Si está procesando una textura por objeto, entonces necesita usar glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE).

Si la textura todavía tiene "caja" alrededor, incluso después de eso, se cargó sin canal alfa.

funciona esto perfectamente para mí:

textura
glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glBindTexture(GL_TEXTURE_2D, texture2->tex); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
    glColor4f(0.5f, 1.0f, 0.5f, 0.5f); 
    glBegin(GL_TRIANGLE_FAN); 
    glTexCoord2f(0, 0); 
    glVertex2f(x, y); 
    glTexCoord2f(1, 0); 
    glVertex2f(x + texture2->width, y); 
    glTexCoord2f(1, 1); 
    glVertex2f(x + texture2->width, y+ texture2->height); 
    glTexCoord2f(0, 1); 
    glVertex2f(x, y + texture2->height); 
    glEnd(); 
    glDisable(GL_BLEND); 

semitransparente, teñido por último color.

Si "tener una caja alrededor de la textura" no describe su problema, entonces necesita publicar capturas de pantalla.

--EDIT--

Datos actualizados basados ​​en your screenshot.

Necesita PRIMERO renderizar el fondo, y luego renderizar el automóvil. Verá el color de fondo porque incluso si la superficie es transparente, rellena z-buffer con valores, y como el fondo está debajo del carro, se vuelve invisible.

Cuando está renderizando objetos semitransparentes, debe seguir esas reglas.

  1. Todos los objetos no transparentes deben representarse antes que los objetos semitransparentes. Siempre.

  2. Todos los objetos transparentes deben representarse en el objeto de atrás hacia adelante. Los objetos más alejados deberían representarse primero, los objetos más cercanos deberían representarse en segundo lugar.

  3. Si no es posible el renderizado en orden de retorno (partículas sin clasificar con combinación GL_ADD), la escritura en el búfer de profundidad debe desactivarse utilizando glDepthMask (GL_FALSE). Si no lo haces, obtendrás artefactos feos. (como el de tu captura de pantalla).

+0

¿Esto muestra las texturas subyacentes? Hasta ahora me funciona, pero mi problema es que quiero ver otro objeto de textura más allá del que dibujo. Pero en vez de ATM, obtengo el color de fondo (negro). Captura de pantalla: http://img824.imageshack.us/img824/1912/blackbox.png – drahnr

+0

@ soxs060389: He actualizado mi respuesta. Deberías PRIMERO ceder terreno, y DESPUÉS de eso renderizar el coche. No funcionará si lo haces en orden inverso. – SigTerm

+0

Lo estaba haciendo desde la hora zer0. El automóvil es y siempre fue el último elemento que se procesó. – drahnr

Cuestiones relacionadas