2017-09-05 5 views
1

Ich arbeite an einer malen App für Android, die Benutzer mit ihren Finger zeichnen können. Es wurde mit OpenGL ES 2.0 mit Point-Sprite-Technik sowie einem FBO für schnelles Rendern erstellt. Ich habe ein Problem, bei dem die einzelnen Punktsprites zusammengemischt werden, wo die transparenten Bereiche korrekt auf dem FBO gerendert werden, aber wenn sich die Sprites überlappen, kann ich die transparenten Bereiche sehen, die auf dem vorherigen Sprite gerendert werden. Hier ist, wie es aussieht, zur Zeit:Point Sprite Alpha Blending

enter image description here

Dies ist mit dieser Mischung Gleichung:

GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

Wenn ich die Zeichenfarbe auf weiß oder schwarz ändern es funktioniert perfekt:

enter image description here

Ich habe auch diese Mischfunktion ausprobiert:

GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_DST_ALPHA); 

, die in diesen Ergebnisse:

enter image description here

die fast perfekt ist, sondern auf Weiß die Hauptfarbe verdunkeln sollte. Irgendwelche Ideen, was die richtige Blending-Funktion sein sollte, um dies zu erreichen?

Hinweis: Ich habe eine Vorstellung davon, wie die Mischfunktion funktioniert durch die Fraktionen der Quell- und Zielfarbe und in meinem Fall nehmen sie zusammen Zugabe so macht es Sinn, dass die Farbe in Richtung Weiß gehen würde. Ich frage mich also, ob das, was ich erreichen möchte, nur mit der Blending-Funktion erreicht werden kann oder brauche ich etwas anderes? Ich kann zwar Code aus dem Fragment-Shader bereitstellen, aber es sieht für mich nicht wie ein Fragment-Problem aus.

Antwort

0

Okay, also habe ich herausgefunden, was los war. Es war nicht die Mischfunktion schließlich aber das Fragment-Shader .. hatte ich einige Logik, um die Pixel unpremultiply die

GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

bereits behandelt premultiplied Bilder überflüssig, da die Mischfunktion war. Außerdem hatte ich etwas Code im Fragment-Shader, um das Bild in Graustufen zu konvertieren und dann die Graustufen in Transparenz zu konvertieren und meine Farbmultiplikationen waren falsch.

Schließlich habe ich meine ursprüngliche Mischfunktion unverändert gelassen (wie oben). Es funktioniert einwandfrei und hier ist das Ergebnis, das ich gesucht habe:

enter image description here

Verwandte Themen