J'ai eu beaucoup de mal à essayer de faire fonctionner une fonction de mélange OpenGL comme je m'y attendais avec ce que j'attendais (ou de tout programme d'édition d'image sensé). À titre d'exemple, je vais utiliser ces deux images pour mélanger (peu difficile à voir sur fond blanc, donc les couleurs sont étiquetées):
Images à mélanger
C'est ce que j'attends (et ce qui se passe dans paint.net):
résultat attendu
De toute évidence, la fonction de fusion par défaut d'Opengl donne l'aspect suivant (très faux):
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
Après une tonne de tests, c'est le plus proche que j'ai pu obtenir pour créer une "bonne" fonction de mélange:
glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
En regardant le résultat original attendu, vous remarquerez que certaines couleurs sont un peu plus sombres qu'elles ne devraient l'être (la partie centrale gauche). Plus précisément, ils sont prémultipliés à la moitié de leur valeur de couleur (en raison de l'alpha 0,5) et je n'arrive pas à créer une fonction qui ne le fasse pas (sans causer de problèmes de mélange étranges avec la partie transparente rouge à peine visible).
Quelqu'un connaît-il une solution à ce problème? L'une que j'avais était d'utiliser l'alpha prémultiplié dans les sources (même si je ne veux pas le faire car cela nécessite un travail supplémentaire pour convertir chaque couleur que j'utilise dans mon jeu en prémultiplié ou simplement écrire des trucs dans chaque shader) et le faire comme ça :
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (pas de prémultiplication)
C'est évidemment faux aussi, mais c'est en fait le seul résultat correct que j'ai obtenu jusqu'à présent:
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (entrées prémultipliées)
Le seul problème est, comment pourrais-je me débarrasser de la prémultiplication pour l'afficher à l'écran? Cela nécessiterait probablement un cycle de rendu supplémentaire pour chaque chose que je mélange et cela semble beaucoup trop complexe pour ce problème, donc je cherche toujours une réponse (c'est intéressant que je ne trouve rien à ce sujet, car OpenGL est si largement utilisé que J'imagine que quelqu'un d'autre a rencontré ce problème).
Sources:
Test de fonction de mélange en ligne - http://www.andersriggelsen.dk/glblendfunc.php
Image de la couche inférieure - http://i.stack.imgur.com/XjLNW.png
Image de la couche supérieure - http: //i.stack.imgur .com / 9CN6w.png