@@ -255,11 +255,31 @@ Die Texturewerte werden in dem jeweiligen Knoten gespeichert und die restlichen
\label{ch:Content4:sec:Section2}
Bisher haben wir die Berechnung der Ruflektion von Licht aus einer Lichtquelle über ein Dreieck zu einem Oberflächenpunkt.
Dabei haben wir nicht betrachtet ob der Lichtpfad durch Objekte blockiert ist.
Um die Sichtbarkeit zwischen Lichtquelle und dem Reflektor zu evaluieren wird Variance Shadow Map (VSM) verwendet.
Hier wird von der Lcihtquelle eine Shadowmap
Um die Sichtbarkeit zwischen Lichtquelle und dem Reflektor zu evaluieren wird Variance Shadow Map (VSM, \cite{VSM}) verwendet.
Hier wird die Shadowmap der Lichtquelle für 16 gleichmäßig verteilte Samples auf dem Reflektordreieck ausgewertet.
Aus den Werten wird der Durchschnitt berechnet und zu dem Dreieck gespeichert.
Die Sichtbarkeit zwischen Reflektor und Retriever ist schwieriger zu bestimmen.
Zunächst werden während der Initialisierung 200 virtuelle Lichter in der Szene verteilt um zur Laufzeit Imperfect Shadow Maps \cite{ISM} zu berechnen.
Imperfect Shadow Maps sind Shadowmaps mit geringer Auflösung für jedes virtuelle Lichtquelle.
In den Knoten der Baumstruktur werden die drei nächsten Lichter gespeichert.
Bei der Berechnung der Sichtbarkeit wird der Mittelpunkt der Knoten, bzw des Dreiecks in die Ebene der drei Punktlichtquellen projiziert.
Die Werte aus den zugehörigen ISM werden ausgelesen und mit Hilfe von baryzentrische Koordinaten linear gemittelt.
\section{Umsetztung des Algorithmus}
Zur Initialiserung muss die Szene geladen werden und die Baumstruktur errechnet werden.
Hier wird für jedes Mesh das mehr als 200 Dreiecke enthält der Binärbaum errechnet.
Für kleinere Dreiecksnetze ist es effizienter die Reflexion von allen Dreiecken auszurechnen.
Während eines eigenen Renderdurchgangs wird zunächst die direkte Beleuchtung der Szene bestimmt.
Anschließend muss für jedem Pixel ein Schnitt durch den Baum bestimmt werden.
Dafür wird zunächst für jeden Vertex ein Schnitt bestimmt die dann für die Pixel gemittelt werden.
Im finalen Rendervorgang wird dann der Schnitt ausgewertet und für jeden Pixel die Reflexion berechnet und mit den Werten aus den Shadowmaps gewichtet.
Um die Performance zu verbessern kann die Schnitt Selektion in CUDA implementiert werden.
Jedoch gibt es noch keinen effizienten Prioritätenlisten für CUDA gibt wird diese durch 5 normale Warteschlangen mit unterschiedlichen Fehlern aufgeteilt.
Z.b. die erste Schlange speichert alle Knoten mit Fehlern größer als 16\% und nach dem Splitten werden die Kinder zu eine Liste mit Fehler größer 8\% hinzugefügt.
So erhält man eine nicht ganz akkurate Prioritätenliste, aber eine ausreichend Genaue für diesen Zweck.
%% ==============
\chapter{Ergebnisse und Vergleiche}
...
...
@@ -267,24 +287,3 @@ Hier wird von der Lcihtquelle eine Shadowmap
%% ==============
Soll ich sowas überhaupt behandeln?
Und so sieht eine Referenz aus \cite{Xu:2014:PAR:2577382.2533687}