Rendering großer Punktwolken mittels Out-of-Core LOD-Hierarchien Stefan Koppitz TU Dresden Fakultät Informatik Institut für Computergrafik und Visualisierung 26. August 2009
1 Einführung 2 Level-of-Detail 3 Sequentialisierung 4 Out-of-Core 5 Ergebnisse 6 Outro
Motivation Beim Scannen von 3D-Objekten können extrem große Punktwolken entstehen Ziel ist diese großen Punktwolken (> 500 MB) interaktiv hochqualitativ darzustellen 3D-Scanning
Aufgabe 1 Interaktivität durch LOD-Hierarchie (Octree, Kd-Baum,...) LOD-Auswahl, Culling und Rendering auf GPU blickpunktabhängige, adaptive LOD-Auswahl Entlastung der CPU 2 Sehr große Punktwolken + LOD-Hierachie passen nicht in Haupt-/Videospeicher, deswegen Komprimierung Out-of-Core Techniken (Swapping, Caching) Sequentielle Verarbeitung 3 Hochqualitative Darstellung durch EWA-Splatting aus Großen Beleg
EWA-Splatting Durch Kreise bzw. Ellipsen (sogenannte Splats) wird Objektoberfläche approximiert Splat s i besteht aus Position p i Normale n i Binormale s i Tangente t i Farbe c i Radius r i GPU-beschleunigt Per-Pixel Beleuchtung Antialiasing
LOD-Hierarchie: Aufbau Quadtree LOD-Hierarchie H mit Knoten N i mit Elternknotenindex p i Index des ersten Kindknotens first i Anzahl der Kindknoten n i Surfel Halbwinkel des Normalenkegels θ i
LOD-Hierarchie: Konstruktion Top-Down: speicher- und zeitineffizient Bottom-Up: speicher- und zeiteffizient, Tiefe schätzen Inkrementell: bei großen Buckets sehr effizient Centroid-Berechnung am aufwendigsten Konstruktion
LOD-Hierarchie: LOD-Auswahl Anfang der Rekursion bei Wurzel Sichtbarkeitsberechnung Bildraumfehler e (mit Objektabstand d i, Bildraumtoleranz ε) e = A i /d 2 i Ende der Rekursion bei e ε Quadtree
LOD-Hierarchie: Culling Culling Frustum Culling: γ α>ω Backface Culling: β + θ<90 n i θ i β p i r i γ α ω p i v z v z
Intervalltest CPU entlasten und GPU fordern GPU ist Stream-Prozessor mit paralleler und sequentieller Verarbeitung Rekursiver Test auf GPU daher nur ineffizient ausführbar Lösung ist Sequentialisierung der LOD-Hierarchie H Dazu Ersetzung des rekursiven Tests durch Intervalltest
Split-Distanz Untere Schranke des Intervalls ist Split-Distanz d min Berechnet sich aus Split-Test: ε > e (1) ε > πr 2 d 2 (2) ε d > r π (3) d min = r π Intervalltest Teil 1: d > d min
Split-Distanz Untere Schranke des Intervalls ist Split-Distanz d min Berechnet sich aus Split-Test: ε > e (1) ε > πr 2 d 2 (2) ε d > r π (3) d min = r π Intervalltest Teil 1: d > d min
Split-Distanz Untere Schranke des Intervalls ist Split-Distanz d min Berechnet sich aus Split-Test: ε > e (1) ε > πr 2 d 2 (2) ε d > r π (3) d min = r π Intervalltest Teil 1: d > d min
Merge-Distanz Obere Schranke des Intervalls ist Merge-Distanz d max Entspricht Abbruchkriterium der Rekursion Verhindert redundante Darstellung { dmax n d p min = + p n p p falls n N I n N L, falls n = n R. (4) Intervalltest Teil 2: d < d max Ersetzung des rekursiven Test durch Intervalltest d min < d < d max auf Liste L
Merge-Distanz Obere Schranke des Intervalls ist Merge-Distanz d max Entspricht Abbruchkriterium der Rekursion Verhindert redundante Darstellung { dmax n d p min = + p n p p falls n N I n N L, falls n = n R. (4) Intervalltest Teil 2: d < d max Ersetzung des rekursiven Test durch Intervalltest d min < d < d max auf Liste L
Merge-Distanz Obere Schranke des Intervalls ist Merge-Distanz d max Entspricht Abbruchkriterium der Rekursion Verhindert redundante Darstellung { dmax n d p min = + p n p p falls n N I n N L, falls n = n R. (4) Intervalltest Teil 2: d < d max Ersetzung des rekursiven Test durch Intervalltest d min < d < d max auf Liste L
Sequentialisierung a) LOD-Hierarchie H, b) Sequentielle LOD-Hierarchie S
LOD-Auswahl Bsp. 1 a) LOD-Hierarchie H, b) Sequentielle LOD-Hierarchie S
LOD-Auswahl Bsp. 2 a) LOD-Hierarchie H, b) Sequentielle LOD-Hierarchie S
LOD-Auswahl Bsp. 3 a) LOD-Hierarchie H, b) Sequentielle LOD-Hierarchie S
Sequenz Räumliche Kohärenz erhalten Aufbau der sequentiellen Liste L nach Breath-First Kriterium Dazu pro Surfel s i (l i,z i )-Paar speichern l i als Schichtindex z i als Morton-Code Sortierung der Liste L nach (l,z)-paar
Schichtindex l i als längste Länge des Pfades argmax j ( P j ) P j sind alle von n i ausgehenden zu Blattknoten verlaufenden Pfade Beispiel für Quadtree
Morton-Code Bildet n-dimensionalen Punkt auf 1-dimensionalen Wert ab Beschreibt z-kurve über Daten Schnell durch Verzahnung von Bits berechenbar Beispiel für Quadtree
Blockbildung Verarbeitung pro Surfel ineffizient Einteilung der Sequenz L in B Blöcke mit Kapazität c Beginn bei Schicht l i mit S i c Nach Blockbildung Sortierung nach d max Abbruch der Iteration, wenn d > d max Beispiel für Quadtree
LOD-Auswahl Grobe Vorauswahl auf CPU mit min{d} = ε (d 0 + r 0 ) > d i min max{d} = ε (d 0 r 0 ) < d i max wählt Blöcke B 1 B = {b lo,...,b hi } aus CPU-Culling
LOD-Auswahl Grobe LOD-Auswahl (Blöcke) auf CPU mit Intervalltest d i min < ε (d i + r i ) d i max > ε (d i r i ) wählt Blöcke B 2 B 1 aus Blöcke B 2 an Grafikkarte schicken, falls nicht vorhanden Feingranulare LOD-Auswahl (Surfels) auf GPU mit Vertex Shader Parallele Verarbeitung der Surfels
Probleme Große Punktwolke meint Punktwolke passt in RAM, Verarbeitung zeitaufwändig Punktwolke passt in RAM, LOD-Hierarchie nicht Punktwolke und LOD-Hierarchie passen nicht in RAM Speicherhierarchie Geschwindigkeitslücke zwischen RAM (> 1 ns) und Festplatte (> 1ms) Ziel: Minimierung der E/A-Kommunikation
Out-of-Core Techniken Auslagerung der gesamten LOD-Hierarchie auf Festplatte Laden von benötigten Teilen in Haupt-/Videospeicher (Cache) mit Hilfe von Seitenersetzungsstrategien möglich durch Memory-Mapped Files des Betriebssystems Out-Of-Core Algorithmen (STXXL, TPIE, LEDA-SM) Out-of-Core Technik
STXXL Asynchrone Lese- u. Schreiboperationen De-/Allokation von Speicherblöcken, Caching OOC-Algorithmen (z. B. Sortieren), OOC-Datenstrukturen (stack, queue, vector und priority queue) Out-of-Core Technik
Cache VRAM-Cache: Speicherung von zuletzt gerenderten Blöcken Umsetzung durch Vertex Buffer Objects in OpenGL Ausnutzung der Frame-zu-Frame-Kohärenz RAM-Cache: Speicherung der zuletzt besuchten Blöcken Umsetzung durch STXXL LRU-Strategie
Mammoth Modulares System zur Darstellung und Bearbeitung von extrem großen Punktwolken Sprachen: C++, GLSL Bibliotheken: Qt 4.4.3, OpenGL, POSIX Threads Plugin-Konzept für Renderer, Dateiformate und Tools
Vorverarbeitung Pipeline OOC-Vorverarbeitung in 3 Schritten durch Streaming implementiert
Rendering Pipeline OOC-Rendering in 2 Schritten mit Caching Multi-Threading: 1 Thread für GUI, 1 Thread für Rendering, > 1 Threads für E/As
Geometrie-Cache-Manager Analogon zu Hauptspeicher-Cache auf Serverseite Minimierung des Speichertransfers Vertex Buffer Objects ermöglichen dynamische Updates des VRAM Speicherlayout eines Surfel mit Interleaved Array im Format GL T2F C4F N3F V3F Position in 3 Floats V3F Tangente in 3 Floats N3F Binormale in 2 Floats T2F +4.FloatC4F Farbe in 1. Float C4F Split-Distanz in 2. Float C4F Merge-Distanz in 3. Float C4F
Modelle Modell # Punkte Größe MB David 28.184.526 1.100 Lucy 14.027.872 508 Asian Dragon 3.609.600 130 Female 302.948 13
Ergebnisse: Zeitkosten bei Vorverarbeitung Modell Female Asian Dragon Lucy David T 1 00:00:03 00:01:22 00:08:07 00:10:31 T 2 00:00:04 00:21:24 01:33:00 02:27:51 T 3 Seq 00:00:04 00:03:35 00:17:41 00:25:12 Blk 00:00:00 00:00:11 00:00:58 00:01:56 T 1 Zeitfür Laden und Berechnung der Surfelparameter T 2 Zeitfür Erstellung der LOD-Hierarchie T 3 Zeitfür Sequentialisierung und Blockbildung
Ergebnisse: Speicherkosten bei Vorverarbeitung Modell Female Asian Dragon Lucy David S 1 25 302 1.167 2.355 S 2 96 1.208 4.895 9.594 L 2 12 14 24 31 S 3 Seq 28 352 1.413 2.775 Blk 0,32 4 16 31 S 1 Speicher(MB)für Laden und Berechnung der Parameter S 2 Speicher(MB)für Erstellung der LOD-Hierarchie L 2 Anzahl der Hierarchie-Level S 3 Speicher(MB)für Sequentialisierung und Blockbildung
Ergebnisse: Zeikosten bei Rendering Modell Female Asian Dragon Lucy David FPS 72,4 26,5 12,1 6,7 PPF 188.880 464.064 1.208.832 1.969.664 BPF 2.950 7.251 18.888 30.776 CPU 16 16 18 20 GPU 25 43 123 175 FPS Frames pro Sekunde SPS Surfels pro Sekunde BPS Blöcke pro Sekunde CPU/GPU CPU-/GPU-Zeit in ms
Ausblick Speichermanagement (eigener RAM-Cache, Speichern von Pointer) Komprimierung (Delta-Kodierung, Quantisierung) Prefetching Occlusion Culling Dynamischer Octree einfaches Einfügen und Löschen von Punkten Traversierung auf GPU (MegaTexture, Virtual Texture) Paralleler Aufbau auf GPU (CUDA)
Zusammenfassung Ziel ist interaktives (durch Traversierung von LOD-Hierarchien auf der GPU) hochqualitatives (durch EWA-Splatting auf der GPU) Rendering von extrem großen Punktwolken
Vielen Dank für die Aufmerksamkeit! Fragen?