He tenido muchos problemas para intentar que una función de mezcla OpenGL funcione como lo esperaba con lo que esperaría (o de cualquier programa de edición de imagen sensible). Como ejemplo, usaré estas dos imágenes para mezclar (un poco difícil de ver en fondos blancos para que los colores estén etiquetados):
Imágenes para mezclar
Esto es lo que espero que suceda (y lo que sucede en paint.net):
Resultado Esperado
Obviamente, la función de mezcla predeterminada de opengl hace que se vea así (muy mal):
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
Después de un montón de pruebas, esto es lo más cerca que puedo llegar a crear una función de mezcla "buena":
glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
Sin embargo, al mirar el resultado esperado original, notará que algunos de los colores son un poco más tenues de lo que deberían ser (la parte central izquierda). Específicamente, se premultiplican a la mitad de su valor de color (debido al .5 alfa), y parece que no puedo hacer una función que no haga esto (sin causar problemas de mezcla extraños con la parte transparente roja apenas visible).
¿Alguien sabe una solución a este problema? Una de las que tuve fue usar alfa premultiplicado en las fuentes (aunque no quiero hacer esto porque requiere un trabajo adicional para convertir cada color que uso en mi juego para premultiplicar o simplemente escribir algunas cosas en cada sombreador) y hacerlo así :
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (Sin premultiplicación)
Obviamente, eso también está mal, pero este es el único resultado correcto que he obtenido hasta ahora:
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (entradas premultiplicadas)
El único problema es, ¿cómo me desharía de la premultiplicación para mostrarla en la pantalla? Probablemente requerirá un ciclo de renderizado adicional para cada cosa que mezcle y eso parece demasiado complejo para este problema, por lo que todavía estoy buscando una respuesta (es interesante que no pueda encontrar nada sobre esto, porque OpenGL es tan ampliamente utilizado que Me imagino que alguien más se topó con este problema).
Fuentes:
Prueba de función de mezcla en línea: http://www.andersriggelsen.dk/glblendfunc.php
Imagen de la capa inferior: http://i.stack.imgur.com/XjLNW.png
Imagen de la capa superior : http: //i.stack.imgur .com / 9CN6w.png