2011-12-19 14 views
5

Ho texture con alfa. E voglio colorarlo con un po 'di colore, quindi sarà colorato a seconda del valore alfa del colore, ma l'opacità eccessiva sarà definita solo dalla texture alfa.OpenGL ES: come colorare la texture con il colore

Questo è simile alla multi-texturing ma con il colore invece della seconda trama. Come si fa?

(Aggiornato) ho cercato di impostare up di texture combinatore. Il colore è tinto bene, ma c'è un problema con l'alfa - non ha valore dalla trama (come la maschera). Il mio codice in questo 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); 

Screenshots:

No colorazione:

enter image description here

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

enter image description here

+0

Il codice sembra corretto per me. Potresti per favore allegare uno screenshot del problema alfa o descrivere cosa non va bene con esso. – iHunter

+0

Potresti caricare la texture stessa? –

+0

Inoltre, codice di rendering? –

risposta

0

Hai provato il codice sopra con glEnable (GL_BLEND)?

+0

È sempre abilitato. – brigadir

0

Si potrebbe desiderare di leggere il OpenGL documentation sulla trasparenza, 15,020: "Come faccio a ottenere un effetto di trasparenza"

Assicurarsi che si sta rendendo la scena nel giusto ordine (la risposta non mostra alcun rendering).

Assicurarsi di utilizzare la funzione di fusione desiderata.

Un altro suggerimento che potrei fare è quello di iniziare a utilizzare shaders. Mi sento sempre un po 'più in controllo quando li uso.

0

ottengo gli stessi risultati (in esecuzione su Android Samsung Galaxy S, per quello che vale). Non capisco perché non funzioni. I documenti sembrano abbastanza chiari.

Per me funziona se uso GL_MODULATE per l'RGB. Fallisce nuovamente se utilizzo GL_ADD o GL_ADD_SIGNED. Anche l'utilizzo di GL_MODULATE sull'alpha dà lo stesso comportamento errato quando si usano queste modalità su RGB. Potresti essere bloccato a modulare i tuoi colori invece di interpolarli.

In sintesi, questo funziona per me:

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 la modalità modulata tutto funziona correttamente, ma non sembra che io voglia. Metterò +50 qui per non perdere. – brigadir

+0

Grazie per la taglia. Scusa, non potrei essere più d'aiuto. –