Special Effects
von
Hanna Kraeusel
Seminar Computergrafik II
Dozent: Olaf Müller
WS 02/03
Gehalten am 08.01.2003
2.
Motion
Blur
4.
Lens
Flares
5.
Antialiasing
6. Anhang
6.1 Alpha-Daten
6.2 Accumulation
Buffer
6.3 screen-aligned
Billboards
1. Partikelsysteme/Partikelanimation
Die Partikelanimation ist ein
beliebtes Werkzeug und eine klassische Technik. Vorreiter auf diesem Gebiet war
Reeves. 1983 veröffentlichte er eine Beschreibung zur Verwirklichung von Partikelmengen
um „verschwommene“ Objekte zu
modellieren. Partikelsysteme werden genutzt um z.B. Rauch (Abbildugng
1.1), Wassertropfen die von einem Wasserfall sprühen oder ein Feuerwerk (siehe
Abbildung 1.2) darzustellen.
Diese Technik ist keine Form
der Renderns, sondern eine Art der Animation.
Abbildung 1.1
In der einfachsten Form
besteht ein Partikelsystem aus einzelnen Punkten, deren geometrische Ausdehnung
beliebig klein sein kann. Den Punkten können bestimmte feste Eigenschaften
zugeordnet werden, z.B. Farbe.
Die dargestellten
Wolkengebilde sollen wachsen, schrumpfen, sich bewegen und ihre Form verändern
können. Da es aber meist Zehn- oder Hunderttausend von Partikeln in einem
System gibt ist natürlich kein individuelles Skript für jedes Partikel möglich.
Es wird daher ein allgemeines Skript mit integriertem Zufallsverhalten der
Partikel erstellt.
Abbildung 1.2
Die Positionen der Partikel können auf der Basis jedes
beliebigen Algorithmus geändert werden. Wenn z.B. Rauch dargestellt werden soll
kann man die Partikel zufällig bewegen um Brown’sche Bewegung zu simulieren.
Nach Reeves ist die
Bilderzeugung ein Prozess mit fünf Schritten:
1.
Neue Partikel erzeugen und einbringen
2.
Den Partikeln ihre individuellen Eigenschaften zuweisen
3.
Am Ende ihrer Lebensdauer die Partikel löschen
4.
Aktuelle Partikel bewegen
5.
Aktuelle Partikel rendern.
Die Population der Partikel
kann man mit stochastischen Prozessen oder Skripten steuern. Die Anzahl der
Partikel, die zum Zeitpunkt t erzeugt werden, kann z.B. sein:
N(t)
= M(t) + rand(r)V(t).
Wobei M(t) der Mittelwert der
Partikel ist, die durch eine Zufallsvariable der Varianz V gestört werden. Die
Zeitabhängigkeit kann genutzt werden, um das Gesamtwachstum zu steuern. Die
Anzahl der Partikel muss nicht linear zeitabhängig sein, die Steuerung kann
auch quadratische, kubische oder sogar stochastische Variationen einschließen.
Die Populationsgröße kann aber auch von der Bildschirmgröße des Objekts
abhängen.
Das individuelle Partikelskripting basiert auf folgenden Eigenschaften:
1.
Anfangsposition
2.
Anfangsgeschwindigkeit
und Richtung
3.
Anfangsgröße
4.
Anfängliche
Transparenz
5.
Form
6.
Lebensdauer.
Mit beiden Skripten, dem für
die Population und dem für die Eigenschaften, ist eine bestimmte
„Erzeugungsform“ verbunden, ein geometrischer Bereich in dem alle neuen
Partikel erscheinen. Bei einem explodierenden Feuerwerk könnte er z.B.
kugelförmig sein. Das letztendlich Aussehen des Systems wird vom Gesamteffekt
bestimmt.
Partikelsysteme deren
Partikel Punkte sind können einen eingeschränkten visuellen Effekt haben. Als
Erweiterung der Technik ist es möglich die Partikel als kurze Linien
darzustellen, deren Endpunkten Vertex Farben zugeordnet
sind. Sinnvoll wäre das bei unserem Feuerwerk-Beispiel. Die Funken werden als
Linien dargestellt. An einem Ende ist die Linie heller rot als am anderen und
die Farben verändern sich während der Funke verglüht.
Die Darstellung durch Linien
kann den Effekt verbessern, aber diese Verbesserung kann in manchen Fällen noch
nicht ausreichen. Eine andere Lösung ist die Partikel als Quadrate mit
aufgelegter Textur darzustellen. Die Quadrate werden parallel zum Bildschirm
ausgerichtet. Die Eigenschaften der Partikel sind die Farbe, der Normalenvektor
und die Textur. Sie werden als 2 Dreiecke gerendert.
Die Textur hat fast immer
einen Alpha-Kanal, der die Transparenz bestimmt. Ein rundes
Partikel kann z.B. eine Textur haben mit einem Kreis in der Mitte und der Rest der
Textur ist durchsichtig.
1985 haben Reeves und Blau
das Partikelsystem weiterentwickelt um feste Grundkörper mit konstanten Formen
zu modellieren, wie z.B. Grashalme.
Abbildung 1.3 Feuerwall im Film „Star Trek
II: Der Zorn des Kahn“ aus Partikeln
Im Film kommt Motion Blur
zustande, wenn sich ein Objekt während eines Frames sehr schnell über den
Bildschirm bewegt. Es verschwimmt, da die Kamera die schnelle Bewegung nicht
aufnehmen kann. Dies ist bei fast jedem Film oder im Fernsehen der Fall. Meist
so gering, dass es gar nicht bewusst wahrgenommen wird. Es fällt nur die
Abwesenheit dieser Verschwimmung auf. Deswegen wird dieser Effekt auch in der
Computergrafik angewandt. Die Szene wirkt realistischer, wenn z.B. ein Objekt, dass sich von links nach rechts bewegt horizontal
verschwimmt (siehe Abbildung 2.2).
Abbildung
2.1 Abbildung
2.2
Man kann Motion Blur auf
verschiedene Art und Weise realisieren. Es kann direkt modelliert und gerendert
werden. Man stelle sich z.B. ein Schwert vor, das vor dem Betrachter
geschwungen wird. Vor und hinter der Klinge werden zwei Polygone an die Kanten
gelegt. Diese Polygonge haben einen Alpha-Kanal pro Vertex. An der Stelle an der sich die Polygone und die
Klinge treffen sind die Vertices völlig opak, bis
außen werden sie immer transparenter bis sie ganz außen völlig transparent
sind. Dies ist eine Vereinfachung. Die Idee ist, dass ein Modell eine bestimmt
Transparenz besitzt um die Verschwimmung in Bewegungsrichtung darzustellen.
Eine andere Möglichkeit
Motion Blur darzustellen ist mit Hilfe des Accumulation
Buffer. Er wird wie folgt genutzt. Ein Objekt wird zu verschiedenen
Positionen bewegt, die es während einer Szene annimmt und im Accumulation
Buffer gerendert. Dies ergibt ein verschwommenes Bild, da die verschiedenen
Positionen des Objekts vermischt werden.
Bei real-time
Rendering ist diese Methode nicht sonderlich
geeignet, außer wenn extra Prozessorleistung vorhanden ist. Der Accumulation Buffer kann aber auch
billiger genutzt werden. Acht Frames eines bewegten Objekts werden erstellt und
in den Buffer geschrieben. Beim neunten Frame wird alles noch einmal gerendert
und akkumuliert. Das erste Bild wird aber gleichzeitig auch noch einmal
gerendert und aus dem Buffer entfernt. Jetzt sind Frame zwei bis neun im
Accumulation Buffer, also wieder acht Frames. Danach sind Frame drei bis zehn
im Buffer und so weiter. Dies bedeutet, dass für das Motion Blur jeder Frame
nur zwei Mal gerendert wird.
Auch Partikelsysteme mit
Motion Blur können einfach gerendert werden. Dabei werden nicht Color Buffer
und z-Buffer, sondern nur der z-Buffer geleert.
Mit Hilfe eines Rechtecks, das
über das ganze Fenster gelegt wird und mit RGBA Werten (=(0, 0, 0, alpha)) gefüllt wird, kann man durch den Alpha-Wert
kontrollieren wie schnell der Verschwimmungspfad verschwindet.
Man kann Motion Blur auch
simulieren, um die Performanz zu verbessern, indem man den derzeitigen Frame
mit seinem Vorgänger vermischt. Dies ergibt aber keine „richtiges“
Motion Blur und das kann man auch sehen (siehe Abbildung 2.3).
„richtiges“ Motion Blur Abbildung 2.3 „falsches“
Motion Blur
Man kann auch ein „bisschen“
Motion Blur zu einer Szene hinzufügen, indem man z.B. Funken, Wasser in einem
Wasserfall, oder Schüsse als Linien rendert oder für Autoräder je nach
Geschwindigkeit verschiedene Texturen nutzt, bei hoher Geschwindigkeit stark
verschwommene und bei niedriger Geschwindigkeit Texturen mit mehr Details.
3. Tiefenschärfe
(Depth of Field)
Der Tiefenschärfe Effekt wird
oft bei der Fotografie und im Film als Stil-Element
genutzt. Das bedeutet, dass die Objekte im Fokusbereich scharf sind und je weiter Objekte von diesem Bereich entfernt sind,
desto unschärfer werden sie (siehe Abbildung 3.1).
Auch für diesen Effekt kann
man den Accumulation Buffer nutzen. Man akkumuliert verschiedene Bilder mit
leicht veränderter Sicht und gleichem Fokus. Der Betrachter ändert seine
Position immer ein kleines bisschen.
In Abbildung 3.1 wurde die
Szene ohne Tiefenschärfe 24-mal gerendert, immer mit einem leicht veränderten
Point of View und leicht veränderter Viewing
Direction. Dann wurden die Bilder mit dem Accumulation Buffer gemischt.
Bei Rendering-Systemen
mit Layern kann der Effekt durch bestimmte
verschwommene Layer mit Hilfe von Image Processing Techniken herbeigeführt werden.
Ohne Tiefenschärfe
Abbildung 3.1 Mit Tiefenschärfe
Lens Flares bestehen aus
ringförmigen Bereichen hellen Lichts, die ungefähr auf einer Linie liegen, und
aus einem sternförmigen Gebilde (der ciliary corona). Diese Korona besteht aus langen Strahlen, die von
der Lichtquelle ausgehen, mit einem Ring darum.
Sie treten auf, wenn die
Linse einer Kamera in die Nähe eines hellen Lichts gerichtet wird (siehe
Abbildung 4.1, „echte“ Lens Flares).
Abbildung 4.1
Die Ringe entstehen, weil das
Linsenmaterial Lichtstrahlen unterschiedlicher Wellenlänge unterschiedlich
bricht (wie ein Prisma). Der Ring um das Licht ist außen rot und innen violett
getönt (siehe Abbildung 4.3). Die Korona entsteht durch Dichte-Fluktuationen in
der Linse.
Man dachte erst dieser Effekt
würde nicht häufig eingesetzt werden, heute wird er sogar zu echten Fotos
hinzugefügt (früher wurde er vermieden), um den Effekt der Fotos zu verbessern.
Lens Flares sind schon fast zu einer Art Klischee geworden, so häufig werden
sie genutzt. Wenn sie aber korrekt genutzt werden, kann man eine Szene für den
Betrachter wirklich verbessern.
Um Lens Flares zu einer Szene
hinzuzufügen, werden Texturen (siehe Abbildung 4.2) für die einzelnen
Komponenten gemacht bzw. besorgt.
Abbildung 4.2
Jede Textur wird auf ein
Quadrat gelegt. Die Textur wird als eine Alpha-Map behandelt.
Den Quadraten werden Farben hinzugefügt (rot, grün, blau), um den Prisma-Effekt darzustellen. Die Quadrate werden
verschmolzen, dabei werden die Farben additiv
gemischt und es entstehen neue Farben.
Einen noch besseren Effekt
kann man erreichen indem die Korona animiert wird, dadurch bekommt man den
Eindruck sie funkelt und es wirkt realer. Die Quadrate mit den Texturen werden
als so genannte screen-aligned Billboards platziert.
Abbildung 4.3
In der Computergrafik will
man Pixelwerte finden, die den zugrunde liegenden Repräsentationen am nächsten
kommen. Ein erster Ansatz ist, die Szene durch ein Gitternetz (grid) darzustellen. (Es besteht ein Unterschied zwischen einem
Pixel und einer Gitterzelle, die Gitterzelle ist ein geometrischer Bereich um ein Pixel.) Finde
das, was in der Mitte jeder Zelle gilt, und berechne die Farbe für die
Zelle.
Die Polygone erscheinen in
den Pixeln entweder als da oder nicht da. Wenn sie
bewegt sind, sind die Pixel entweder an oder aus. Dadurch sehen die Kanten
gezackt aus. Dies wird Aliasing genannt. Antialiasing
ist eine Technik mit der man dem entgegenwirkt. Die Problemfelder sind
Polygonkanten Aliasing, Textur Aliasing
und Linien Aliasing. Linien Aliasing
ist eigentlich am einfachsten zu beheben. Manche Hardware Systeme unterstützen
das direkt. Eine Möglichkeit ist die Linien als ein Pixel große Vierecke zu
behandeln, die mit dem Hintergrund verschwimmen. Eine andere ist die Linien als
unendlich dünn, durchscheinend und glühend zu betrachten und eine dritte
Möglichkeit ist sie als Textur zu rendern.
Eine Methode um Antialiasing
zu einer Szene hinzuzufügen ist Supersampling. Sampling bedeutet Abtastung. Der Ansatz ist wie der oben
beschriebene naive. Nur eine Abtastung pro Gitterzelle ist aber zu wenig,
deshalb werden mehrere Proben pro Zelle genommen und deren Farbwerte gemittelt.
Es gibt drei Wege um höhere Samplingraten zu
implementieren:
1. Das einfachste Konzept ist
die Szene in einem separaten Buffer mit höherer Auflösung zu rendern (siehe Abbildung 5.1). Wenn der Buffer in jeder
Dimension zwei Mal größer ist, dann erreicht man 2x2 oder 4x Antialiasing. Wir
stellen uns vor das Bild wird in kleine Quadrate unterteilt. Vier benachbarte
Samples (bei 2x Antialiasing zwei benachbarte) werden gemittelt und die
entstehende Farbe wird den entsprechenden Pixeln im
Frame Buffer zugeordnet. Dies ist natürlich langsamer als das pro Pixel sampling.
Abbildung 5.1
Diese Methode kann verfeinert
werden, indem man innerhalb eines Polygons den Zellen nur eine bestimmt Farbe
zuweist, damit die Texturen nicht verschwimmen (siehe Abbildung 5.1 unten, das
„F“ hat keine verschwommene Kanten).
2. Eine andere Möglichkeit
ist den Accumulation Buffer zur Hilfe zu nehmen. Um 2x2
Sampling zu bekommen werden vier Bilder generiert.
Die Sicht ist dabei von Bild zu Bild um ein halbes Pixel in
x- oder y-Richtung geändert, je nachdem was gebraucht wird. Jedes Bild
steht also für eine andere Sample Position. Die Bilder werden nun gemittelt und
auf dem Bildschirm ausgegeben. Dies ist eine für real-time
Rendering Systeme teure Methode, weil eine Szene
mehrmals gerendert werden muss.
3. Die dritte Methode ist Carpenter´s A-Buffer zu verwenden. Dies wird auch Multisampling genannt. Diese Methode wird für high-qualtity Renderings
genutzt. Jedes Polygon, das gerendert
wird macht eine Coverage Mask
für jede Gitterzelle, die es ganz oder nur teilweise bedeckt (Beispiel für ein Coverage Mask in Abbildung 5.2). Als
Schattierung des Polygons, das der Maske zugeordnet ist, wird die Schattierung
in der Mitte der Zelle genommen. Auch die z-Tiefe wird in der Mitte der Zelle
ermittelt. Die Maske, die Schattierung und die z-Tiefe bilden ein Fragment.
Eine Gitterzelle kann beliebig viele Fragmente haben.
Abbildung 5.2. Die Ecke eines Polygons bedeckt teilweise
eine Gitterzelle. Die Gitterzelle ist in ein 4x4 Gitter unterteilt und die
Zellen, die größtenteils bedeckt sind, sind mit einer eins markiert.
Die Fragmente werden beim
Aufsammeln aussortiert. Das bedeutet sie werden nach der z-Tiefe sortiert und
alle die von undurchsichtigen Fragmenten derselben Gitterzelle ganz verdeckt
werden, werden entfernt.
Wenn alle Polygone in den
A-Buffer geschickt wurden, wird die Farbe berechnet: zu wie viel Prozent das
Fragment sichtbar ist wird mit der Farbe des Fragments multipliziert und die
Ergebnisse der Zelle werden anschließend summiert.
Diese Methode benötigt
weniger Speicher, als die erste und weniger Durchläufe als die Methode mit dem
Accumulation Buffer. Es wird weniger Prozessorleistung gebraucht. Aber die Coverage Mask ist zu groß, selbst
bei 8x8 (64 Bits) kann das Aliasing bei fast
horizontalen oder vertikalen Kanten noch beobachtet werden.
Eine andere Einschränkung ist
das Box Filter System, das hier genutzt wird (beim kombinieren der Samples).
Die Samples haben keinen Effekt auf die benachbarten Pixel, was sie aber um das
Gesamtbild zu verbessern eigentlich haben sollten. Dieses System wird der
Einfachheit halber genutzt.
Eine andere verwandte
Antialiasing Methode ist das Stochastic Sampling, bei dem die Samples zufällig über ein Pixel
verteilt sind (nicht machbar in real-time). Möglichtkeiten
auf der Applikations-Ebene Antialiasing zu gewähren sind Edge und Full-Scene Antialiasing. Beim Edge Antialiasing gibt es
zwei Durchläufe. Erst werden die Kanten normal gezeichnet und danach werden
geeignete Kanten (also die an den Übergängen zu verschiedenen Gebieten) als
verschwommenen Linien gezeichnet. Das Problem dabei ist, dass die Applikation
die geeigneten Kanten finden muss, was sehr aufwändig ist.
Beim Full-Scene
Antialiasing ist nur ein Daten-Durchlauf nötig, aber vorher müssen die Polygone
von hinten nach vorne sortiert werden. Das Aliasing
an den Kanten wird dann „on the fly“
durch die Hardware behoben.
No Antialiasing GeForce3 2x AntiAliasing GeForce3 4x AntiAliasing
Abbildung
5.3
Jedes
Pixel eines Renderings mit Alpha-Daten hat neben dem RGB-Wert für die Farbe auch einen Wert, der etwas über die
Durchsichtigkeit des Pixel aussagt. Dieser ist der Alpha-Wert. Diese Werte
summieren sich zu Alpha-Daten. Ist im Rendering ein
durchsichtiges Modell, werden die Pixel, die das Modell abbilden, hohe
Alpha-Werte haben. Je höher der Alpha-Wert, desto transparenter ist diese
Stelle. Will man das Bild zum Überlagern eines anderen Bildes verwenden, wird
das überlagerte Bild an der Stelle durchscheinen, wo das durchsichtige Modell
steht. Ein Truecolor-Bild (24-Bit) mit einem
Alpha-Kanal wird in einem 32-Bit-Format gespeichert. Der Alpha-Kanal ist
Voraussetzung für Überblendeffekte. Das Alpha-Blending
erlaubt, Bilder über den Alpha-Kanal mit Transparenz zu versehen, um
Überblendeffekte zu erzeugen.
Der
Accumulation Buffer wird gebraucht um eine Reihe von Bildern zu mitteln bzw. zu
vermischen. Er hat wie der Color-Buffer RGBA
Farbwerte. Man schreibt nicht direkt in den Accumulation Buffer. Eine Reihe von
Bildern wird im Color Buffer erzeugt und sie werden dann im Accumulation Buffer
„angehäuft“ (accumulated). Wenn dies abgeschlossen
ist wird das Ergebnis zurück in den Color Buffer geschrieben und ausgegeben. Um
Rundungsfehler zu vermeiden hat der Accumulation Buffer meist eine höhere
Präzision als der Color Buffer. Typischerweise hat er doppelt so viele Bits und
dieselbe Auflösung.
Billboarding
ist das orientieren der Polygone basierend auf der View Direction (siehe
Abbildung 6.3.1). Screen-aligned bedeutet, dass das
Billboard dem Betrachter zugewandt ist, also die Oberflächen-Normale die
Negation der View Direction ist. Wenn sich die Sicht ändert, ändert sich die
Ausrichtung der Polygone. Der negative View Direction Vektor -vdir und die Normale des Billboards
n werden angeglichen. Dies wird bewerkstelligt, indem man das Billboard so
rotiert, dass n in die Richtung des Betrachters zeigt. Das Billboard wird dabei
um die Achse gedreht, die aus dem Kreuzprodukt von vdir
und n entsteht, bis die Position erreicht ist. Billboards, die nicht für Lens
Flares gedacht sind, müssen dann noch „richtig rum“ gedreht werden, d.h. so
gedreht werden dass oben wirklich oben ist, aber bei Lens Flares gibt es kein
oben und unten.
Abbildung 6.3.1
Dieselbe
Rotation kann für alle Billboards von demselben Typ in einer Szene angewandt
werden. Jedes Quadrat wird typischerweise mit dem Mittelpunkt am Ursprung
starten, es wird rotiert und dann werden alle zu ihrer endgültigen 3-D-Position
verschoben.
Billboards
in Verbindung mit Alpha-Texturing und Animation
können viele Objekte ohne feste Oberfläche darstellen, z.B. Rauch, Feuer, Explosionen,
Dunstschwaden, Wolken, Bäume, …. Auch Effekte wie beamen
und elektrische Schilde können dargestellt werden. Außerdem kann man mit
Billboards auch dafür sorgen, dass Text immer aufrecht stehend angezeigt wird.
Daher kommt auch der Name, „Billboard“ bedeuetet so
etwas wie Anschlagbrett oder Reklamefläche.