ich versuche gerade, Blending zu verstehen. Das TUT vom Phobeus hab ich durch.
Folgende Problemstellung: Ich habe zwei Quadrate, die hintereinander angeordnet sind. Verschiedene Farben und je 0.5 Alphawert.
Nun drehe ich Szene dauerhaft, aber langsam genug, um alles zu sehen.
Meine Blending-Einstellung sind diese:
(Der Standard eben, und Tiefentest ist aktiviert)
Folgendes passiert:
Solang das erstgemalte Quadrat hinten ist, wird geblendet, man sieht es durch das zweite, wie durch ein Fenster.
ABER: Sobald das erstgemalte vorn ist, wird nicht geblendet, sondern komplett überdeckt.
Das erstgemalte überdeckt also das zweitgemalte. Liegt das daran, dass es weiter hinten ist? Ich kann doch aber nicht jedesmal alle hintengemalten nach vorn ziehen, wenn ich blenden will?
Vielleicht klärt mich jemand auf *gg*
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wenn ich das richtig verstanden habe hast du mit deiner Aussage vollkommen recht. Um das ganze aber mal ein Wenig zu verdeutlichen. Alle aktionen werden sofort im Framebuffer umgesetzt. Also zeichne eine Fläche. Dann ist sie auch schon drin.
Da aber manchmal Objekte von anderen Objekten verdeckt werden gibt es einen Tiefenbuffer. Der sorgt dafür, dass nur Objekte mit einer kleineren Tiefe gezeichnet werden. Dadurch hast du zum Beispiel die Möglichkeit zu erst eine Pflanze und anschließend die Wand dahinter zu Rendern. Beim Blending werden aber immer ganze Flächen gezeichnet. Zu mindest in den Tiefenbuffer. Selbst wenn diese einen Alpha von 0 haben. Und genau dann schlägt der Tiefentest zu. Obwohl du durch deine Fläche hindurch sehen kannst und eigentlich das dahinter sehen müsstest wird es nicht gezeichnet.
Den Tiefentest zu deaktivieren und alle Flächen so zu zeichnen wie sie gerendert werden kann in machen Fällen bereits helfen. Aber je nach Blendmodus würde das aber zu einem vollkommen falschem Ergebniss führen. Weswegen man ein wenig vorsichtig damit sein sollte. Wenn das aber nicht geht bleibt dir nichts anderes übrig als alle transparenten Flächen nach der Tiefe zu sortieren. Wenn es da mittweile keine neueren Techniken dafür gibt ist das durchaus üblich und wird in ausnahmslos allen Spielen gemacht. Bin aber nicht so der Guru bei solchen Dingen.
Bei einem Würfel habe ich auch schon mal einen Trick gesehen der dürfte in deinem speziellen Fall sogar auch funktionieren. Und zwar wurde dort nicht nur ein würfel gezeichnet sondern 2. Zu erst wurden alle Innenflächen gezeichnet. Die waren logischerweise hinten und dann alle Außenflächen. Wichtig dabei darfst du keine doppelseitigen Flächen benutzen. Bei dir würde das so aussehen, dass du 4 Flächen zeichnenen müsstest. Also zu erst die die sich anschauen und dann die voneinander wegzeigen. Je nach Blickwinkel siehst du immer zu erst eine hinterfläche und anschließend eine Vorderfläche. Evtl wird es dann noch notwendig den Tiefentest (glDisable(GL_DEPTH_TEST)) oder das schreiben des Tiefenbuffers (glDepthMask(GL_FALSE)) zu deaktivieren/unterbinden.
Ach ja. Das glDepthMask sorgt dafür, dass gezeichnete Flächen nicht mehr im Tiefenbuffer aufgenommen werden sich aber dennoch an bereits gezeichneten Orientieren. Das wird ganz gerne für Partikelsystem eingesetzt.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Du solltest deine Szene Tiefensortiert zeichnen. Das wirst du später noch brauchen (bei komlexeren Szenen). Wichtig ist dann, dass du zusätzlich wärend du die transparenten Flächen zeichnest, auch noch den Tiefentest deaktivierst. Damit kannst du ein paar Spezialfälle ausmerzen. Aber solche Sachen wie 2 Flächen die sich Kreuzweise schneiden, sind immer noch ein Problem.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Okay,
ich danke euch für die Antworten.
Ich fasse mal zusammen:
1) Tiefensortiert zeichnen/rendern
2) depth_test abschalten.
Dann muss ich wirklich selber sortieren? Das kann doch mitunter total schwierig werden (Winkel, dynamische Objekte, etc.)...
Ist denn der Tiefenpuffer winkelabhängig? Eigentlich ja nicht, da er ja nur beschrieben wird, wenn die Szene am Rendern is, also der Tiefenpuffer vom 3D-Raum nichts weiß...
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Nö. Der Tiefenpuffer ist eine einfache Matrix die die ausmaße deiner Ausgabe hat. Um zu kapieren wie er funktioniert einfach mal hier gucken: http://wiki.delphigl.com/index.php/Tiefenpuffer
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Nö. Der Tiefenpuffer ist eine einfache Matrix die die ausmaße deiner Ausgabe hat. Um zu kapieren wie er funktioniert einfach mal hier gucken: http://wiki.delphigl.com/index.php/Tiefenpuffer
Mitglieder in diesem Forum: 0 Mitglieder und 6 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.