Räumliche Datenstrukturen Seminar Computerspiele Ralf Pramberger Kurzbeschreibung—Diese Ausarbeitung stellt eine Einführung zum Thema Räumliche Datenstrukturen dar. Dazu werden zunächst einige Grundlagen der Computergrafik erklärt, sowie eine Übersicht über die Möglichkeiten von Culling. Des Weiteren werden BSPTrees, Reguläre Gitter, Quadtrees sowie die Bounding Volume Hierarchie eingeführt. Im letzten Kapitel wird das schwierige Problem „Occlusion Culling“ und mögliche Implementierungen zur effizienten Lösung betrachtet. 1 E INLEITUNG Beim Sichtbarkeitsproblem in der Computergrafik handelt es sich um die Frage welche Objekte auf dem Ausgabegerät sichtbar sind. Während es in den Anfängen der Computergrafik noch um die korrekte Berechnung der Sichtbarkeit ging, steht heute die Performance des Echtzeitrenderns im Fokus. Hierzu zählen die Forderung nach mehr frames per second (FPS), höhere Bildqualität im Sinne von Auflösung oder Abtastrate, detailliertere Texturen und präzisere Beleuchtung sowie die Möglichkeit, Szenen mit großen Mengen von Objekten anzuzeigen. Um diese, zum Teil konkurrierenden, Ziele zu erreichen gibt es diverse Optimierungsstrategien. Eine grundsätzliche Technik ist hierbei das Culling. Diese Gruppe von Algorithmen steht für frühzeitiges Entfernen von nicht sichtbaren oder irrelevanten Objekten aus der Grafikpipeline. Um einen Performancegewinn zu erzielen muss die Bestimmung dieser Objekte effizient zur Laufzeit geschehen. Dies lässt sich mit räumlichen Datenstrukturen bewerkstelligen. Dabei werden die Objekte der vorliegenden Szene, häufig im Preprocess, anhand ihrer räumlichen Anordnung in eine hierarchische Baumstruktur sortiert. Durch eine geschickte hierarchische Aufteilung lassen sich zur Laufzeit deutliche Performancegewinne beim Culling oder Verdeckungsberechnung erreichen. Weitere Anwendungsgebiete von räumlichen Datenstrukturen finden sich bei Nachbarschaftssuche in der digitalen Bildbearbeitung oder dem geometrischen Schnittproblem der Kollisionserkennung, wie zum Beispiel bei Crashtests. 2 G RUNDLAGEN In diesem Kapitel werden einige Begrifflichkeiten der Computergrafik erklärt, sowie der Frage nachgegangen wie ein Bild am Monitor Institut für Visualisierung und Interaktive Systeme, Universität Stuttgart. Wintersemester 2012/2013. entsteht. 2.1 Szene Unter einer Szene versteht man in der Computergrafik eine virtuelle Beschreibung des anzuzeigenden Modells. Dies beinhaltet alle Objekte mit den jeweiligen Positionen, eine Kameraposition mit Blickrichtung, Lichtquellen und Materialeigenschaften der Objekte. Aus dieser Beschreibung kann das anzuzeigende Bild berechnet (gerendert) werden. Für das korrekte und „schöne“ berechnen von Bildern gilt es das Sichtbarkeitsproblem zu lösen, also die Fragestellung welche Objekte sichtbar sind. Des Weiteren ist es notwendig die Oberflächen von Objekten korrekt darzustellen. Dies geschieht mit sogenannten Shading Algorithmen. Ein weiterer Punkt betrifft die Beleuchtung der Szene. Sabei wird mit nicht notwendigerweise korrekten physikalischen Beleuchtungsquellen Licht und Schatten simuliert. 2.2 Computergrafik Das Bild auf einem Monitor ist in Pixel aufgeteilt, wobei jeder Pixel einem Punkt auf dem Monitor entspricht. Um ein Bild anzuzeigen, wird ein spezieller Speicher der Grafikkarte, der sogenannte Frontbuffer, mit einem Farbwert für jedes vorhandene Pixel gefüllt. Für die flickerfreie Darstellung von Bildern werden auf aktuellen Grafikkarten die Farbwerte der Pixel abwechselnd in mehreren Speichern berechnet. Dieses Verfahren bezeichnet man als Double- oder Tripple- Buffering, entsprechend der Anzahl von wechselnden Speichern. Um ein einfaches 2-Dimensionales Bild auf dem Monitor anzuzeigen, zum Beispiel eine Bitmap, würde das Bild mit den entsprechenden Farbwerten pro Pixel in den Grafikkartenspeicher geladen, und zur gewünschten Zeit in den Frontbuffer kopiert werden. Ein dreidimensionales Bild auf dem Computermonitor, zum Beispiel aus einem Computerspiel, ist nur scheinbar dreidimensional. Tat- Seminar Computerspiele: Räumliche Datenstrukturen • View Frustum Culling: Bei dieser Art von Culling wird versucht möglichst alle Objekte einer Szene außerhalb des View Frustums (Sichtbarkeitsvolumen) zu entfernen. Das View Frustum entspricht einer abgeschnittenen Pyramide in Richtung der virtuellen Kamera einer Szene. Dabei können Objekte, die links, rechts oder hinter der Kamera liegen, entfernt werden. Objekte, die das Frustum schneiden werden zunächst nicht entfernt. sächlich ist nur das anzuzeigende Modell in dreidimensionaler Form im Speicher des Computers vorhanden. Das anzuzeigende Bild ist eine zweidimensionale Projektion dieses Modells auf das Ausgabegerät. Für diese Projektion gibt es verschiedene Verfahren, welche insgesamt unter dem Begriff Rendering zusammengefasst werden. 2.3 Rasterisierung In aktuellen Grafikkarten und Computerspielen ist die Rasterisation der de facto Standard. Dieses Verfahren wird als Objektbasiert bezeichnet. Dabei werden die Objekte des Modells, in diesem Kontext Szene genannt, ausgehend von der Betrachterposition auf die Bildfläche projiziert. Die einzelnen Objekte werden hierbei häufig als ein Netz aus Dreiecken dargestellt. Der Grund liegt in der Einfachheit der Berechnung sowie der Möglichkeit, Dreiecke in komplexeren Verfahren hinzuzufügen oder zu entfernen. Um Bilder wie in aktuellen Computerspielen zu generieren, können die Dreiecke nun mit Farben oder Texture Mapping gefüllt werden. Dabei muss darauf geachtet werden, dass Objekte, die nahe am Betrachter liegen, nicht durch weiter entfernte überschrieben werden. Das kann durch einen Z-Buffer bewerkstelligt werden. Hierzu wird ein 2D-Array mit Tiefeninformationen (z-Werte) des Bildraums nebenher gepflegt. Falls ein Objekt gezeichnet werden soll, muss zunächst im Z-Buffer pixelweise geprüft werden ob es vor bereits gezeichneten Objekten liegt. Ist dies der Fall darf es gezeichnet werden und der Z-Buffer wird mit dem neuen Objekt aktualisiert. [6, 7] 2.4 • Backface Culling: Die Idee bei dieser Technik gründet auf die Feststellung das die Normale von Objekten einer Szene, zum Beispiel eines Polygons, eine Richtung aufweist. Dementsprechend ist es nicht notwendig die unsichtbare „Rückseite“ von Objekten zu Rendern. • Occlusion Culling: Bei dieser Technik werden verdeckte Objekte innerhalb des Sichtbereichs entfernt. Dieses Verfahren bietet die Möglichkeit für große Performancegewinne, da selbst kleine Änderungen in der Kameraposition bereits massive Änderungen in der Anzahl von sichtbaren Objekten bewirken können. Occlusion Culling korrekt zu berechnen ist im Allgemeinen schwieriger als Frustum oder Backface Culling. • Portal Culling: Speziell für Szenen in Gebäuden eignet sich diese Technik. Dabei wird die Szene in Zellen unterteilt, welche durch Portale miteinander verknüpft sind. Beim Rendern wird die Zelle mit der Kamera komplett betrachtet. Desweitern wird überprüft ob innerhalb des View Frustums ein Portal existiert. Falls ein Portal sichtbar ist, wird ausgehend vom Portal ein weiteres View Frustum für die nächste Zelle erzeugt. Die Erstellung von Zellen und Portalen war in der Vergangenheit häufig vom Mapdesigner per Hand zu erledigen. Techniken zur automatischen Generierung von Portalen existieren zum Beispiel in der Umbra3 Engine. [8] Raytracing Eine andere Möglichkeit des Renderns bieten die bildbasierten Verfahren wie Raytracing. In der einfachsten Form wird hierbei ein Strahl durch jeden zu füllenden Pixel geschickt. Dabei wird ausgehend von der Betrachterposition jedes Objekt der Szene auf Schnitt mit dem Strahl getestet. Um direkte oder indirekte Beleuchtung zu erreichen, kann das auf diese Weise als sichtbar bestimmte Objekt in der Folge als Ausgangspunkt für weitere Strahlen dienen. Verfahren mit mehreren Strahlen per Pixel oder zufallsbasierte Monte Carlo Methoden existieren und bieten Verbesserungen der Qualität von Bildern oder Performancegewinne. Die Vorteile von Raytracing gegenüber der Rasterisierung liegen in der Möglichkeit des Verzichtes auf einen Z-Buffer der Grafikkarte sowie in der fotorealistischen Bildqualität. Ein deutlicher Nachteil ist die Berechnungsgeschwindigkeit. Diese liegt in vielen Fällen deutlich hinter den Rasterisierungsansätzen, weshalb Raytracing häufig nicht für Echtzeitanwendungen gewählt wird. Diverse Versuche das Raytracing für Echtzeitanwendungen bereitzustellen werden derzeit unternommen. [12] 2.5 • Detail Culling: Zu kleine Objekte oder Objekte, die zu weit entfernt sind, werden nicht betrachtet. Culling muss im Allgemeinen kein korrektes Ergebnis liefern. Häufig reicht es ein Potentially Visible Set (PVS) zu errechnen. Das PVS besteht aus einer konservativen Schätzung der sichtbaren Objekte. Dies bedeutet, dass alle sichtbaren und ein möglichst kleiner Teil der unsichtbaren Objekte im PVS sind. Der Grund hierfür ist die meist „einfachere“ Berechnung von angenäherten Lösungen im Vergleich zu korrekten Lösungen. Entsprechend müssen die Ergebnisse des PVS durch einen korrekten Hidden Surface Removal (HSR) Algorithmus gerendert werden. [3, 5] Culling 3 R ÄUMLICHE DATENSTRUKTUREN Unter Räumlichen Datenstrukturen versteht man die Aufteilung der Szene durch verschiedene Verfahren. Grundsätzlich kann man zwischen objekt- und raumzentrischen Verfahren unterscheiden. Zu den objektzentrischen Verfahren zählt die Bounding Volume Hierarchie (BVH). Hier werden die Objekte der Szene von immer größer werdenden Bounding Volumes umschlossen bis zu einer alles Umschließenden. Im Gegensatz hierzu stehen die raumzentrischen Verfahren wie zum Beispiel BSP-Tree oder Octree. Bei diesen Verfahren wird zunächst um die gesamte Szene, mit allen enthaltenen Objekten, eine umschließende Hülle gelegt. Daraufhin wird dieser Raum sukzessive in Unterräume unterteilt. Die Art der Unterteilung sowie das StoppKriterium bestimmen die Charakteristika der verschiedenen Verfahren. Beide Typen von Verfahren können bei der Erstellung der Hierarchie einfache geometrische Formen wie Kugeln, Rechtecke oder achsenorientierte Rechtecke. Der Vorteil darin besteht in der Einfachheit bei der Berechnung von Schnitttest im Vergleich zu komplexen geometrischen Formen. Große Performancegewinne bieten die hierarchischen räumlichen Datenstrukturen für Anwendungszwecke, bei welchen es möglich ist, Teilbäume bzw. Unterräume als irrelevant zu identifizieren und zu verwerfen. Das legt eine enge Verwebung von Abb. 1. Übersicht über Culling Methoden [3] Der Begriff Culling beschreibt die Verfahren zum Entfernen von nicht sichtbaren Objekten einer Szene. Damit soll verhindert werden, dass Rechenleistung beim Rendern an nicht sichtbaren Objekten „verschwendet“ wird. Es wird zwischen verschiedenen Arten von Culling unterschieden: 2 Seminar Computerspiele: Räumliche Datenstrukturen Culling-Verfahren und räumlichen Datenstrukturen nahe. Weitere Einsatzmöglichkeiten sind zum Beispiel die Nachbarschaftssuche sowie die Möglichkeit, direkt aus der Datenstruktur durch geschicktes traversieren des zugehörigen Baumes, das Sichtbarkeitsproblem zu lösen. Dies setzt jedoch eine spezielle Methodik beim Aufbau der Datenstrukturen voraus. Eine weitere Möglichkeit zur Aufteilung der Szene bieten reguläre Gitter. Hierbei wird der Raum nicht in einer rekursiven Art unterteilt, sondern es wird ein vorgegebenes Gitter fester Größe verwendet. Vorteile hierbei finden sich in der einfachen Art das Gitter zu konstruieren und der einfachen Traversierung. Nachteilig an diesem Verfahren ist die empirische Erkenntnis, dass häufig nur wenige Zellen tatsächlich belegt sind, während sehr viel Geometrie auf einige wenige Zellen konzentriert ist. 3.1 Raum umspannen oder die Vereinigung der Objekte als Bounding Volume aufgefasst werden. Im ersten Fall müsste bei einer Schnittanfrage der gesamte Baum traversiert werden, im Zweiten böte ein möglicher Schnitttest keine Verbesserung in der Komplexität. Die Wahl der richtigen Bounding Box ist somit eine Abwägung zwischen Passgenauigkeit und Geschwindigkeit bzw. Aufwand bei der Berechnung. Die Standard Bounding Volumes werden in Abbildung 3 dargestellt. Dabei findet Herman Haverkort [10], dass die am Häufigsten in der Praxis eingesetzte Form die Achsenparallele Bounding Box (AABB) ist. Der Grund liegt in der einfachen Berechnung einer minimalen Bounding Box für eine Menge von Objekten, geringem Speicherverbrauch sowie der einfachen und robusten Berechnung von Schnitttests. 3.1.2 View Frustum Culling mit BVH BVHs eignen sich gut für Frustum Culling, vorausgesetzt die Struktur beim Aufbau des Baums folgt gewissen Regeln. Die Verbesserung liegt in der Aufteilung der Szene, so können im Idealfall durch eine geschickt gewählte Hierarchie bereits sehr früh ganze Teilbäume vom weiteren Testen auf Schnitt mit dem View Frustum ausgeschlossen werden. Deshalb ist es wichtig, dass die BVH einer Szene eine räumliche Aufteilung aufweist. Daher sollten Objekte die in der Szene nah beieinander liegen auch in der BVH benachbart werden. Als Beispiel eignet sich die Szene einer Kleinstadt. Die Grundfläche kann hierbei in verschiedene Tiles unterteilt werden, welche die entsprechenden Bounding Volumes ergeben. Die Position der Objekte (Bäume, Häuser) ist somit automatisch an eine Tile-Bounding Volume gebunden und erfüllt die Bedingung der räumlichen Aufteilung. [3] Weitere Aspekte für effizienten View Frustum Culling sind die Forderung nach nicht zu flachen Hierarchien, da aus dem wegschneiden möglichst großer Teilbäume der größte Speedup erreicht werden kann. Zudem gilt die Forderung, keine zu tiefen Hierarchien zu erstellen, da diese nur zusätzliche Schnitttests ergeben. Als grobe Heuristik wird in [3] angegeben, dass die Anzahl der Hierarchiestufen etwa der Anzahl von Nachfolge-Knoten sein sollte. Der View Frustum Culling Algorithmus [3]: Bounding Volume Hierarchie Abb. 2. Szene mit Unterteilungsebenen (l.), zugehörige BVH (r.) Ein objektzentrischer Ansatz zur hierarchischen Sortierung von Szenen ist die Bounding Volume Hierarchie. Darunter versteht man eine Baumstruktur über die geometrischen Objekte einer Szene. Die geometrischen Objekte sind in Bounding Volumes (Hüllkörper) eingeschlossen und stellen die Blätter des Baumes dar. Die Elternknoten dieser Blätter sind ihrerseits Bounding Volumes, welche die Kindknoten einhüllen. Die Wurzel des Baumes stellt die Bounding Volume für die gesamte Szene dar und umschließt alle untergeordneten geometrischen Objekte, deren Bounding Volumes und die „virtuellen“ Bounding Volumes der inneren Knoten. Eine spezielle Charakteristika für Bounding Volume Hierarchien ist die Tatsache, dass Objekte nicht zerschnitten werden müssen. Bei der Kollisionsberechnung ist die Laufzeit des bruteforce Ansatzes, alle Objekte paarweise auf Schnitt zu testen, O(n2 ). Durch den Einsatz einer BVH kann man auf O(n) gelangen. [11] 1. Beginne mit Wurzel des Graphen 2. Teste Knoten auf Schnitt mit Blickpyramide • Falls Schnitt nicht leer: traversiere rekursiv mit den Kindern • Sonst: stelle Bearbeitung des Knoten ein 3.2 Abb. 4. Szene mit Unterteilungsebenen (l.), zugehöriger BSP-Baum (r.) [3] Abb. 3. Standard Bounding Volumes [3] 3.1.1 BSP-Tree Binary Space Partitioning (BSP) [2] ist eine Methode, die Szene rekursiv in zwei Unterräume zu unterteilen. Dabei wird der Raum in jedem Schritt anhand einer ausgesuchten Ebene geteilt. Diese Ebene richtet sich nach der Orientierung eines Objektes. Die Rekursion stoppt wenn ein gewähltes Abbruchkriterum getroffen wurde. Das kann eine maximale Baumtiefe sein oder das Erreichen einer speziellen Anzahl von Objekten in den Blattknoten. Als Ergebnis der rekursiven Unterteilungen erhält man einen binären Baum (BSP-Tree). In diesem Baum bezeichnet die Position (links oder rechts) eines Kindknotes auf welcher Seite im Raum sich der Teilbaum befindet. Somit ist es Bounding Volumes Die Wahl der Bounding Volumes lässt sich auf verschiedene Kriterien reduzieren. Zum einen ist es dienlich einfache Formen für Bounding Volumes zu nutzen. Der Grund hierfür liegt in den geringen Speicheranforderungen pro Bounding Volume und den einfach errechenbaren Schnitttests. Auf der anderen Seite sollten die Bounding Volumes möglichst eng um die zu umschließenden Objekte liegen, sodass bei möglichen Schnittanfragen möglichst früh abgebrochen werden kann. Als Extremfälle könnte die Bounding Volume den gesamten 3 Seminar Computerspiele: Räumliche Datenstrukturen Octree[13]. Mit diesen Erweiterungen können Octrees auch dynamische Szenen gut bewältigen. durch einfache Traversierung möglich eine „back-to-front“ Sortierung der Objekte zu erhalten. Dies war ursprünglich zur Lösung des Sichtbarkeitsproblem sehr interessant, da der sogenannte Painters Algorithmus auf eine effiziente Berechnung der Reihenfolge angewiesen war. Der Bedarf einer Sortierung hat in heutiger Zeit durch den weit verbreiteten Einsatz des Z-Buffers abgenommen. BSP-Bäume sind sehr aufwendig in der Erstellung. Dies liegt an der Schwierigkeit eine optimale Unterteilungsebene zu finden. Ein weiteres Problem ist das teure Einfügen von Objekten in dynamischen Szenen. Die Zeitkomplexität zum Erstellen eines Baumes mit n Objekten wird von [RantaEskola2001] mit O = (n2 *log(n)) angegeben. Falls eine Unterteilungsebene Objekte schneidet, werden diese aufgeteilt und in den linken und rechten Teilbaum eingefügt (vor- und hinter dem Objekt). Das führt bei schlecht gewählten Teilungsebenen zu einer massiven Vermehrung von Objekten. BSP-Trees erlangten zum ersten Mal für die Spieleindustrie große Popularität durch die Game Engine „id Tech 1“, welche in Spielen wie Doom, DoomII und Hexen eingesetzt wurde. [4] 3.2.1 4 O CCLUSION C ULLING Wie bereits in Kapitel 2.5 und Abbildung 2 erwähnt, versteht man unter Occlusion Culling das Entfernen von verdeckten Objekten aus der Szene um diese nicht unnötigerweise zu Rendern. Da beim Occlusion Culling die Beziehungen der einzelnen Objekte untereinander untersucht werden muss, stellt Occlusion Culling ein schwierigeres Problem dar als Frustum- oder Backface-Culling. Der einfache Ansatz jedes Objekte auf Verdeckung zu testen zu langsam ist, erzeugen sehr viele Algorithmen wieder eine Hierarchie für die gesamte Szene und testen die Verdeckung top-down auf dieser Hierarchie. [5] 4.1 Klassifizierung der Techniken Occlusion Culling Techniken können laut Cohen et al. [5] nach folgenden Kriterien und Funktionalitäten gruppiert und analysiert werden: • Online vs. Offline und Punkt vs. Region Die Berechnung der Verdeckung kann zur Laufzeit (online) geschehen oder vorberechnet werden (offline). Diese Unterscheidung ist eng verwoben mit der Frage, ob die Verdeckungsberechnung für einen speziellen Kamerapunkt oder für eine Region gelten soll. Die Berechnung der Verdeckung einer gesamten Region braucht im Allgemeinen mehr Rechenleistung und ist deshalb prädestiniert zur offline- Vorberechnung. Nachteile der vorberechneten Verdeckung sind die hohen Speicherkosten der Verdeckungsinformationen sowie die schwierige Handhabbarkeit von dynamischen Szenen. [5] kD-Trees Der kD-Tree stellt eine weitere Form eines Binärbaums dar und kann ebenfalls zum Unterteilen der Geometrie verwendet werden. Bei dieser Variante werden die Ebenen jeweils achsenparallel geschnitten. Hierfür kann die x-Achse zunächst als Wurzelknoten ausgewählt werden. Als Kindknoten werden die weiteren Koordinatenachsen rekursiv bis zu Erreichen des Abbruchkriterums eingefügt. 3.3 Reguläres Gitter Ein reguläres Gitter unterteilt den Raum in ein vorgegebenes Gitter fester Größe. Die einzelnen Zellen werden Voxel genannt. Beim Aufbau der Datenstruktur wird in jedem Voxel ein Pointer auf schneidende Objekte gespeichert. Der kritische Punkt bei regulären Gittern ist die Maschenweite der einzelnen Voxel. Wird diese zu eng gewählt befindet sich ein einzelnes Objekt in vielen verschiedenen Voxeln, wird sie hingegen zu grob gewählt befinden sich viele Objekte im gleichen Voxel. Je stärker dieser Effekt auftritt, desto bedeutungsloser wird die Struktur. Ein Vorteil von regulären Gittern betrifft das Einfügen von Objekten. Dies ist durch den einfachen Aufbau sehr leicht möglich. [3] 3.4 • Bildraum vs. Objektraum Der Unterschied zwischen Bildraum und Objektraum geht auf Ivan Sutherland[15] zurück. Dabei wird die Verdeckungsberechnung von Objektraumverfahren direkt an den Objekten durchgeführt, ohne auf das Ausgabegerät zu achten. Im Gegensatz dazu steht das Bildraumverfahren für die Verdeckungsberechnung pro Pixel. Dabei gelten Bildraumverfahren als äußerst robust, in Bezug auf Problemquellen wie T-Junctions, degenerierten Primitiven oder Löchern in der Struktur. [16] • Konservativ vs. Annähernd Occlusion Culling Algorithmen liefern im Vergleich zu Hidden Surface Removal Algorithmen keine exakten Ergebnisse. Konservative Occlusion Culling Algorithmen überschätzen daher die Menge von sichtbaren Objekten in dem Sinn, dass möglichst viele - aber nicht alle verdeckten Objekte geculled werden. Annähernde Algorithmen versuchen das Problem von der anderen Seite anzugehen, dabei versuchen Sie möglichst alle sichtbaren Objekte zu finden. Dies muss nicht immer gelingen, so können Objekte die keinen großen Einfluss auf das Bild haben, aber sichtbar sind, verworfen werden. [5] Quadtree/Octree Abb. 5. Unterteilung 2D Szene durch Quadtree [3] • Einzelne vs. zusammengesetzte Occluder Von zusammengesetzten Occludern spricht man bei Objekten, die falls zusammen betrachtet, ein weiteres Objekt verdecken obwohl sie einzeln dazu nicht in der Lage wären Quadtrees[1] und Octrees sind hierarchische Unterteilungsstrukturen. Beim Aufbau der Struktur wird zunächst das Initiale Voxel gewählt, welches die gesamte Szenegeometrie umschließt. In den weiteren Schritten wird dieses Voxel rekursiv in vier (Quadtree) oder acht (Octree) gleich große Untervoxel geteilt bis ein Abbruchkriterium erreicht wird. [13] Dabei wird der Quadtree normalerweise für 2dimensionale-, der Octree für 3-dimensionale Unterteilungen verwendet. Der Vorteil gegenüber regulären Gittern ist, dass beim Aufbau der Struktur auf die Geometrie der Szene eingegangen wird. So wird bei entsprechend gewähltem Abbruchkriterium ein wenig bestückter Bereich der Szene nicht oft unterteilt, ein dicht bestückter hingegen häufiger. [13] Octrees sind aufgrund ihrer einfachen und schnellen Struktur sehr beliebt in der Computergrafik. Ein Nachteil stellen dynamische Szenen dar. Dabei muss die unmodifizierte Variante des Octrees bei hinzufügen oder entfernen eines geometrischen Objektes neu aufgebaut werden. Aus diesem Grund wurden viele Erweiterungen des ursprünglichen Octrees entwickelt wie der Octree-R[14] oder Loose Abb. 6. Objekte B und A verdecken zusammengesetzt Objekt C [16] • Auswahl der Occluder Einige Algorithmen nutzen alle Objekte der Szene als mögliche Occluder, während andere durch Heuristiken nur eine Teilmenge der Objekte als mögliche Occluder untersuchen. Die Untersuchung aller Objekte kann das Ergebnis 4 Seminar Computerspiele: Räumliche Datenstrukturen verbessern - auf Kosten der Rechenleistung. Eine weitere Möglichkeit stellen „Virtuelle Occluder“ dar. Dabei werden einzelne komplexe Objekte durch eine einfachere verdeckende Geometrie ausgetauscht. Als Beispiel dient hier ein Wald mit Sichtweite von 15 Metern. Anstatt die Bäume einzeln zu betrachten wird ein virtueller Occluder in 15Meter aufgestellt. [5, 17] • Szenentypen Viele Occlusion Culling Techniken sind auf spezielle Szenentypen und Anwendungen begrenzt. Sichtbarkeiten die im Präprozess errechnet werden sind häufig nicht für dynamische Szenen geeignet. Portal-Culling Techniken eignen sich im speziellen für Innenräume und weniger für offene Außenwelten. [5, 17] • Weitere Eigenschaften Abb. 8. Beispiel für hierarchisches occlusion Culling an Octree-Szene [18] – Eine geforderte Eigenschaft stellt die sogenannte „Output sensitivity“ dar - die Laufzeit eines Culling Algorithmus sollte proportional zur sichtbaren Menge sein. die Seite eines Kindknotens relevant. Das bedeutet im Occlusion Tree gibt es ein sichtbares und ein unsichtbares Kind. Beim tatsächlichen Occlusion Culling wird die räumliche Datenstruktur der Szene nun mit dem Occlusion Tree verglichen. Falls ein Knoten der Szene als vollständig sichtbar oder vollständig unsichtbar erkannt wird stoppt die Rekursion. Für alle Kindknoten wird die Sichtbarkeit entsprechend gesetzt. Zum schlussendlichen Rendern werden alle sichtbaren und teilweise sichtbaren Objekte durch einen exakten Sichtbarkeitstest, wie zum Beispiel den Hardware Z-Buffer, gerendert. Dieser Algorithmus ist konservativ und nicht für dynamische Szenen geeignet. Beim Hinzufügen und entfernen von Objekten muss die räumliche Datenstruktur der Szene geupdated werden sowie die Klassifizierung eines neuen Objektes vorgenommen werden. In Versuchen wurde in speziellen Konfigurationen (Anzahl Occluder, Modifizierungen am Occlusion Tree) und Szenen ein Speedup von 1,75 bis 3,75 im Vergleich zum Rendern ohne Occlusion Culling erreicht. [18] – Einige Algorithmen benötigen spezielle Hardware. Beispielweise einen Z-Buffer oder „Hardware Occlusion Queries“. [5] – Für diverse Occlusion Culling Techniken ist es notwendig, die Szene in einer speziellen räumlichen Datenstruktur vorliegen zu haben. Dies liegt an der engen Verwebung und Ausnutzung der Vorteile einzelner Datenstrukturen. [17] 4.2 Hierarchisches Occlusion Culling 4.3 Hierarchischer Z-Buffer Abb. 7. Ein Shadow-Tree funktioniert ähnlich wie der Occlusion Tree [18] Abb. 9. Aufbau der Z-Pyramide [20] Das Verfahren von Bittner et al. [18] benutzt neben der räumlichen Datenstruktur für die Szene eine Repräsentierung der Occluder in Form eines Binärbaums. Dazu werden zunächst im Preprocess alle Objekte auf die Fähigkeit zur Verdeckung überprüft. Dies geschieht durch Kenntnis über das Modell, zum Beispiel werden Polygone die zu detaillierten Objekten gehören (Stühle, Blumen..) als nicht verdeckungsfähig ignoriert. Die als Verdeckungsfähig erkannten Objekte sind häufig große Polygone wie Wände, Böden oder Decken von Gebäuden. Diese Information wird in der zu Grunde liegenden räumlichen Datenstruktur (zum Beispiel Octree) gespeichert. Zur Laufzeit werden dynamisch gute Occluder bestimmt. Dazu werden alle möglichen Occluder in einem definierten Radius zur Kameraposition auf die Verdeckfähigkeit für die aktuelle Situation getestet. Hierzu wird die sogenannte „area-angle“ errechnet, also die Größe des verdeckten Raums durch den Occluder, ausgehend von der Kameraposition. Die gewählten Occluder werfen einen Verdeckungsraum ähnlich wie Schatten, aus welchen im gleichen Schritt der binäre Occlusion Tree gebildet wird. Ähnlich wie bei der Binary Space Partitioning (BSP) ist Abb. 10. Aufbau der Z-Pyramide mit Werten [20] Der hierarchische Z-Buffer ist ein weiterer Ansatz für occlusion Culling. Hierbei werden zwei Datenstrukturen benötigt. zum Einen 5 Seminar Computerspiele: Räumliche Datenstrukturen wird die Szene in einem Octree gespeichert und zum Anderen wird die Z-Pyramide als Verdeckungsspeicher aufgebaut. Die Konstruktion des Octrees geschieht nach dem in Kapitel 3.4 Quadtree/Octree beschriebenen Muster. Die Verwendung von Octrees bewirkt, dass der Hierarchische Z-Buffer für statische Szenen geeignet ist. Die Z-Pyramide besteht aus verschieden groben Z-Werten des bekannten Z-Buffers. Die unterste Ebene der Pyramide entspricht genau dem Z-Buffer, jede höhere Stufe fasst vier Z-Buffer Werte zusammen bis zur Spitze mit einem einzigen Z-Wert. Dabei wird jeweils der maximale Wert der feineren Pyramidenebenen als Wert für die höhere Stufe übernommen. Dies bedeuted, dass der Z-Wert welcher am weitesten vom Betrachter entfernt liegt, in der Pyramide nach oben wandert. Eine Änderung beim Rendern im Z-Buffer bewirkt ein Update der Z-Pyramide. Dabei wird der neue maximale Z-Wert nach oben propagiert bis sich der Wert in der Pyramidenstufe nicht mehr ändert. Der Algorithmus zum Cullen in Pseudocode den so gefundenen Zellen müssen Portale zu weiteren Zellen auch auf Sichtbarkeit untersucht werden. Dieser konservative Algorithmus testet nicht auf Verdeckung von Objekten die sich innerhalb der Zellen befinden. Der Algorithmus bietet seine Vorteile vor allen in den speziellen Innenwelten, solange sich die Anordnung dieser Welten nicht ändert können dynamische Szenen relativ gut behandelt werden. [5] 5 C ONCLUSION Räumliche Datenstrukturen bilden die Grundlage für derzeitiges und zukünftige Entwicklungen im Echtzeitrendern. Die verfügbare Rechenleistung wird in den nächsten Jahren noch weiter steigen, jedoch ist es nicht zu erwarten dass dieser Trend die Anforderungen der Bildsynthese überholen wird. Aktuelle Entwicklungen beschäftigen sich unter anderem mit den Möglichkeiten der automatischen Generierung von Portalen in Szenen, welche aktuell noch von menschlichen Mapdesignern fest in die Szene integriert werden müssen. [8] Weitere Arbeiten beschäftigen sich mit dem fotorealistischen Rendern komplexer Szenen auf leistungsschwächeren „Consumer Computers“ oder Mobilen Geräten. Dabei werden die massiven parallelen Möglichkeiten welche durch die Architektur der Grafikkarten gegeben sind im Zusammenspiel mit Swapping-Mechanismen ausgenutzt, um selbst bei wenig verfügbaren Speicher sehr große Szenen in kurzer Zeit zu Rendern. [9] 1: ProcessOctreeNode(OctreeNode N) 2: if(isOccluded(N.BoundingVolume, ZPuffer)) then return; 3: for each primitive p in N 4: tileInto(p, ZPuffer) 5: end 6: for each child node C in N in front-to-back order 7: ProcessOctreeNode(C) 8: end L ITERATUR [1] Finkel, R.A.,Bentley, J.L. Quad Trees A Data Structure for Retrieval on Composite Keys, Acta Informatica (1974), [2] Henry Fuchs, Zvi M. Kedem, Bruce F. Naylor, On visible surface generation by a priori tree structures [3] Prof. D. Fellner,T. Kalbe, M. Bein, Vorlesung: Graphische Datenverarbeitung I WS2009/2010, [4] Doom Wiki, Online http://doom.wikia.com/wiki/Doom_ rendering_engine, Stand 05.01.2013 [5] Daniel Cohen-OR, Yiorgos Chrysanthou, Cláudio T. Silva, Frédo Durand, A Survey of Visibility for Walkthrough Applications, [6] Prof. Dr. Thomas Ertl, Vorlesung: Computergrafik WS11/12, [7] Marcus Frenkel, Computergrafik, http://scienceblogs.de/ von_bits_und_bytes/2012/06/22/, [8] Umbra3 Enginge, http://www.umbrasoftware.com/ [9] Centileo, SIGGRAPH 2012, http://www.centileo.com [10] Herman Johannes Haverkort, Results on geometric networks and data structures, 2004 [11] Tomas Moller and Eric Haines, Real-Time Rendering, A K Peters,2nd edition, 2002. [12] Theo Valich (June 12, 2008), „Intel converts ET: Quake Wars to ray tracing“, TG Daily, http: //www.tgdaily.com/trendwatch-features/ 37925-intel-converts-et-quake-wars-to-ray-tracing [13] HELIN, V., 2003. Hierarchies for occlusion culling. [14] HAVRAN, V. 2000. Heuristic Ray Shooting Algorithms. Ph.d. thesis, Department of Computer Science and Engineering, Faculty of Electrical Engineering, Czech Technical University in Prague., [15] Ivan Sutherland u.a.: A Characterization of Ten Hidden-Surface Algorithms. ACM Computing Surveys (CSUR) 6,1 (March 1974): 1-55, ISSN 0360-0300, [16] AILA, T. 2000. SurRender Umbra: A Visibility Determination Framework for Dynamic Environments. Master thesis, Helsinki University of Technology. [17] HEY, H., AND PURGATHOFER, W. 2001. Occlusion culling methods.In Proceedings of EUROGRAPHICS 2001, Eurographics Association, Eurographics Association. [18] J. Bittner, V. Havran, and P. Slavik. Hierarchical visibility culling with occlusion trees. In Proceedings of Computer Graphics International 98, [19] Gamasutra.com - Occlusion Culling Algorithms, Online http://www.gamasutra.com/view/feature/131801/ occlusion_culling_algorithms.php?page=2 [20] Matthias Fischer, Universität Paderborn, Vorlesung Algorithmen für hochkomplexe Virtuelle Systeme, Sommersemester 2012 Gestartet wird der der rekursive Algorithmus mit der Wurzel des Szene-Octrees. Der Test isOccluded(..) in Zeile 2 testet das Bounding Volume des Knoten N auf Verdeckung. Dabei wird jede Seite des Bounding Volumes gegen die Stufen der Z-Pyramide getestet, angefangen bei der höchsten (gröbsten) Stufe der Pyramide. Die Bounding Volume und damit der Knoten sowie alle Kinder wird als komplett verdeckt abgelehnt, falls die nächste Entfernung einer Seite der Bounding Volume weiter entfernt liegt als der entsprechende Z-Wert in der Pyramide. Die Funktion tileInto(..) fügt die Primitive des Knoten in den Z-Buffer ein, woraufhin die Werte der Z-Pyramide angepasst werden. Anschließend werden mit den Kindern des Knoten rekursiv in frontto-back Reihenfolge, also von vorne nach hinten, traversiert. Am Ende des Algorithmus ist in der untersten Stufe der Pyramide ein Standard Z-Buffer Bild der Szene. [5, 19, 20] Weitere Optimierungen des hierarchischen Z-Buffers existieren. Als Wichtigste ist die Hardwareimplementierung eines Z-Buffers zu nennen, es gibt jedoch auch Ansätze welche die Berechnungen der ZPyramide aus dem Z-Buffer des vorherigen Bildes übernehmen. [5] 4.4 Cell-and-Portal Occlusion Abb. 11. Vogelperspektive auf die Zellen mit Portalen (links), gerendertes Bild (rechts) [3] Beim Cell-and-Portal Ansatz wird die Szene in Zellen aufgeteilt die mit Portalen verbunden sind. In einer Computerspielwelt würden sich Räume oder verbundene Tunnelsysteme als Zellen anbieten, wobei Türen, Fenster oder schmale Durchgänge die Portale darstellen. Die Idee dahinter ist die Feststellung, dass in solchen Umgebungen viele Objekte der Szene durch die Spielwelt geculled werden können. Das Verfahren benutzt eine räumliche Datenstruktur für die Szene derart, dass Zellen die Knoten und Portale die Kanten des Baums darstellen. Vor dem Rendern werden nun ausgehend von dem aktuellen View Frustum der Kamera alle adjazenten Zellen auf Sichtbarkeit untersucht. In 6