OpenGL ES 2.0 PNG Alphakanal

8

Ich lerne gerade mit OpenGL ES 2.0 für Android zu arbeiten. Ich habe versucht, einfach eine Textur in der Mitte des Bildschirms anzuzeigen, was einfach genug war, aber ich kann nicht scheinen, dass das PNG-Alpha richtig funktioniert. Das Bild wird entweder mit einem schwarzen Hintergrund angezeigt, oder das gesamte Bild wird leicht in die Hintergrundfarbe eingeblendet, abhängig von den Einstellungen, die ich verwende.

Die eigentlichen Tutorials, an denen ich bis dahin gearbeitet habe, haben nie mit Transparenz gearbeitet, also habe ich versucht, in Code zu arbeiten, den ich gefunden habe, und wahrscheinlich einen wichtigen Schritt verpasst. Ich habe jedoch ziemlich viel gesucht, um dieses Problem herauszufinden, und ich habe keine Antworten gesehen, die etwas hatten, was mein Setup nicht hatte. Ich habe jede Kombination von glBlendFunc und was nicht ohne Glück versucht.

Ich dachte mir, wenn ich versuchen würde, den gesamten Code einzufügen, der damit in Zusammenhang steht, würde die Frage sehr aufgebläht erscheinen, also würde ich mich freuen, irgendwelche Code-Teile zu veröffentlichen, nach denen ihr fragt. Ich würde mich sehr über Ideen freuen, was ich als nächstes versuchen sollte.

BEARBEITEN :: Hier ist mein Fragment-Shader, was meiner Meinung nach die Ursache ist. Dies ist der einzige Teil, für den ich nie wirklich ein anständiges Beispiel für die Arbeit mit Transparenz gefunden habe, und alles andere entspricht dem, was ich an anderer Stelle gesehen habe.

%Vor%

Es macht nie etwas explizit mit dem Alpha, es ist von einem Beispiel, das es schließlich nicht benutzt, aber ich weiß immer noch nicht viel über Fragment-Shader und weil es "irgendwie" zu funktionieren schien, wenn es verschmilzt Das Bild in den Hintergrund, ich dachte, es war in irgendeiner Form mit dem Alpha und ich hatte gerade etwas falsch gemacht.

EDIT :: Hier ist die "loadTexture" -Methode. Es ist in etwa das gleiche wie das Beispiel aus dem openGL ES 2.0-Buch, mit dem ich versuche zu lernen, mit ein paar Änderungen, die das Bild näher zum Funktionieren bringen.

%Vor%

Ich verstehe, was der Code macht, aber zugegebenermaßen verwirrt mich das immer noch ein wenig, so dass ich aufgrund meines Mangels an Wissen vielleicht etwas übersehen habe.

Ich sehe keine anderen Teile meines Codes, die so aussehen, als könnten sie die Art von Problemen verursachen, die ich habe, aber das Programmieren ist immer voll mit dem Unerwarteten (besonders in der Welt von OpenGL scheint es), wenn du denkst etwas anderes ist der Grund, ich werde sicher sein, dass das auch für dich bekannt gibt. Entschuldigung für all die Probleme!

    
DaeKo 17.08.2011, 17:12
quelle

3 Antworten

9

Ändern

%Vor%

in

%Vor%

um die Alpha-Informationen aufzunehmen, fügen Sie einfach

hinzu %Vor%

direkt bevor Sie die Textur zeichnen. Denken Sie daran, GL_BLEND zu deaktivieren, sobald Sie fertig sind.

    
idunnololz 27.01.2012 08:43
quelle
3

Wahrscheinlich möchten Sie glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) als Überblendungsfunktion verwenden, und Sie müssen sicherstellen, dass Sie auch den Alpha-Wert der Textur in die Ausgabevariable gl_FragColor des Fragment-Shaders schreiben.

Damit alles funktioniert, müssen Ihre hochgeladenen Texturdaten einen Alpha-Wert enthalten und Sie müssen ein Texturformat verwendet haben, das einen Alpha-Kanal (RGBA, RGBA8 usw.) unterstützt.

Sie können dies überprüfen, indem Sie einfach den Alpha-Wert an die RGB-Farbkomponenten weiterleiten und das erhaltene Bild überprüfen.

BEARBEITEN:

In Ihrem Bildladecode vergessen Sie, über den Alphakanal zu kopieren! Versuchen Sie den Vorschlag, den davebytes gibt.

    
trenki 17.08.2011 17:36
quelle
1

Dein erster Shader ist in Ordnung. Alpha ist in Color Ops inhärent, es kann nur je nach Mischung / Modus / etc nicht angewendet werden.

vorausgesetzt, dass Ihre Textur schwarz erscheint, wenn Sie fragcolor = base.aaa verwenden, bedeutet das, dass Ihre Texturdaten "schlecht" sind.

schau dir deine Textur an, ja, es ist falsch. du kopierst nie über das alpha, nur das rgb. Unter der Annahme, dass Java das Byte-Array auf 0s löscht, ist alles Alpha Null, das würde Sie zu Ihrer Blackbox bringen, die dazu führen würde, dass das Bild "verschwindet", wenn Sie Alpha-Blending aktivieren.

Um Ihr Leben zu vereinfachen, können Sie das Bitmap nicht einfach kopieren, sondern einfach normal laden und den GLUtils-Helper zum Hochladen verwenden, anstatt direkt mit glTexImage2d zu arbeiten:

%Vor%

So ähnlich. Aktivieren Sie dann die Überblendung, verwenden Sie den Quellmodus src + invsrc, wenn Sie nicht vorgemischt sind, und rendern Sie, Sie sollten das gewünschte Ergebnis erhalten.

    
davebytes 18.08.2011 13:24
quelle