Modo de fusión de Photoshop a OpenGL ES sin sombreadores
opengl-es (4)
Necesito imitar los modos de fusión de Photoshop ("multiplicar", "pantalla", etc.) en mi código OpenGL ES 1.1 ( sin sombreadores).
Hay algunos documentos sobre cómo hacer esto con HLSL:
- http://www.nathanm.com/photoshop-blending-math/ (archivo)
- http://mouaif.wordpress.com/2009/01/05/photoshop-math-with-glsl-shaders/
Necesito al menos trabajar en modo pantalla.
¿Hay alguna implementación en la tubería fija que pueda ver?
He encontrado que usando esto:
glDepthFun( GL_LEQUAL);
Era necesario tener un efecto de pantalla, al menos funcionó bien en mi proyecto.
No estoy seguro de por qué esto funciona, pero si alguien sabe, por favor, comparta.
La mayoría de los modos de mezcla de photoshop se basan en los modos de mezcla Porter-Duff.
Esto requiere que todas sus imágenes (texturas, buffer de render) estén en espacio de color premultiplicado. Esto generalmente se hace multiplicando todos los valores de píxel con el valor alfa antes de almacenarlos en una textura. Por ejemplo, un píxel transparente completo se verá negro en el espacio de color no premultiplicado. Si no estás familiarizado con este espacio de color, dedica una o dos horas a leerlo en la web. Es un concepto limpio y bueno, y se requiere para composiciones tipo Photoshop.
De todos modos, una vez que tengas tus imágenes en ese formato, puedes habilitar PANTALLA usando:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR)
El modo MULTIPLY completo no es posible con la canalización OpenGL | ES. Si solo trabajas con píxeles opacos completos, puedes falsificarlo usando:
glBlendFunc(GL_ZERO, GL_SRC_COLOR)
Sin embargo, los resultados de píxeles transparentes en tu textura y en tu framebuffer serán incorrectos.
Su mejor lugar para comenzar es recoger una copia del Libro Rojo y leer los capítulos sobre materiales y modos de fusión. Tiene una explicación muy completa y clara de cómo funcionan las funciones de mezcla OpenGL "clásicas".
deberias probar esto
glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)
Esto parece multiplicarme en el iPhone / OpenGL ES