2009-05-03 20 views
16

Necesito imitar los modos de fusión de Photoshop ("multiplicar", "pantalla", etc.) en mi código OpenGL ES 1.1 (sin sombreadores).Modo de fusión de Photoshop con OpenGL ES sin sombreadores

Hay algunos documentos sobre la manera de hacer esto con HLSL:

necesito modo de pantalla al menos de trabajo.

¿Hay alguna implementación en la tubería fija que pueda ver?

+1

[Este] (http://www.pegtop.net/delphi/articles/blendmodes/) página tiene _una gran cantidad de detalles sobre cómo funciona cada modo de combinación (con diagramas) – bobobobo

Respuesta

15

La mayoría de los modos de mezcla de photoshop se basan en los modos de combinación de Porter-Duff.

Estas requieren que todas sus imágenes (texturas, renderbuffer) estén en espacio de color premultiplicado. Esto generalmente se hace multiplicando todos los valores de píxel por el valor alfa antes de almacenarlos en una textura. P.ej. un píxel transparente completo se verá como negro en un espacio de color no premultiplicado. Si no está familiarizado con este espacio de color, dedique una o dos horas a leer sobre él en la web. Es un concepto bueno y ordenado, y se requiere para composiciones de tipo photoshop.

De todos modos - una vez que tenga sus imágenes en el formato que se puede activar la pantalla utilizando:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR) 

El modo multiplicar completa no es posible con el OpenGL | ES tubería. Si sólo trabaja con completos píxeles opacos puede fingirlo utilizando:

glBlendFunc(GL_ZERO, GL_SRC_COLOR) 

Los resultados para los píxeles transparentes, ya sea en su textura y su uso de este dispositivo va a estar equivocado sin embargo.

1

Su mejor lugar para comenzar es recoger una copia del Red Book y leer los capítulos sobre los materiales y los modos de fusión. Tiene una explicación muy completa y clara de cómo funcionan las funciones de fusión "clásica" de OpenGL.

10

usted debe intentar esto:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA) 

Esto se parece cada vez mayores a mí en el iPhone/OpenGL ES

+1

Gracias por la excelente respuesta, se ve exactamente como multiplicar en photoshop (: –

+0

Esto solo funciona si la imagen es de un color sólido (opaco). Si tienes una imagen con transparencia, simplemente tienes que ponerla delante de un fondo blanco y luego probar esto. – Peter

1

He encontrado que el uso de este:

glDepthFun(GL_LEQUAL);

era todo necesito obtener un efecto de pantalla, al menos funcionó bien en mi proyecto.

No estoy seguro de por qué funciona, pero si alguien sabe, comparta.

Cuestiones relacionadas