UNIVERSITÄT BASEL Prof. Dr. Thomas Vetter Departement Mathematik und Informatik Bernoullistrasse 16 CH – 4056 Basel Tobias Maier Jasenko Zivanov Alexander Stiemer [email protected] [email protected] [email protected] Computer Graphik (CS231) 2014 - Projektübungsblatt 7 Ausgabe in Woche 20 (15.05.2014). Vorführung der laufenden Programme im Tutorium Woche 22 (Mittwoch 28.05.2014). Zu erreichende Mindestpunktzahl: 10 von 20 Punkten Ziel dieses Aufgabenblattes ist es, die Raytracing-Implementiereung vom letzten Arbeitsblatt um Photon Mapping zu erweitern. Damit sollen globale Beleuchtung und Kaustiken simuliet werden. Aufgabe 1 - Grundlagen (1 Punkt ?) Photon Mapping soll nur verwendet werden wenn isCausticEnabled auf true gesetzt ist. Rufen Sie abhänig davon an geeigneter Stelle void createPhotonMap(. . . ) (siehe Aufgabe 2) auf, um die Photon Map zu erstellen. Bei aktiviertem Photon Mapping soll der Farbwert beim Raytracing wie folgt angepasst werden: color = color · (0.3 + 0.25 · lightFactor + 0.2 · causticFactor) Die Faktoren lightFactor und causticFactor werden durch die in Aufgabe 4 zu implementierenden Methoden berechnet. Aufgabe 2 - Photon Casting (3 Punkte ?) Implementieren Sie die Methode void createPhotonMap(. . . ) welche zufällig photonNum Photonen mit der Einfallsrichtung causticDir in die Szene projiziert. Erzeugen Sie dazu in einem Würfel mit Seitenlänge 20, der entgegen der Einfallsrichtung der Photonen genügend weit aus der Szene geschoben wurde, für jdes Photon einen zufälligen Startpunkt. Rufen Sie anschliessend tracePhoton(photonDepth,pos,causticDir,1.0f,objects,1) mit der Startposition pos des Strahls auf. Frage: Überlegen Sie sich wie die Photonendichte durch diese Initialisierung in der Szene verteilt ist. Sie können auch eine alternative Initialisierung implementieren die evtl. besser geeignet ist. 2 Aufgabe 3 - Photon Tracing(7 Punkte ?) Jedes Photon muss, ähnlich wie bei der Implementation von Ray Casting, rekursiv verfolgt werden und bei jedem Auftreffen in einer Liste gespeichert werden. Implementieren Sie die Methode void StateMachineRenderer::tracePhoton(. . . ). Verfolgen Sie dazu das Photon und speichern es beim Auftreffen auf Objekte im Vector photonsReflected ab. Das erste Auftreffen soll dabei besonders behandelt werden und im Vector photonsFirstHit gespeichert werden. Der Einfachheit halber reduzieren Sie bei jeder neuen Rekursion die Gewichtung auf die Hälfte. Hier ist es zudem nötig die Orientierung der Dreiecke zu beachten. Damit die Dreiecke nicht transparent wirken wenn sie von hinten“ beleuchtet wer” den müssen solide Objekte gebaut werden oder die sichtbare Seite berücksichtigt werden. Wir behelfen uns einem Trick indem wir Vorder- und Rückseite anhand der Normalen unterscheiden. Von vorne betrachtet zeigt die Normale dem Betrachter entgegen. Bestimmen Sie beim Verfoglen der Photonen auf welcher Seite ein Dreieck getroffen wurde. Wird die Rückseite getroffen brechen Sie die Verfolgung dieses Photons ab. Aufgabe 4 - Photon Counting(9 Punkte) Implementieren Sie die Methode float getCausticFactor(f3Vector pos, f3Vector normal) welche anhand des Ortes pos und der Normalen normal die Photonenintensität berechnet. Diese wird aus der Summe von allen in der nähe liegenden reflektierten Photonen photonsReflected (Distanz < photonDistance) mit Hilfe dieser Formel berechnet: √ ~ photon · N ~ surface · disMax − dis D photonCorrection Verwenden Sie hierzu die reflektierten Photonen. Um Licht- und Schattenregionen zu simulieren soll die Dichte der erstaufgetroffenen Photonen photonsFirstHit verwendet werden. Implementation Sie dazu die Methode float getLightFactor(f3Vector pos, f3Vector normal). Die Berechnung erfolgt analog zur Photonenintensität von getCausticFactor jedoch ohne das Skalarprodukt von Photonenrichtung und Normalen. Schränken Sie bei beiden Faktoren den Wertebereich durch abschneiden auf Werte zwischen 0 und 1 ein. Frage: Überlegen Sie sich warum es sinnvoll ist getCausticFactor ohne Skalarprodukt von Photonenrichtung und Normalen zu berechnen. Benötigte Datei für alle Aufgaben: • blatt1/src/StateMachineRenderer.cpp