----==== Projekt "funsui" ====----

Demo für VU Echtzeitgraphik WS 06/07
Institut für Computergraphik und Algorithmen
TU Wien

Markus Glatz, 		0225274, 532
Lorand Tompa-Antal	0226091, 532




------ Systemvoraussetzungen -----

3.0+ GHz CPU

getestet auf 
NVidia GeForceFX und ATI x1850pro Graphikkarten




-------- Effekte & Quellen--------

>>> Partikelsystem <<<

Die Wasserfontänen des Springbrunnens in Szene 1 sind einzelne Partikelsysteme.
Die Partikel sind einfache texturierte Quads die immer in Blickrichtung der Kamera ausgerichtet sind.

Quelle: http://tfc.duke.free.fr/



>>> Stencil Mirror (Wasseroberfläche der Brunnenbecken) <<<

In den beiden Becken des Springbrunnens in Szene 1 spiegelt sich die Szene, realisiert mit einem Stencil Mirror.

Algorithmus für einen der Spiegel:
- Der Brunnen wird normal in den Framebuffer + Z-Buffer gerendert.
- Die Wasseroberfläche wird nur in den Stencilbuffer gerendert.
- Der Z-Buffer wird gelöscht damit die reflektierte Szene auch unter dem Becken/Brunnen gezeichnet werden kann. Der Depthtest muss hierbei aktiviert bleiben damit die Reflektion korrekt gezeichnet werden kann. Die Reflektion wird mit Stenciltest in den Framebuffer + Z-Buffer gerendert.
- Der Z-Buffer der Reflektion wird gelöscht und der Z-Buffer des eigentlichen Brunnens wiederhergestellt (durch normales Rendern des Brunnens mit deaktivierter Colormask). Das Zwischenspeichern und Auslesen des Z-Buffers wäre aufwändiger gewesen als einfach den Brunnen noch einmal zu rendern.
	
	

>>> Motion Blur <<<

Der Motion Blur Effekt wird einfach mit dem Accumulation Buffer realisiert.



>>> Shadow Volumes <<<

Szene 2 zeigt einen Fels mit einem Farn der von einer sich bewegenden Lichtquelle beleuchtet wird und auf die Szene und sich selbst Schatten wirft.

Die Shadow Volumes werden von der Funktion drawShadowVolumes3DS(...) berechnet und gezeichnet.
Der Zfail Algorithmus und das Füllen des Stencil Buffers werden in drawScene() durchgeführt.
Als Occluder kann ein beliebiges 3DS Modell verwendet werden das vom 3DS Model Loader geladen wurde.

Wir haben uns für die triviale Methode entschieden und berechnen für jedes einzelne Face des Modells ein eigenes Shadow Volume. Die Extrusion der Vertices erfolgt ebenfalls auf der CPU (darum drückt dieser Effekt etwas auf die Performance).

Im Prinzip würde es reichen nur für jene Faces ein Shadow Volume zu berechnen die von der Lichtquelle wegschauen. Das von uns verwendete Modell ist aber nicht abgeschlossen (wasserdicht), die Blätter des Farns sind nur einseitig. Darum ist es notwendig Shadow Volumes für alle Faces zu berechnen.

Die Volumes werden für den von uns verwendeten Zfail Algorithmus mit Dark und Light Cap erzeugt. Die Länge der Shadow Volumes ist relativ kurz gewählt, lang genug um alle Stellen der Szene zu erreichen, aber zu kurz um die Far Clip Plane zu erreichen (eine der Problemquellen von Zfail).

Quellen: 
http://www.ultimategameprogramming.com/
	Als Anhaltspunkt diente das Shadow Volumes Tutorial (OpenGL - Page 4).
http://www.3ddrome.com/articles/shadowvolumes.php
	Zusätzliche Theorie



>>> Environment Mapping (Cubemaps) <<<

Die dritte Szene enthält 2 Objekte mit dynamisch erzeugten Environment Maps (Cubemaps). 
Die Funktion updateCubemapTextures() rendert für jedes Frame die 6 Seiten der Cubemaps beider Objekte. Der Framebuffer wird mit glCopyTexSubImage2D(...) ausgelesen und in die entsprechende Textur geschrieben.
Die Cubemap wird mittels GL_TEXTURE_CUBE_MAP_ARB auf die Objekte aufgetragen.

Quelle: http://web.missouri.edu/~irsa39/opengl/










PS: "funsui" bedeutet "Springbrunnen" auf Japanisch, daher der Titel. ;)