Tiefensortierung für Billboards
Sebastian Pohl - 29. Mai 2014Transparente Objekte sind in der Computergrafik schon seit ewigen Zeiten immer ein Problem. Werden sie nicht in der richtigen Reihenfolge gezeichnet gibt es unschöne Darstellungsfehler.
Das obige Bild zeigt dabei was im einfachsten Fall zweier teiltransparenter Flächen passieren kann. Auf beiden Seiten sind jeweils zwei Quadrate die unterschiedlich weit von der virtuellen Kamera entfernt sind. Das linke obere ist näher am Betrachter als das rechte untere. Der Schwarzwert gibt gleichzeitig auch an wie transparent das Objekt ist. Je heller die Farbe ist, umso durchsichtiger ist es. Wird das vordere zuerst gezeichnet, überschreibt das danach gezeichnete, hintere Quadrat durch seine Transparenz teilweise das Ergebnis des vorderen. Das ist auf der linken Seite des Bildes zu sehen. In der richtigen Reihenfolge (von hinten nach vorne) gibt es das korrekte Bild auf der rechten Seite. Der graue Rahmen dient jeweils nur der Verdeutlichung der Ausmaße der Formen.
Ist die Sortierung nach den Tiefenwerten für solche einfachen Objekte noch praktikabel (zumindest für wenige Anwendungsfälle), wird es bei komplexen Objekten die sich eventuell noch überschneiden schon sehr viel aufwändiger. Diese Techniken möchte ich hier allerdings nicht behandeln.
Da häufig für die Darstellung von Effekten wie Rauch oder Feuer Partikel und Billboards verwendet werden die fast immer teiltransparent sind, ist hier die Tiefensortierung sehr wichtig und aufgrund der Eigenschaften der Billboards auch praktikabel.
Um größere visuelle Probleme zu vermeiden empfiehlt es sich Billboards immer so auszurichten, das sie parallel zur Bildebene sind (Siehe Variante 2 im Artikel zu Billboards).
Im Bild zu sehen ist eine Kamera K, die Blickrichtung und vier „Billboards“. Da diese Objekte in der Tiefe von Fern nach Nah sortiert werden müssen, wäre die richtige Reihenfolge also D, C, B und dann A. In diesem Fall liegen die Objekte alle nahe genug an der Sichtachse und weit genug voneinander entfernt, das es nicht zu Darstellungsfehlern kommt. Hat man viele Objekte auf engem Raum die sich auch von Sichtachse weiter entfernen gibt es ein Problem:
Hier schlägt der intuitive Ansatz, die Tiefe als Entfernung zwischen Kamera und Objekt als Grundlage der Sortierung zu nutzen, leider fehl. Denn obwohl diese Entfernung, angezeigt an den gestrichelten Kreissegmenten, für Objekt B höher ist als für Objekt A, kommt es in einigen wenigen Fällen zu Fehlern. Ursache hierfür ist die Eigenschaft der Billboards, immer parallel zur Bildebene zu stehen. Dadurch muss zur Tiefenbestimmung anstelle der Entfernung der Position des Objektes von der Kamera, der Abstand der Bildebene und des Billboards herangezogen werden.
Nehme wir also an E ist die imaginäre Bildebene auf der senkrecht die Blickrichtung L der Kamera steht. L ist in diesem Fall ein normierter Vektor. Um nun den Abstand zwischen der Ebene E und den Objekten A und B zu bekommen ist nur ein bisschen Mathematik notwendig.
vA = A – K
vB = B – KdA = vA ⋅ L
dB = vB ⋅ L
In diesem Fall ist ⋅ das Skalarprodukt, daher entspricht die Berechnung für dA und dB der Projektion der Vektoren vA und vB auf den Vektor L und praktischerweise auch dem Abstand zwischen E und A bzw. B.
Nach den resultierenden Werten für dA und dB kann man dann auch die Tiefensortierung für Billboards vornehmen ohne das es zu Bildfehlern kommt.
Abschließend noch ein paar Bilder aus der Praxis. Zuerst ganz ohne Sortierung:
Dann mit naiver Sortierung über den Abstand zwischen Objekt und Kamera. Hier sind die Darstellungsfehler schon deutlich geringer, aber immer noch auffällig:
Und zum Schluß mit dem hier vorgestellten Vorgehen. Hier sind jetzt keinerlei Fehler mehr sichtbar: