Blatt 7 - Universität Basel | Informatik

Werbung
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
Herunterladen