Ich hatte große Probleme damit, eine OpenGL-Mischfunktion so zum Laufen zu bringen, wie ich es erwartet hatte (oder von einem vernünftigen Bildbearbeitungsprogramm). Als Beispiel verwende ich diese beiden Bilder zum Mischen (auf weißem Hintergrund etwas schwer zu erkennen, daher sind die Farben beschriftet):
Zu mischende Bilder
Dies ist, was ich erwarte (und was in paint.net passiert):
erwartetes Ergebnis
Offensichtlich lässt die Standard-Mischfunktion von opengl es so aussehen (sehr falsch):
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
Nach einer Menge Tests ist dies der nächste Schritt, um eine "gute" Mischfunktion zu erstellen:
glBlendFuncSeparate (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
Wenn Sie jedoch auf das ursprünglich erwartete Ergebnis zurückblicken, werden Sie feststellen, dass einige der Farben etwas dunkler sind als sie sein sollten (mittlerer linker Teil). Insbesondere werden sie auf die Hälfte ihres Farbwerts vorvervielfacht (aufgrund des Alpha von 0,5), und ich kann anscheinend keine Funktion erstellen, die dies nicht tut (ohne seltsame Mischungsprobleme mit dem kaum sichtbaren roten transparenten Teil zu verursachen).
Kennt jemand eine Lösung für dieses Problem? Eine, die ich hatte, war, vormultipliziertes Alpha in den Quellen zu verwenden (obwohl ich dies nicht tun möchte, weil es zusätzliche Arbeit erfordert, um jede Farbe, die ich in meinem Spiel verwende, in vormultipliziertes zu konvertieren oder einfach ein paar Sachen in jeden Shader zu schreiben) und es so zu machen ::
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (Keine Vormultiplikation)
Natürlich ist das auch falsch, aber dies ist tatsächlich das einzig richtige Ergebnis, das ich bisher erzielt habe:
glBlendFuncSeparate (GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA) (vormultiplizierte Eingaben)
Das einzige Problem ist, wie würde ich die Vormultiplikation beseitigen, um sie auf dem Bildschirm anzuzeigen? Es würde wahrscheinlich einen zusätzlichen Renderzyklus für jede Sache erfordern, die ich mische, und das scheint für dieses Problem viel zu komplex zu sein, daher suche ich immer noch nach einer Antwort (es ist interessant, dass ich nichts dazu finden kann, weil OpenGL so weit verbreitet ist, dass Ich würde mir vorstellen, dass jemand anderes auf dieses Problem gestoßen ist.
Quellen:
Online-Test der Mischfunktion - http://www.andersriggelsen.dk/glblendfunc.php
Bild der unteren Ebene - http://i.stack.imgur.com/XjLNW.png
Bild der oberen Ebene - http: //i.stack.imgur .com / 9CN6w.png