OpenGL - Transparenz bei Texturen mit Alphawerten

thekiller

Viceinator
Morgen,

ich versuche mich gerade an Transparenz bei texturierten Objekten mit Alphawert.
Ich lade eine .png Datei mithilfe der SDL.
Bei glTexImage2D(); habe ich natürlich GL_RGBA angegeben.
Textur wird auch auf das Object gemapped aber die Transparenz nicht.
Transparanz wird mit Blending realisiert.

Pseudocode:
C++:
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
	
glLoadIdentity();
RenderObject();

glDisable(GL_BLEND);

Bei glBlendFunc() habe ich natürlich verschiedene Parameter ausprobiert aber ich komme immer nur zu dem Ergebnis, dass entweder die GANZE Textur halbtransparent ist oder komplett undurchsichtig.
Wodran kann es liegen? Die .png Datei hat definitiv einen Alphakanal!

MfG Manuel
 
Zuletzt bearbeitet von einem Moderator:
Hallo Manuel

Wenn deine Textur einen Alphakanal verwendet solltest du diesen verwenden.
glBlendFunc(GL_ONE, GL_ONE) ist eine additive Überblendung der folgenden Form
Code:
result = textur.farbe + hintergrund.farbe

Sie eignet sich zum Beispiel bei Texturen ohne Alphakanal bei der Transparenz mit Schwarz maskiert ist super da Schwarz 0/0/0 ist und daher so wie transparent wirkt.

Gängige Überblendung für Alphakanäle ist die folgende Form:
Code:
result = textur.alpha * textur.farbe + (1 - textur.alpha) * hintergrund.farbe

Also ein linearer Verlauf. für glBlendFunc bedeutet das folgendes:
Code:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Gruss
Muepe
 
Hallo Muepe,

danke für die schnelle Antwort.
Ich hab in meiner glTexImage2D() Funktion noch einen Fehler entdeckt gehabt. Für das internalFormat war 3 angegeben was für RGB steht. Da sollte 4 hin für RGBA. War wohl nen Copy&Paste Fehler^^
Naja jedenfalls mit dieser Änderung und der Angabe von

Code:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

funktioniert es jetzt =)

Man sollte ja bei Transparenzen darauf achten, dass die am weitesten entfernten Objekte zuerst gerendert werden.
Reicht es wirklich die Objekte nach Entfernung zu Sortieren oder muss ich die Polygone selbst sortieren?
Wenn ja wie sortiere ich die Polygone am besten? Einen Mittelpunkt für jedes Polygon errechnen und dann nach diesen sortieren oder alle Vertices vergleichen?

MfG Manuel
 
Hallo Manuel

Theoretisch ist schon so, dass du eigentlich Pixel für Pixel sortieren müsstest um sicher zu sein, dass es zu keinen falschen Transparenzen kommt. Wir sind jedoch schon rein vom praktisch machbaren auf Dreiecke limitiert und haben also auf jeden Fall keine Chance alle denkbaren Überlappungen zu vermeiden. Aus diesem Grund und der Tatsache dass jedes Dreieck einzeln durch die Pipeline der Graphikkarte zu jagen die Performance killen würde ist es eigentlich nicht üblich, dass du auf Dreiecksbasis sortierst.

In der Regel sortiert man einfach immer nach Blöcken die man rendert. Wenn du sehr grosse Modelle hast kannst du ja zum Beispiel die einzelnen Textureinheiten als Block nehmen. Wie gross du die einzelnen Blöcke wählst ist deine Entscheidung. Hier es ist wie eigentlich immer bei der Graphikprogrammierung: Die Genauigkeit diktiert die Performance und die Performance diktiert die Genauigkeit. Es ist also immer ein abwägen.

Gruss
Muepe
 
Hm irgendwie hatte ich mir das Arbeiten mit Transparenzen nich so umständlich vorgestellt aber naja.
Danke für die Hilfe =)
 
Ach, das ist eigentlich nicht wirklich kompliziert. In der Regel hast du ja sowieso früher oder später einen Szenengraph der die räumliche Struktur der aktuellen Ansicht repräsentiert und den kannst du ja dann gleich dazu verwenden um deine Objekte zu sortieren.
 
Ich habe etwas weiter gemacht bei meiner Engine und zum Testen mal ein Objekt eingefügt die mit einer transparenten Textur versehen ist. Im Anhang mal 2 Bilder davon. Die Objekte die außerhalb des Hauses liegen werden richtig dargestellt, weil das Haus als letztes gerendert wird.

Die Fehler bei den Transparenten Fenstern lassen mich aber vermuten, dass ich doch nach Polygonen sortieren muss. Oder sollte ich kleinere transparente Objekte wie Fenster als einzelne Objekte betrachten und nach Entfernung sortieren?

MfG Manuel
 

Anhänge

  • Transparenz.png
    Transparenz.png
    216,3 KB · Aufrufe: 68
  • Transparenz2.png
    Transparenz2.png
    225,1 KB · Aufrufe: 61
Zuletzt bearbeitet:
Auf jeden Fall solltest du schon in gewisse kleinere Abschnitte unterteilen damit eben genau das nicht passiert, aber auf Polygonbasis zu sortieren ist in der Regel zu viel.
 
Ok danke. Wenn ich die Tranzparenzen Polys als eigene Objekte behandle sollte ich ja nur bei sehr großen Objekten Probleme bekommen richtig?
 
Ja, und üblicherweise ist es auch so, dass man Sachen wie Fenster bei denen man von aussen in ein Objekt reinsieht versucht rar wie möglich zu halten. Es kommt natürlich förderlich hinzu, dass es für das Auge überhaupt kein Problem ist, wenn du durch einen transparenten Gegenstand in der Ferne nicht durchsiehst. Wenn ich zum Beispiel hier im Büro aus dem Fenster sehe habe ich schon beim Gebäudekomplex nebenan nur sehr rudimentäre Transparenz in den Fenstern. Ich sehe also praktisch nicht durch. Du kannst also ab einer gewissen Distanz auf die Transparenz verzichten bzw. dich nicht gross darum kümmern in welcher Reihenfolge sie gezeichnet werden.

Für die distanzabhängige Transparenz eignet sich übrigens ein Shaderprogramm für die Graphikkarte ganz gut, da du da Pixel für Pixel auch Transparenz beim Rendern bestimmen kannst ohne Textur, Renderstates oder ähnliches zu ändern.
 
Zurück