Ray Tracing, als offline Rendering Verfahren, zeichnet sich durch die Generierung qualitativ hochwertiger Bilder aus. Bisherige Ansätze, Global Illumination Verfahren in Echtzeit-Applikationen einzusetzen, zielten auf den Einsatz von Cluster- bzw. superskalaren Multiprozessor Systemen ab, oder versuchten diese Verfahren auf das Streaming Modell der GPU abzubilden.
Der in diesem Projekt verfolgte Ansatz kombiniert die Vorteile beider
Programmiermodelle, mit dem Ziel das Rendering von Szenen mittlerer bis hoher Komplexität mit angemessenenen Frameraten zu ermöglichen. Zu diesem Zweck wurde der Ray Tracing Algorithmus konzeptionell in fünf unterschiedliche Renderpasses eingeteilt, die entweder von der GPU oder CPU verarbeitet werden können. Beide Verarbeitungseinheiten laufen verschränkt zueinander, und ermöglichen somit eine effiziente Ausnutzung der verfügbaren Ressourcen.
Konzept
Abweichend von dem von Whitted im Jahr 1980 beschriebenen rekursiven Verfahren, kann Ray Tracing auch als iterativer Prozess verstanden werden. Der Beleuchtungsanteil eines jeden Pixels ergibt sich aus dem verwendeten Beleuchtungsmodell und den einzelnen Strahlenarten, die sich wiederum über alle betrachteten Pixel in Strahlengenerationen zusammenfassen lassen.
Primärstrahlen, also Strahlen der ersten Generation, nehmen hierbei den größten rechnerischen Aufwand ein. Ihre Abarbeitung kann, ebenso wie die Bestimmung der primären Schattenstrahlen, gänzlich auf der GPU erfolgen, wobei die primären Schattenstrahlen mittels des Light Space Perspective Shadow Mapping Algorithmus approximiert werden. Dabei auftretende Aliasing-Artefakte an den Schattengrenzen werden von der GPU mittels eines Blurring-Filters markiert, und von einem auf der CPU implementierten, effizienten Ray Tracing Algorithmus weitestgehend neutralisiert. Nachfolgende Strahlengenerationen, im wesentlichen Reflektions- und Refraktionsstrahlen, werden ebenfalls von der CPU abgearbeitet.
Die aus diesem Ansatz resultierenden fünf Renderpasses sind in Abbildung2 dargestellt. Nach Abschluss des finalen, fünften Renderpasses enthalten die darzustellenden Pixel die korrekten, aus der Betrachtung aller Strahlgenerationen resultierenden, Intensitätswerte.
Implementierung
Entwickelt wurde das Framework komplett in C++ für die Linux-Plattform, wobei OpenGL als Grafik-API diente, und GLSL als Shading-Language zum Einsatz kam. Als Compiler standen die gnu compiler collection und der Intel C++ Compiler zur Verfuegung, der aufgrund einer um bis zu 30% hoeheren Performance auf nativen Intel-Plattformen zu praeferieren ist.
CPU-basierte Vektor- und Matrixoperationen wurden im Framework mittels der auf Intel- als auch auf AMD-Prozessoren vorhandenen SIMD-Erweiterung (SSE) durchgeführt. Mittels der externen Bibliothek boost wurde das Multithreading und Speichermanagement realisiert. Die an der Bauhaus-Universiaet entwickelte libGLSL vereinfachte den Einsatz und die Implementierung der Vertex- und Fragment-Shader.
Ergebnisse
Wie Abbildung 3 illustriert, erwies sich der CPU-basierte Ray Tracing Algorithmus als limitierender Faktor, während die GPU weitestgehend suboptimal ausgelasted war. Aufgrund seiner Multithreading-Faehigkeiten zeigte das entwickelte Framework gute Skalierungseigenschaften, und obwohl die SSE-Einheiten der CPU ausschließlich bei der Vektor und Matrix-Arithmetik zum Einsatz kamen, wurden Performance-Gewinne von ca. 10% beobachtet. In Abhängigkeit von der Größe des Filter-Kernels, konnten Aliasing-Artefakte größtenteils eliminiert werden, wobei der Schwerpunkt entweder auf Qualität oder Geschwindigkeit gesetzt werden konnte.
Abbildung 3: Die Renderzeiten der fünf Renderpasses für eine Szene mittlerer Komplexität bei einer Auflösung von 1024*768 Pixeln und unterschiedlichem Anteil an Sekundärstrahlen. Die CPU kann als bottleneck identifiziert werden.
Abbildung 4: Links eine Testszene ohne Kanten-Nachsampling auf der CPU, rechts mit Kanten-Nachsampling. GPU-seitig kam ein 5*5 Blurring-Kernel zum Einsatz.
Personen
Projektleiter | Projektteilnehmer |
|
|
Referenzen
- CHRISTEN M.:
Ray Tracing on GPU
Master's thesis, University of Applied Sciences Basel, 2005. - CASSAGNABERE C., ROUSSELLE F., RENAUD C.:
Path tracing using the ar350 processor
In GRAPHITE '04: Proceedings of the 2nd international conference on Computer graphics and interactive techniques in Australasia and Southern East Asia (New York, NY, USA,2004), ACM Press, pp. 2329. - HAINES E.:
Bsp plane cost function revisited
ACM TOG 17, 1 - HAVRAN V.:
Heuristic Ray Shooting Algorithms
PhD thesis, Faculty of Electrical Engineering, Czech Technical University, Prague, 2000 - JÖRG SCHMITTLER, INGO WALD P. S.:
Saarcor a hardware architecture for ray tracing - PURCELL T. J., BUCK I., MARK W. R., HANRAHAN P.:
Ray tracing on programmable graphics hardware
In SIGGRAPH '02: Proceedings of the 29th annual conference on Computer graphics and interactive techniques (New York, NY, USA, 2002), ACM Press, pp. 703712 - STAMMINGER M., DRETTAKIS G.:
Perspective shadow maps
In SIGGRAPH '02: Proceedings of the 29th annual conference on Computer graphics and interactive techniques (New York, NY, USA, 2002), ACM Press, pp. 557562 - SCHMITTLER J., WOOP S., WAGNER D., PAUL W. J., SLUSALLEK P.:
Realtime ray tracing of dynamic scenes on an fpga chip
In HWWS '04: Proceedings of the ACM SIGGRAPH/EUROGRAPHICS conference on Graphics hardware (New York, NY, USA, 2004), ACM Press, pp. 95106. - WALD I.:
Realtime Raytracing and Interactive Global Illumination.
PhD thesis, Computer Graphics Group Saarland University Saarbrücken, 2004. - WIMMER M., SCHERZER D., PURGATHOFER W.:
Light space perspective shadow maps.
In Proceedings of Eurographics Symposium on Rendering 2004 (2004)