Ho avuto molti problemi a provare a far funzionare una funzione di fusione OpenGL come mi aspetterei con quello che mi aspetto (o da qualsiasi programma di editing di immagini sensato). Ad esempio, userò queste due immagini per fondere (un po 'difficile da vedere su sfondi bianchi in modo che i colori siano etichettati):
Immagini da miscelare
Questo è quello che mi aspetto che accada (e cosa succede in paint.net):
Risultato atteso
Ovviamente la funzione di fusione predefinita di opengl la fa apparire così (molto sbagliata):
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
Dopo un sacco di test, questo è il più vicino che potrei arrivare a creare una "buona" funzione di fusione:
glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
Guardando indietro al risultato atteso originale, noterete che alcuni dei colori sono leggermente più tenui di quanto dovrebbero essere (la parte centrale sinistra). In particolare, sono premoltiplicati per metà del loro valore di colore (a causa della .5 alfa) e non riesco a fare una funzione che non lo fa (senza causare strani problemi di fusione con la parte trasparente rossa appena visibile).
Qualcuno conosce una soluzione a questo problema? Uno che avevo era usare l'alfa premoltiplicato nelle fonti (mentre non voglio farlo perché richiede un lavoro extra per convertire tutti i colori che uso nel mio gioco in premoltiplicato o semplicemente scrivere alcune cose in ogni shader) e farlo in quel modo :
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (Nessuna premoltiplicazione)
Ovviamente anche quello è sbagliato, ma questo è in realtà l'unico risultato corretto che ho ottenuto finora:
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (input premoltiplicati)
L'unico problema è, come potrei sbarazzarmi della premoltiplicazione per visualizzarla sullo schermo? Probabilmente richiederebbe un ciclo di rendering aggiuntivo per ogni cosa che mescolo e questo sembra troppo complesso per questo problema, quindi sto ancora cercando una risposta (è interessante che non riesco a trovare nulla su questo, perché OpenGL è così ampiamente usato che Immagino che qualcun altro abbia riscontrato questo problema).
fonti:
Test delle funzioni di fusione online - http://www.andersriggelsen.dk/glblendfunc.php
Immagine livello inferiore - http://i.stack.imgur.com/XjLNW.png
Immagine livello superiore - http: //i.stack.imgur .com / 9CN6w.png