PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Transparenz in OpenGL


Endevour79
2003-09-08, 08:35:59
Hi,

meine Frage, ist es möglich, Transparenz in OpenGL zu verwenden?
Ich habe gelesen, dies ist nur über den Umweg über die "umgekehrte" Zeichnenreihenfolge möglich.

Gibt es noch eine andere Variante, Objekte mit Transparenz zu versehen? Hat jemand ein Tut oder Code Samples?

Greetz

End.

Kennung Eins
2003-09-08, 10:48:30
suchst du nach sowas (http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=08) ? :)

Abe Ghiran
2003-09-08, 10:57:19
Moin, moin...
Original geschrieben von Endevour79
meine Frage, ist es möglich, Transparenz in OpenGL zu verwenden?


Ja, das geht eigentlich ganz einfach:

// blending aktivieren
glEnable(GL_BLEND);
// die gewünschte funktion auswählen
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


Ich habe gelesen, dies ist nur über den Umweg über die "umgekehrte" Zeichnenreihenfolge möglich.

Das hat nur indirekt etwas mit blending / Transparenz zu tun. Dabei ist einem oft der z-Test im Weg. Wenn ein transparentes Pixel mit z.B. z Wert 1 gerendert wurde, wird ein Pixel mit einem höherem z Wert (z.B. 2, also aus Sicht der Kamera hinter dem vorher gezeichnetem Pixel) verworfen, obwohl es ja eigentlich noch in die Szene gehört, da es ja durch das erste Pixel hindurchschimmern würde (immer vorausgesetzt depth test an und LESS / LESS_OR_EQUAL).

Deswegen rendert man dann i.d.R. back to front, damit das hintere Pixel zuerst gezeichnet wird und dann das transparente Pixel darüber. Dafür muß natürlich die Geometrie nach ihrem z Wert sortiert werden, was wieder Rechenzeit kostet.

Mit dem nehe Tutorial ist mir Kennung Eins zuvorgekommen, ich tippe einfach zu langsam =).

Grüße, Jan

Xmas
2003-09-08, 12:44:17
Original geschrieben von Abe Ghiran
Das hat nur indirekt etwas mit blending / Transparenz zu tun. Dabei ist einem oft der z-Test im Weg.
Das hat eigentlich sehr viel mit Blending und fast gar nichts mit dem Z-Test zu tun. Denn selbst wenn man wüsste dass das Fragment hintendran gerendert werden müsste, so ist es fast unmöglich dies zu tun, weil man den Blend-Anteil nicht mehr weiß. Destination Alpha ist dafür nicht ausreichend.

Endevour79
2003-09-08, 13:20:56
Und wie könnte man Transparenz realisieren, ohne von hinten nach vorne zu malen?

Die Schnittstelle gibt nämlich genau dies nicht her.

Demirug
2003-09-08, 13:32:26
Original geschrieben von Endevour79
Und wie könnte man Transparenz realisieren, ohne von hinten nach vorne zu malen?

Die Schnittstelle gibt nämlich genau dies nicht her.

Das geht nicht (zumindestens nicht sonderlich schnell). In solchen Fällen muss man sich eben alle flächen geben lassen diese mit der CPU sortieren und dann an die Grafikkarte übergeben.

Abe Ghiran
2003-09-08, 21:22:29
Original geschrieben von Xmas
Das hat eigentlich sehr viel mit Blending und fast gar nichts mit dem Z-Test zu tun. Denn selbst wenn man wüsste dass das Fragment hintendran gerendert werden müsste, so ist es fast unmöglich dies zu tun, weil man den Blend-Anteil nicht mehr weiß. Destination Alpha ist dafür nicht ausreichend.

Oha, so weit habe nun nicht gedacht :sulkoff:.
Aber es leuchtet schon ein, wenn schon das falsche Fragment im Frambuffer ist stimmt ja die gewählte blending funktion gar nicht mehr.

Grüße, Jan