Pregunta

Estoy tratando de dibujar una textura parcialmente transparente por encima de un quad de color, por lo que el color brilla a través de la parte transparente, hacer un bosquejo. Este es el código:

// 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 textura es negro, excepto donde tiene el contorno de un castillo; esa parte es transparente (y blanco). El comportamiento esperado, por lo tanto, es un rectángulo negro con un contorno verde. Lo que me pasa en cambio, es un rectángulo de color verdoso con un contorno blanco:

pantalla

Eso es con alfa en el conjunto quad textura a 0,5. Si por el contrario lo fijo a 1,0, que vuelva la textura sin transparencia, como en (bueno, no se puede publicar la segunda pantalla como un enlace, sino que está en s330.photobucket.com/albums/l412/TWBWar/?action = view & = actuales replace10.png). Con alfa de 0, aparece un rectángulo verde. Por lo tanto, me parece que el quad textura está siendo mezclado con el valor alfa conjunto por glColor4d, en lugar del valor de la textura, que es lo que esperaba de GL_REPLACE. (Experimenté con GL_DECAL y GL_MODULATE también, pero yo no era capaz de obtener el comportamiento que quería.) ¿Puede alguien decirme cómo hacer uso de la textura de OpenGL, no el cuádruple, alfa para la mezcla?

¿Fue útil?

Solución

Prepárate para un viaje al pasado.

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

Eso en 3 existe el problema. La parte derecha de los argumentos (RGBA + UNSIGNED_BYTE) menciona lo que su tipo de datos fuente es. destino tipo de datos es el tercer argumento (es decir, lo GL almacenará su textura como).

Como sucede, cuando se creó GL 1.0, texturizado era algo más sencilla. Por lo que el parámetro sólo se requiere para especificar el número de canales que quería para su textura final, con el mapeo

1=GL_LUMINANCE
2=GL_LUMINANCE_ALPHA
3=GL_RGB
4=GL_RGBA

Creo que este uso no es recomendable, pero como se puede ver, todavía funciona.

Así que ... Su textura se almacena como GL_RGB, sin alfa.

El resto es simple aplicación de la especificación. Un reemplazar en una textura con el formato interno RGB hace final_color=texture_color y final_alpha=fragment_alpha (también conocido como la fuente de la glColor en su caso). Ver esta página hombre de las mesas llenas de textura entorno basado en formatos internos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top