%%This is a very basic article template.
%%There is just one section and two subsections.
\documentclass{article}
\usepackage{ngerman}
\usepackage{listings}
\usepackage{graphics}
\usepackage{graphicx}

\title{altweiberherbst \\ VU Echtzeitgraphik, WS 2010/11}

\author{Eugen Jiresch \and Michael Asperger}

\begin{document}

\maketitle

\section*{Team}
\begin{itemize}
  \item Eugen Jiresch, 0204097, Studienkennzahl 786 881,jiresch@logic.at 
  \item Michael Asperger, 0525870, Studienkennzahl 066 932, michael\_02@gmx.at
\end{itemize}

\section{\"Uberblick}
Unsere demo zeigt eine h\"ugelige Landschaft mit vereinzelten B\"aumen, in deren
Mitte die \"Uberreste eine Hauses mit Turm stehen. Die Kamera verfolgt ein
``magisch'' herumfliegendes Feuer, das die Ruine umkreist und sich schliesslich
in den Kamin des Hauses bewegt.

Dieses Dokument ist wie folgt organisiert: In den folgenden 4 Sektionen
besprechen wir kurz unsere implementierten Effekte - Shadowmapping,
Normalmapping, Depth of Field und Partikelsysteme - sowie aufgetretene Probleme.
Zum Schluss findet sich noch das Original-Proposal von Abgabe 1.

\section{Omnidirectional Shadowmapping und Soft Shadows}
Unsere demo enth\"alt zwei Licht- bzw. Schattenquellen. Ein Licht (die ``Sonne'')
ist directional und verwendet auch normales Shadowmapping. Das sich bewegende
Feuer ist eine omnidirectional Lichtquelle und verwendet demnach auch
omni-directional shadowmapping (siehe RTR Repetitorium 2010). Ziel war es auch,
einen soft shadow Effekt zu implementieren. Die ``Sonne'' verwendet nur
``naive'' soft shadows, sprich die shadowmap wird nur 8 mal um den jeweiligen
Pixel gesampled. Beim Feuer haben wir uns an \cite{gpu_gems_2_shadowmaps}
orientiert, indem wir pixel shader branching anhand der ersten 8 samples
implementierten: Ist der pixel nach den ersten samples im Halbschatten, werden
mehr samples (64) genommen, um einen sch\"oneren Halbschatten zu erreichen.

Noch eine Anmerkung zur Generierung der samples: In \cite{gpu_gems_2_shadowmaps}
werden die shadowmap samples mit sehr viel Aufwand generiert. Wir verwenden hier
nur eine vereinfachte Version: Die 8 Basis-samples werden mit einer Zufallszahl
gejittert, wobei die 64 Extra-samples nur durch die Schleifenvariable generiert
wurden. Aufw\"andigere sample-Generierung hatte in unserer demo keine subjektiv
merkbaren Effekt. So sind zum Teil leichte Artefakte zu sehen (bzw. banding),
diese treten aber u.a. durch die Textur des Terrains und depth of field in den
Hintergrund. Zus\"atzlich findet im file sich \textit{abgabe\_config.txt}
die option \lstinline;ultra_shadows; ,  die einfach f\"ur jedes Pixel 64
shadowsamples generiert. Dadurch verschwinden soft shadow Artefakte zum Preis
eines starken Performance-Einbruchs (von ca. 70fps auf ca. 40fps in unserer
demo auf der GeForce GTX 460 des Autors).
%\usepackage{graphics} is needed for \includegraphics
\begin{figure}[htp]
\begin{center}
  \includegraphics[scale = 0.4]{screenshots/odsm.png}
  \caption{omnidirectional soft shadows}
  \label{figureLabel}
\end{center}
\end{figure}

\subsection{Probleme und Workarounds}
Die bei shadowmapping \"ublichen ``shadow acne'' Artefakte werden
standardm\"assig mit der opengl option \lstinline;glPolygonOffset(); verringert.
Verbleibende Artefakte werden durch soft shadows deutlich abgeschw\"acht. Wie oben erw\"ahnt,
treten leichte Artefakte bei den soft shadows auf. Auch sieht man unter gewissen
Blickwinkeln leichtes Flackern der Schatten. Im Allgemeinen ist zu sagen, dass
der soft shadow Ansatz von \cite{gpu_gems_2_shadowmaps} besser bei Schatten mir
einer kleinen Penumbra funktioniert. Bei einigen Objekten in unserer demo
(B\"aume mit d\"unnen \"Asten) ist allerdings das Gegenteil der Fall.

\section{Normalmapping}
Normalmapping wurde bei uns standardm\"assig implementiert, in etwa wie in der
VU beschrieben. Die Beleuchtung wird von zwei Lichtquellen berechnet, was f\"ur
interessante Effekte bei der Bewegung des Feuers sorgt.
\begin{figure}[htp]
\begin{center}
  \includegraphics[scale = 0.4]{screenshots/nm.png}
  \caption{normalmapping}
  \label{figureLabel}
\end{center}
\end{figure}

\subsection{Probleme und Workarounds}
Unter gewissen Blickwinkeln kommt es zu Spr\"ungen in der Beleuchtung. Dies
h\"angt aber haupts\"achlich mit einem schnelle Positionswechsel der Lichtquelle
in einem bestimmten Winkel zusammen (i.e., die eigentliche
Beleuchtungsberechnung ist korrekt).

\section{Depth of Field}
Depth of field wurde wie geplant als post-processing Effekt mittels reverse-mapped z-buffer
implementiert. Wir verwenden einen Gauss-blur (7x7 kernel) um die gesammte Szene
zu blurren. Das geblurrte Bild wird dann anhand einer depth/z-map mit dem
ursp\"unglichen Bild kombiniert. Die blur-Texturen haben aus
performance-Gr\"unden eine niedrigere Aufl\"osung, was aber die Qualit\"at des
Effekts nicht beeinflusst.
\begin{figure}[htp]
\begin{center}
  \includegraphics[scale = 0.4]{screenshots/dof.png}
  \caption{depth of field}
  \label{figureLabel}
\end{center}
\end{figure}

\subsection{Probleme und Workarounds}
Dieser Ansatz liefert in der Ferne bessere Ergebnisse als in der N\"ahe. Dies
kommt daher, dass geblurrte pixel keinen Einfluss auf benachbarte ungeblurrte
Pixel haben (aka ``bleeding''). Dies k\"onnte mittels blurren der depth-map
f\"ur den near-blur erreicht werden, was aber aus Zeitknappheit nicht mehr
realisiert wurde.

\section{Partikelsysteme}
Unsere Demo zeigt Feuer und Schnee, die durch Partikelsysteme realisiert werden.
Die Berechnung der Partikelsysteme sind GPU-basiert, d.h., die Koordinaten der
Partikel werden in Texturen gespeichert und mittels spezieller Shader geupdated.
Die Partikel werden mittels point sprites dargestellt, die einen
billboard-Effekt (d.h., Partikel sind immer der Kamera zugewandt) simulieren.
Der Ansatz in \cite{nopper_tutorials} wurde folgendermassen erweitert:
Schneepartikel k\"onnen mit einem force-field vector bewegt werden, um Wind zu
simulieren. Weiters verwendet das Feuer mehrere Texturen f\"ur Partikel.

\begin{figure}[htp]
\begin{center}
  \includegraphics[scale = 0.4]{screenshots/particles.png}
  \caption{particle systems}
  \label{figureLabel}
\end{center}
\end{figure}

\subsection{Probleme und Workarounds}
Partikelsysteme sorgen f\"ur gewisse Konflikte mit depth of field. Dies betrifft
besonders den Schnee. Wie erw\"ahnt werden die Partikel durch (texturierte)
vergr\"osserte Pixel (d.h, durch Quadrate) repr\"asentiert. Dadurch sind die
entsprechenden Eintr\"age in der depth-map auch Quadrate, was Fehler erzeugt: So
wird mitunter der weit entfernte Hintergrund hinter einer nahen Schneeflocke
nicht geblurred. Um diesen Fehler zu verringern, wird das der Eintrag in der
depth map mit geringerer pointsize gemacht. Dadurch wird der blur Wert f\"ur den
Rand der Schneeflocke nat\"urlich inkorrekt, dies ist aber weniger auff\"allig
als der zuvor beschriebene Fehler.



\section{Original Proprosal}

Unsere Demo zeigt eine herbstliche, h\"ugelige Landschaft mit Gebirge im
Hintergrund. W\"ahrend langsam st\"arker werdender Schneefall einsetzt, bewegt
sich die Kamera auf die \"Uberreste eines verfallenen Hauses zu. Im Kamin des
Hauses brennt Feuer.

\subsection*{Overview}

Unsere Demo zeigt eine herbstliche, h\"ugelige Landschaft mit Gebirge im
Hintergrund. W\"ahrend langsam st\"arker werdender Schneefall einsetzt, bewegt
sich die Kamera auf die \"Uberreste eines verfallenen Hauses zu. Im Kamin des
Hauses brennt Feuer.

\subsection*{Effekte und Details}

Wir wollen folgende prim\"are Effekte implementieren:
\begin{itemize}
  \item shadow mapping
  \item particle systems
  \item depth of field
  \item normal mapping
\end{itemize}

Bei shadow mapping wollen wir \emph{omni-directional shadow maps} (wie im
RTR-Repetitorium 2010 beschrieben) verwenden. Zudem wollen wir
\emph{efficient soft shadows using pixel shader branching}\cite{gpu_gems_2_shadowmaps} implementieren
.

Feuer und Schnee werden duch GPU-basierte Partikelsysteme realisiert, basierend
auf \cite{nopper_tutorials}. Das Tutorial von \cite{nopper_tutorials} wird noch
um Parameter f\"ur die Geschwindigkeit der Pixel und force fields (z.B. Wind) 
erweitert.

Depth of field soll als post-processing Effekt mittels reverse-mapped z-buffer
implementiert werden. Als blur wollen wir einen Gauss-Filter verwenden (siehe
z.B. hier \cite{geeks3d_blur,horde3d_dof} oder in den VU Folien). Bei normal mapping
orientieren wir uns an den VU Folien und \cite{tangent_vector_calc}.

\paragraph*{Falls noch Zeit bleibt} wollen wir die \"Uberreste des Hauses mit
ein paar Gegenst\"anden ausstatten, die transparent oder spiegelnd sind (wie in
den VU Folien beschrieben), evtl. auch einen Gegenstand mit einfachem
Tesselation shader (siehe z.B. \cite{triangle_tess}). Eine
weitere m\"ogliche Verbesserung w\"are, den Depth of Field
Effekt wie in \cite{gpu_gems_3_dof} zu implementieren.

\paragraph*{Weitere Quellen/Tutorials} die wir verwenden:
\cite{nehe,lighthouse3d}

\bibliographystyle{plain}
  \bibliography{Quellen}

\end{document}
