ich beschäftige mich seit einiger Zeit mit OpenGL und finde das wiki und die tutorials echt super!
(obwohl ich nicht mit Delphi, sondern in C programmiere)
Jetzt wollte ich aber ein transparentes Objekt rendern und habe mir also das Tutorial zum Thema Blending durchgelesen,
leider aber fast nichts verstanden:
Was ist jetzt die Quelle, was das Ziel?
Wie kann man die Tabelle zu der Funktion glBlendFunc im Tutorial verstehen?
Wieso wird auch bei GL_ONE, GL_ONE geblendet?
Kann mir vielleicht einer eine (auch für Anfänger) leicht verständliche Erlärung geben?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Die Quelle sind die Farbinformationen des Objektes, das du gerade zeichnest. Hast du also Blending aktiviert und zeichnest gerade ein rotes Quad, sind das die Informationen der Quelle.
Das Ziel ist das, was sich schon im Fenster/Framebuffer befindet. Also, wenn du das gerade erwähnte rote Quad über ein blaues zeichnest, so ist das blaue die Zielinformation.
Die beiden Parameter von glBlendFunc sagen, was mit den beiden Farbwerten getan werden soll. Danach werden sie zusammenaddiert. Das was du gesagt hast, (GL_ONE, GL_ONE), belässt also beide Farben wie sie sind, addiert sie zusammen und schreibt das ins Bild. Es ist also Additives Blending.
Wenn noch unklarheiten bestehen, schau mal hier rein, da sind unten noch erklärungen zu bestimmten Kombinationen, oder frag einfach nochmal nach.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Danke für die Erlärung, ich glaube, ich habe jetzt das Wesentliche verstanden
Auch wenn ich die mathematischen Berechnungen zu glBlendFunc noch nicht verstanden habe, kann ich jetzt bestimmt durch ausprobieren das meiste herausfinden (Try and Error ...)
das Thema ist zwar schon was älter, hab aber trotzdem nochmal eine Frage dazu:
Wenn man einen Würfel zeichnet, dessen Seiten transparent sind, muss man ja die vordere Seite als letzte zeichnen. Und wenn man den Würfel dreht, indem man vor dem zeichnen einfach glRotatef(...) aufruft? Muss man dann erst ausrechnen, welche Seite vorne ist und die als letzte zeichnen oder kann man den Code einfach so lassen?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Leider falsch.
Man muss auch bei der arbeit mit glRotate oder ähnlichem selber ausrechnen, wo die vordere Seite ist... Aber meistens hat man ja Backface Culling an. Das heißt, dass man jede Seite sowieso doppelt definiert. Man kann also die jeweils gegenüberliegende Rückseite einfach vor der Vorderseite zeichnen. Damit ist man immer auf der richtigen Seite. Wenn man Backface Culling allerdings aus hat, dann ist es nicht so einfach.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmmm... wenn ich mir das mit dem Culling richtig überlege....
du kannst einfach bei einem ersten durchlauf den würfel mit aktivierten Backface-Culling zeichnen, und dann nochmal mit FrontfaceCulling. Beide Durchläufe mit aktiviertem Blending. Frontface zeigt nach innen.
Geht das so? Hmmm.... vermutlich nicht. Oder doch?
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Das sortieren ist wegen dem Tiefenpuffer wichtig. Wenn du dir mal vorstellst, du hast zwei Transparente Quads die sich Kreuzen, dann würde der Tiefentest eine Hälfte eines Quads immer verwerfen.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Einmal das und wenn du dir die Blendfunc anschaust:
dst = src*srcFactor + dst*dstFactor
GL_SRC_ALPHA und GL_ONE_MINUS_SRC_ALPHA
Spielen wir das mal durch, dst ist 0, src1 ist 0.25, darauf soll dann src2 mit 0.1 geblendet werden, jeweils mit 0.5 als Alphawert.
dst = 0.25*0.5 + 0 * 0.5 = 0.125
Nu src2 drüber:
dst = 0.1*0.5 + 0.125*0.5 = 0.1125
Umgekehrt, also erst src2 mit 0.1 und dann src1 mit 0.5:
dst = 0.1*0.5 + 0 * 0.5 = 0.05
Nu src1 drüber:
dst = 0.25*0.5 + 0.05*0.5 = 0.15
0.15 != 0.1125 -> Die Reihenfolge spielt eine Rolle.
Was macht denn dann GL_ALPHA_TEST, wenn es nicht das tut, was hier gewünscht ist?
Einfach nur Backface Culling reicht wohl nich, oder? Dann würde man durch die vordere transparente Seite auf nichts blicken, weil dass ja denn mit Backface Culling nicht sichtbar ist. Oder wie war das gemeint, habs glaube ich nicht ganz verstanden.
Die Lösung mit Front und Backface culling könnte doch klappen, oder? Aber eigentlich ist das doch auch zuviel aufwand, es gibt doch auch Beispielprogramme, die genau das machen. Die lösen das Problem vermutlich anders, oder?
Und wenn das nich klappt, muss man es eben ausrechnen, indem man z.B. den Rotationswinkel durch 90 teilt erhält man dann ja eine Zahl von 0-3 (vorrausgesetzt dass bei 360 wieder auf 0 gesetzt wird). Dann mit case abfragen und dann nochmal prüfen, ob der Winkel vielleicht zwischen zwei Stufen liegt um festzustellen welche der beiden Seiten (rechts und links) man zuerst zeichnen muss usw...
Ich probiers einfach mal aus, schreib wieder ne Nachricht wenns geklappt hat. Also, wenn keiner mehr was von mir hört...
Der Alpha-Test verwirft Pixel komplett wenn der Alphawert zB niedriger als ein Wert ist. Wann Pixel verworfen werden kann man mit glAlphaFunc einstellen.
Wenn man nur Würfel hat ist das mit dem Culling denke ich die beste Lösung, da sich die Seiten eines Würfels da nicht überdecken können. Und ich denke auch, dass das recht schnell geht. Wenn man allerdings mehr als einen Würfel darstellt können die sich natürlich wieder überdecken, dann muss man wieder sortieren.
Und das was Flash glaube ich meinte war nicht kreuzen sondern überlappen. Bei den was ich unter kreuzen verstehe, überdecken sich die Quads gegenseitig, da hilft auch kein sortieren.
Und bei additiven Blending kann man das sortieren natürlich weglassen, allerdings muss man die transparenten Flächen ganz am Schluss zeichen und das schreiben in den Tiefenbuffer verhindern, oder so ähnlich.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Ja hast recht. Kreuzen ist ein Spezialfall und die härteste Nuss die es zu knacken gilt. Da versuchen sich diverse Doktoren daran, das performant zu machen. Bisher ist die einzige echte Möglichkeit wohl das Tesselieren und Einzeln Zeichnen der Teile.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Der Alpha test ist also schon mal nicht das richtige War ja auch das einfachste, das konnte ja nicht funktionieren
So, hier die versprochenen "Testergebnisse". Die Mathematischen Beweis waren mir zu kompliziert, deshalb hab ich alles getestet
1) Sehr erstuanlich: Ohne etwas zu tun klappt es auch nicht
2) Die Aussagen zu Alpha test stimmen leider auch mit der Praxis überein. Das ist auch nicht das richtige
3) Mit einfachem backface culling erreicht man fast den selben Effekt wie ohne Blending, nur das alles wegen dem Hintergrund etwas dunkler ist.
4) Mit Back- und Frontface culling hat es funktioniert! (Da bei mir Front nach außen zeigte, habe ich erst Frontculling und dann Backculling aktiviert)
EDIT: An Kreuzen hab ich jetzt noch nicht gedacht, ist wohl auch besser so
Zuletzt geändert von glmatt am Mo Jan 05, 2009 12:02, insgesamt 1-mal geändert.
Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.