Echtzeitgraphik Abgabe 2, Version 2, WS2013
Christian Machacek (Matrikelnummer: 0225240, Kennzahl: 066932)
--------------------------------------------------------------

Zum Starten, nach ./binaries/x64/Release wechseln und "client.exe" ausfhren.
Falls ntig, zuerst vcredist_x64.exe von http://www.microsoft.com/en-us/download/details.aspx?id=30679 installieren.
Compiled wurde mit Visual Studio 2012 Update 4 fr x64.

Die gezeigte Szene enthlt ein animiertes Raumschiff mit Textur sowie einige Gesteinsbrocken, zwischen welchen das Raumschiff hindurchfliegt.
Gerendert wird mittels Deferred Shading und Path Tracing, wobei der erste Bounce of der GPU rasterisiert, die weiteren auf der CPU berechnet werden.
Zur Darstellung wird OpenGL 3.2 compatibility profile (fr glDrawPixels und GLEW) verwendet.
Getestet wurde mit einer NVIDIA GPU und Treiberversion 332.21.

Es gibt ein minimales User Interface:
* [Pause] ist die wichtigste Taste: Das Szenenupdate wird ausgeschaltet, sodass (bei ruhender Kamera) Frames akkumuliert werden und die Konvergenzrate beobachtet werden kann.
* Bei pausiertem Szenenupdate lsst sich die Kamera mit [w][a][s][d] und Mausbewegung steuern.
* 20 Sekunden nach Start des Programms schaltet es automatisch in den Pause-Modus.


Effekte:
* Path Tracing bis Rekursionstiefe 5 wird durchgefhrt, wodurch sich Soft-Shadows und Interreflexionen (Color-Bleeding) ergeben. Am besten ersichtlich ist dies bei den seitlichen Triebwerken des Raumschiffs.
* Beleuchtet wird die Szene von 2 Area-Lights ("Sonnen", die allerdings ausgeblendet sind. Eine weie von rechts und eine blaue von links unten.) und dem Weltraumnebel in der Environment-Map.
* Als meinen Hauptbeitrag sehe ich das von mir implementierte Importance Sampling der Lichtquellen:
  Naives Path Tracing lsst sich mit der Tastenfolge [b],[0] aktivieren; die Konvergenzzeit betrgt hier Minuten statt Bruchteile von Sekunden.
  Stattdessen (default, bzw. mit [b],[1]) werden Sonnen explizit gesamplet. Beides konvergiert zum gleichen Ergebnis, letzteres ist aber ungleich schneller.
  (Verglichen dazu bringen andere Optimierungen, etwa das Umschalten auf Intels hochoptimierten Ray Intersection Code extrem wenig.)
* Nicht zu vernachlssigen ist auch, dass hier eine *animierte* Szene mit Path Tracing gerendert wird.
  Dies geschieht mit einem "Top-Level-BVH" im World Space, der pro Frame neu aufgebaut wird und vielen statischen BVHs im jeweiligen Object Space der Objekte.
  Bei der Traversierung wird beim bergang in den anderen BVH der Strahl transformiert.
* Nebenbei wurden mehrere grundlegende Algorithmen wie z.B. Texturierung, BVH-Aufbau und -Traversierung hndisch implementiert.
* Auf gamma-korrektes Rendering wurde geachtet. Farbwerte in Texturen sind linear als float Tripel gespeichert, vor der Anzeige des gerenderten Bildes erfolgt eine Gamma Korrektur.

---

Das Programm verwendet Intel's "Embree" (http://embree.github.io/) zum Erstellen und Traversieren des Per-Object BVHs, sowie dessen Task Scheduler zum Starten der Renderthreads.
Der Pathtracer, den Intel als Demo mitliefert wird NICHT verwendet; es wird auch nicht gegen die entsprechende Library gelinkt.
Optional (durch Drcken von [i],[0]) kann auf meinen eigenen BVH-Build und -Traversal, sowie Triangle-Intersector Code umgeschaltet werden, der etwas weniger performant ist. [i],[1] aktiviert wieder Embrees Code.

Die Environment Map ist von "Adam" (http://cg.tuwien.ac.at/courses/CG23/HallOfFame/game-archive/greatest08/adam.zip) geborgt.

---

Mit [r],[0] lsst sich ein reiner CPU Renderpfad aktivieren, der auch die Sonnen anzeigt und sich abgesehen von der Geschwindigkeit nur minimal vom hybriden GPU+CPU Path Tracing (default, bzw. [r],[3]) unterscheidet.
