Blatt 7 - Universität Basel | Informatik

Werbung
UNIVERSITÄT BASEL
Prof. Dr. Thomas Vetter
Departement Mathematik und Informatik
Bernoullistrasse 16
CH – 4056 Basel
Clemens Blumer
Tobias Maier
Fabian Brix
http://informatik.unibas.ch/lehre/fs13/cs231/
Computer Graphik (CS231) 2013 - Projektübungsblatt 7
Ausgabe in Woche 20 (16.05.2013).
Vorführung der laufenden Programme im Tutorium Woche 22 (30.05.2013).
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.
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
2
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 werden 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