2009-05-03 12 views
16

Ho bisogno di imitare i metodi di fusione Photoshop ("moltiplicare", "schermo" ecc.) Nel mio codice OpenGL ES 1.1 (senza gli ombreggiatori).Modalità di fusione Photoshop per OpenGL ES senza shader

ci sono alcuni documenti su come fare questo con HLSL:

Ho bisogno modalità a schermo almeno di lavoro.

Esistono implementazioni su tubazioni fisse che posso esaminare?

+1

[Questa] (http://www.pegtop.net/delphi/articles/blendmodes/) pagina presenta _un sacco_di dettagli su come funziona ogni modalità di fusione (con diagrammi) – bobobobo

risposta

15

La maggior parte delle modalità di fusione di Photoshop si basa sui metodi di fusione Porter-Duff.

Questi richiede che tutte le immagini (trame, renderbuffer) siano nello spazio colore preminciaplicato. Questo di solito viene fatto moltiplicando tutti i valori dei pixel con il valore alfa prima di memorizzarli in una trama. Per esempio. un pixel completamente trasparente apparirà nero nello spazio colore non premoltiplicato. Se non conosci questo spazio colore, trascorri un'ora o due a leggerlo sul web. È un concetto pulito e buono e richiesto per le composizioni di tipo photoshop.

In ogni caso - una volta che avete le vostre immagini in questo formato è possibile attivare schermo utilizzando:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR) 

La modalità full MULTIPLY non è possibile con l'OpenGL | ES pipeline. Se si lavora solo con i pixel opachi pieni si può fingere utilizza:

glBlendFunc(GL_ZERO, GL_SRC_COLOR) 

I risultati per pixel trasparenti sia nella vostra consistenza e il framebuffer sarà sbagliata però.

1

Il posto migliore da cui iniziare è prelevare una copia dello Red Book e leggere i capitoli sui materiali e le modalità di fusione. Ha una spiegazione molto completa e chiara di come funzionano le funzioni di fusione OpenGL "classiche".

10

si dovrebbe provare questo:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA) 

Questo appare come moltiplicavo a me su iPhone/OpenGL ES

+1

Grazie per un'ottima risposta, sembra esattamente come moltiplicare in photoshop (: –

+0

Questo funziona solo se l'immagine è un colore solido (opaco). Se hai un'immagine con trasparenza devi semplicemente metterla davanti a uno sfondo bianco e poi provare questo. – Peter

1

ho trovato che l'uso di questo:

glDepthFun(GL_LEQUAL);

era tutto bisogno di ottenere un effetto schermo, almeno ha funzionato bene sul mio progetto.

Non sono sicuro del motivo per cui funziona, ma se qualcuno lo sa, per favore condividi.

Problemi correlati