2011-12-19 9 views
5

Tengo textura con alfa. Y quiero teñirlo con un poco de color, por lo que será de color dependiendo del valor alfa del color, pero la opacidad general se definirá solo por la textura alfa.OpenGL ES: Cómo teñir la textura con el color

Esto es similar a la texturización múltiple pero con color en lugar de segunda textura. ¿Cómo hacerlo?

(Actualizado) He intentado configurar el combinador de texturas. El color está teñido bien, pero hay un problema con la alfa, no toma valor de la textura (como la máscara). Mi código en este momento:

glActiveTexture (GL_TEXTURE0); // do we need stage #1? 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE); 
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (GLfloat*) &tintColor_); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_CONSTANT); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_ONE_MINUS_SRC_ALPHA); 
// this doesn't work for alpha: 
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 

Imágenes:

No teñido:

enter image description here

Tint con RGBA = (0, 0,5, 1, 0,5):

enter image description here

+0

Su código parece correcto para mí. ¿Podría adjuntar una captura de pantalla del problema alfa o describir lo que está mal con él? – iHunter

+0

¿Podría cargar la textura en sí? –

+0

También, ¿código de representación? –

Respuesta

0

¿Has probado? el código anterior con glEnable (GL_BLEND)?

+0

Siempre está habilitado. – brigadir

0

Es posible que desee leer el OpenGL documentation sobre la transparencia, 15.020: "¿Cómo puedo lograr un efecto transparente?"

Asegúrese de representar la escena en el orden correcto (su respuesta no muestra ninguna representación).

Asegúrese de estar utilizando la función de mezcla deseada.

Otra sugerencia que podría hacer es comenzar a usar shaders. Siempre me siento un poco más en control cuando los uso.

0

Obtengo los mismos resultados (funcionan con Android Samsung Galaxy S, por lo que vale). No entiendo por qué no funciona. Los documentos parecen razonablemente claros.

Para mí funciona si uso GL_MODULATE para el RGB. Se vuelve a fallar si uso GL_ADD o GL_ADD_SIGNED. Incluso el uso de GL_MODULATE en el alfa da el mismo comportamiento erróneo al usar esos modos en el RGB. Puede que tenga que modular sus colores en lugar de interpolarlos.

En resumen, esto funciona para mí:

glActiveTexture (GL_TEXTURE0); // do we need stage #1? 
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, (GLfloat*) &tintColor_); 

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_CONSTANT); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); 

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 
+0

Sí, con el modo modular todo funciona correctamente, pero no se ve como yo quiero. Pondré +50 aquí para no perderlo. – brigadir

+0

Gracias por la recompensa. Lo siento, no podría ser más ayuda. –

Cuestiones relacionadas