2009-10-15 11 views
6

Ho utilizzato OpenGL ES 1.1 su iPhone per 10 mesi e in quel momento c'è un compito apparentemente semplice che non sono stato in grado di fare: dissolvenza programmata di un oggetto con texture. Per semplificare la procedura: come posso disattivare alfa, sotto il controllo del codice, un semplice triangolo 2D che ha una texture (con alfa) applicata ad esso. Vorrei sbiadirlo dentro/fuori mentre è su una scena, non su uno sfondo colorato semplice. Finora l'unica tecnica che devo fare è creare una texture con più copie pre-sbiadite della texture su di essa. (Yuck)Come alfa a livello di programmazione un oggetto con texture in OpenGL ES 1.1 (iPhone)

Ad esempio, non sono in grado di farlo utilizzando il codice di esempio GLSprite di Apple come punto di partenza. Tratta già un quad con una trama che ha il suo alfa. Vorrei sbiadire quell'oggetto dentro e fuori.

risposta

15

Forse non ti sto prendendo bene, ma a me sembra banale e lo sto facendo con successo. La strada da percorrere è:

  1. consentono texturing e tutto il necessario
  2. attivare la fusione: glEnable(GL_BLEND)
  3. selezionare un metodo di fusione glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
  4. impostare un colore di fondersi con: glColor4f(r * a, g * a , b * a, a)
  5. disegnare la geometria

La funzione di miscelazione è per porter-duff over utilizzando premoltiplicato c olors/texture. GL_TEXTURE_ENV_MODE deve essere impostato su GL_MODULATE, ma questo è il valore predefinito.

+0

Grazie ad un aiuto sui dev forum di Apple, ho ottenuto questo lavoro utilizzando una variazione, grazie! Inoltre, quando ho provato ad usare "GL \ _ONE" invece di "GL \ _SRC \ _ALPHA" non mi sarebbe sbiadito. – PewterSoft

+1

Ecco perché ho specificato esplicitamente * colori premoltiplicati *. Questo è il modo normale in cui i colori vengono gestiti in contesti bitmap Quartz e quindi nelle trame caricate in GL. Se i tuoi colori sono non moltiplicati, la funzione di fusione specificata funziona come previsto (tranne che per l'alfa di destinazione, ma di solito è irrilevante). –

2

La soluzione di Nikolai è corretta; per favore ignora ciò che ho detto sui forum Apple. Poiché la trama è pre-moltiplicata, dovrebbe essere anche il colore per-vertice. Si dovrebbe usare GL_ONE piuttosto che GL_SRC_ALPHA, e fare questo:

 

            
 
  
             glColor4f(1., 1., 1., myDesiredAlpha);
            
  
glColor4f(myDesiredAlpha, myDesiredAlpha, myDesiredAlpha, myDesiredAlpha); 
Problemi correlati