Domanda

Devo imitare i metodi di fusione di Photoshop (" moltiplica " ;, " schermo " ecc.) nel mio codice OpenGL ES 1.1 ( senza shader).

Ci sono alcuni documenti su come farlo con HLSL:

Ho bisogno almeno della modalità schermo funzionante.

Esistono implementazioni su pipeline fissa che posso esaminare?

È stato utile?

Soluzione

La maggior parte delle modalità di fusione di Photoshop sono basate sui metodi di fusione Porter-Duff.

Ciò richiede che tutte le tue immagini (trame, renderbuffer) siano nello spazio colore premoltiplicato. Questo di solito viene fatto moltiplicando tutti i valori di pixel con il valore alfa prima di memorizzarli in una trama. Per esempio. un pixel completamente trasparente sembrerà nero in uno spazio cromatico non premoltiplicato. Se non hai familiarità con questo spazio colore, passa un'ora o due a leggerlo sul Web. È un concetto pulito e buono e richiesto per composizioni simili a Photoshop.

Ad ogni modo - una volta che hai le tue immagini in quel formato puoi abilitare SCREEN usando:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR)

La modalità MULTIPLY completa non è possibile con la pipeline OpenGL | ES. Se lavori solo con pixel opachi pieni puoi falsificarlo usando:

glBlendFunc(GL_ZERO, GL_SRC_COLOR)

I risultati per i pixel trasparenti nella trama e nel framebuffer saranno comunque errati.

Altri suggerimenti

dovresti provare questo:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)

Questo mi sembra moltiplicarsi su iPhone / OpenGL ES

Il tuo miglior punto di partenza è prendere una copia del Red Book e leggi i capitoli sui materiali e sui metodi di fusione. Ha una spiegazione molto completa e chiara di come funzionano le funzioni di fusione "classiche" di OpenGL.

Ho scoperto che usando questo:

glDepthFun (GL_LEQUAL);

era tutto necessario per ottenere un effetto schermo, almeno funzionava bene sul mio progetto.

Non sono sicuro del perché funzioni, ma se qualcuno lo sa, per favore condividi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top