Fakultät Informatik

GPU Particle Engine

Autor:  Andreas Wörster - 2004

Die Aufgabe
Das SEP hatte die Aufgabe eine zuvor schon entwickelte Particle-Engine um eine Kollisionserkennung zu erweitern, die es den Partikeln ermöglicht sich nicht nur untereinander sondern auch von in der Szene befindlichen Objekten abzustossen. Die zu implemetierende Kollisionserkennung orientiert sich an dem Paper "Hardware-based Simulation and Collision Detection for Large Particle Systems" von A. Kolb, L. Latta und C. Rezk-Salama. Um eine möglichst effiziente Implementierung zu gewährleisten, sollte die Uberbuffer-Extension von ATI verwendet werden, die auch schon vorher für die Particle-Engine eingesetzt wurde.

Das Problem
Viele der bisher implemetierten Particle-Enginges verwenden ein im Hauptspeicher abgelegtes Feld von Partikel-Positionen, die in jedem Simulationsschritt von der CPU unter der Beachtung von externen Kräften neu berechnet werden. Im Anschluss wird dieses Feld an die Grafikkarte geschickt, die diese Positionen als Punkte oder Sprites rendert. Da die Geometrie der Szene ebenfalls im Hauptspeicher abgelegt ist, kann die CPU die neu berechneten Positionen der Partikel mit der Geometrie der Szene vergleichen und, falls es zu einer Kollision gekommen seien sollte, einen neuen Geschwindigkeitsvektor als Kollisions-Reaktion berechnen. Mit steigender Anzahl der simulierten Partikel wird allerdings der Bus zwischen Hauptspeicher und Grafikkarte immer mehr zum Flaschenhals des Partikelsystems.

Die Lösung
Das in dem Paper vorgestellte Verfahren vermeidet, dass die Partikel Positionen immer wieder über den Bus geschickt werden müssen indem die Berechnungen gleich auf der Grafikkarte durchgeführt werden. Dort werden die Positionen in Feldern gespeichert, die in den Fragment-Shadern gelesen und beschrieben werden können. Da die Geometriedaten der Szene in den Shadern nicht mehr vorliegen, müssen mehrere sogenannte Depthmaps der Szene erstellt werden auf die die Shader dann zugreifen können. In diesen Depthmaps werden sowohl der Abstand zwischen Depthmap und der Szenen-Geometrie gespeichert, als auch der Normalenwert der Szenen-Geometrie. Diese Informationen werden dann vom Shader ausgelesen und mit der berechneten Positionen der Partikel verglichen und gegebenenfalls eine Kollisionsreaktion berechnet. Somit kann die volle Leistung der Grafik-Hardware genutzt werden und der bisher zu jedem Simulationsschritt benötigte Transfer der Daten zwischen Haupt- und Grafikspeicher wird umgangen.

Der Ablauf
Die einzelnen Simulationsschritte lassen sich in drei Teile gliedern. Zunächst werden alle Partikel anhand der aktuell wirkenden Kräfte und ihrer Geschwindigkeit ohne Berücksichtigung der Szene verschoben. Diese neuen Positionen werden darauf mit den in den Depthmaps gespeicherten Z-Werten verglichen. Sollte eine Kollision auftreten, wird das Partikel in Richtung der gespeicherten Flächennormale verschoben und der Geschwindigkeitsvektor entsprechend angepasst.

Funktionsweise der Uberbuffer-Extension
Für die Realisierung der Particle Engine wurde wie schon oben erwähnt die UberBuffer-Extension von ATI verwendet. Sie ermöglicht es die Partikelpositionen und Geschwindigkeitsvektoren in einen Feld, bzw. Memory-Objekt, auf der Grafikkarte zu speichern. Die Memory-Objekte können dann je nach Bedarf gelesen oder beschrieben werden, allerdings nicht beides gleichzeitig. Deshalb ist es für einen Simulationsschritt notwendig jeweils einen Lese- und ein Schreib-Feld zu verwenden, das die Partikel-Informationen speichert. Nach einem Simulationsschritt werden die Felder vertauscht damit auf den neuen Daten der nächste Simulationsschritt durchgeführt werden kann.
Die Uberbuffer-Extension ermöglicht es ausserdem die Memory-Objekte je nach Verwendungszweck als verschiedene Datenquellen zu binden. Zum Beispiel ist es möglich ein Feld als Texture oder als Vertexarray auszulesen. Dies ermöglicht es die Partikelpositionen zum Beispiel als Punktwolke zu rendern ohne Daten kopieren zu müssen.

Screenshots

+
+

Normalen in den Depthmaps des Bunny

+
+
+

Z-Werte in den Depthmaps des Bunny

+
+
+
 

News

Matthias Niessner, our new Professor from Stanford University, offers a number of interesting topics for  master theses.

 

PhD positions on   Computational Fabrication and 3D Printing and  Photorealistic Rendering for Deep Learning and Online Reconstruction are available at the Computer Graphics & Visualization group.