Cloud Rendering

Transcrição

Cloud Rendering
München, 3.7.2006
Cloud Rendering
Hauptseminar Computer Graphics
Oliver Meister
1
Einleitung
Wolken stellen für die Computergrafik ein Problem dar, da sie ihre Erscheinung stark von
Absorptions- und Streuungseffekten abhängt, die sich unterhalb der Oberfläche abspielen.
Daher sind übliche Verfahren wie Drahtgitter-Modellierung für die Erstellung und Oberflächenstreuung für die Darstellung der Wolke nicht geeignet.
Ich werde also im Folgenden ein physikalisches Modell vorstellen, das Dynamik und Optik der Wolke beschreibt, und im Anschluss, wie es beim Verfahren von Mark Harris in
seiner Anwendung ’Skyworks’ mittels 3D-Hardware simuliert wird. Schließlich werde
ich noch demonstrieren, wie im kommerziellen Produkt Microsoft Flight Simulator 2004
das Wolken-Problem gelöst wird.
2
2.1
2.1.1
Physikalische Eigenschaften
Dynamik
Luftbewegung
Die Luftbewegung innerhalb einer Wolke wird durch die sogenannten inkompressiblen
Euler-Gleichungen beschrieben:
∂u
1
= −(u · ∇)u − ∇p + B + f
∂t
ρ
∇·u = 0
(1)
(2)
Hierbei besagt Gleichung (1), dass sich die Änderung der Geschwindigkeit über die Zeit
∂u
∂t aus der Summe von Selbstadvektion (1. Summand), Druckgradient (2. Summand) sowie Beschleunigung durch Auftrieb und externe Kräfte (3. und 4. Summand) ergibt.
Da für das Medium Inkompressibiliät gefordert wird, also die Dichte innerhalb der Wolke konstant sein soll, muss das Vektorfeld u divergenzfrei sein. Für diese Bedingung ist
Gleichung (2) zuständig.
2.1.2
Luftfeuchtigkeit
Tritt bei unbewegter Luft ein Phasenübergang des Wassers auf, so muss der WasserdampfAnteil qv in jedem Punkt genau um die Menge Wasser erhöht werden, die vom KondenswasserAnteil qc entfernt wird, analog der umgekehrte Fall. Wenn die Luft sich bewegt, so gilt
dieser Umstand ebenfalls, nur muss die Advektion dabei berücksichtigt werden. Das führt
zur sog. “water continuity equation”:
∂qv
∂qc
+ (u · ∇)qv = −
+ (u · ∇)qc = −C
(3)
∂t
∂t
Seite 1
München, 3.7.2006
C ist dabei die Kondensationsrate.
2.1.3
Temperatur
Für die Temperaturrechnung wird statt T die sog. potentielle Temperatur θ verwendet,
da θ unabhängig vom Druck p ist, d.h. θ ändert sich nur durch Verdampfung und Kondensation. Dabei ist die Änderung der pot. Temperatur θ proportional zur Änderung des
Wasserdampfanteils qv . Unter Berücksichtigung der Advektion ergibt sich dann:
−L ∂qv
∂θ
+ (u · ∇)θ =
+ (u · ∇)qv
(4)
∂t
c p Π ∂t
−L
cpΠ
ist eine Konstante. Der Term in der Klammer rechts entspricht −C, wie aus Gleichung
(3) ersichtlich.
2.2
Optik
Für das Aussehen der Wolke sind 2 Effekte verantwortlich: Absorption und Streuung. Im
Gegensatz zur Rayleigh-Streuung, die Licht mit kurzer Wellenlänge stärker streut, ist die
bei Wolken vorliegende Mie-Streuung unabhängig von der Wellenlänge. Es ergibt sich
dann für die Intensität des Lichts vom Punkt Pa in Richtung ω in Pb folgende Gleichung:
I(Pb , ω) = I(Pa , ω) exp(−
ZPb
τ(t)dt) +
Pa
ZPb
g(s, ω) exp(−
Pa
ZPb
τ(t)dt)ds
(5)
s
Der erste Summand beschreibt die Dämpfung des initialen Lichts aus Pa in Richtung ω
durch Absorption und Streuung, abhängig von der optischen Dichte τ. Über ein Integral
wird dann im zweiten Summanden in jedem Punkt s der Strecke [Pa , Pb ] das in Richtung
ω gestreute Licht g(s, ω) aufgesammelt und ebenfalls gedämpft.
Z
g(x, ω) = r(x, ω, ω0 )I(x, −ω0 )dω0
(6)
4π
Man integriert für die Berechnung von g(x, ω) über die Oberfläche der Einheitskugel um
den Punkt s, und berechnet für jedes ω0 das Licht, das aus der Richtung ω0 in Richtung ω
gestreut wird. r(x, ω, ω0 ) ist dabei wie folgt definiert:
r(x, ω, ω0 ) = a(x)τ(x)p(ω, ω0 )
(7)
p ist die Phasenfunktion, die die Streuung in Abhängigkeit vom Winkel angibt.
3
3.1
3.1.1
Echtzeit-Verfahren
Skyworks
Numerische Simulation der Wolkendynamik
Da keine explizite Lösung für die Gleichungen (1) - (4) bekannt ist, wird mit numerischen
Methoden, also über Diskretisierung, nur eine Approximation der Lösung bestimmt. Man
Seite 2
München, 3.7.2006
speichert u, p, usw. in einem endlichen regulären Gitter und aktualisiert es in diskreten
Zeitschritten. Die Euler-Gleichungen (1), (2) werden dann folgendermaßen gelöst:
Berechne für alle x im Gitter:
(1) ua := u(x − δt u(x,t),t)
(2) u0 := ua + δt(B + f)
(3) u(x,t + δt) := u0 − δt ∇p
In Schritt (1) wird die Selbstadvektion vorgenommen, in Schritt (2) Auftrieb und externe
Kräfte addiert und in Schritt (3) der Druckgradient abgezogen, entsprechend den Termen
aus Gleichung (1). Um p zu bestimmen, wendet man das Helmholtz-Theorem an, das
besagt: jedes Vektorfeld ist Summe eines divergenzfreien und eines rotationsfreien Feldes.
Es ergibt über Gleichung (2) dann eine einfache Differentialgleichung:
1
(8)
∇ · u0
δt
Nach Diskretisierung über zentrale Differenzen führt die Gleichung auf ein LGS, das z.B.
mittels Jacobi-Verfahren lösbar ist.
∇2 p =
Gleichungen (3) und (4) werden analog gelöst:
Berechne für alle x im Gitter:
(1) q0v := qv (x − δt u(x,t),t), q0c := qc (x − δt u(x,t),t)
(2) ∆q0v := −∆C := min(qvs − q0v , qc )
qv (x,t + δt) := q0v + ∆qv
qc (x,t + δt) := q0c − ∆qv
(3) θ0 := θ(x − δt u(x,t),t)
(4) θ(x,t + δt) := θ0 + c pLΠ ∆C
Schritt (1) und (3) sind hier wieder Advektionen, Schritt (2) ist der Phasenübergang, der
durch die Kondensationsrate definiert ist, und Schritt (4) ist die daraus resultierende Temperaturänderung. Die Temperatur fließt dabei in die Berechnung des Auftriebs B und des
Sättigungspunktes qvs ein, welcher dem Wasserdampfanteil entspricht, bei dem Verdampfungsrate = Kondensationsrate gilt, also ein Gleichgewischt herrscht.
Es ist möglich die angegebenen Schritte auf der Grafik-Hardware mit Texturen statt Arrays für das Gitter durchzuführen. Dazu muss für jedes Skalar- und Vektorfeld eine FloatingPoint-Textur als Rendertarget angelegt werden. qc ist gleichzeitig die optische Dichte und
somit die für die Optik interessante Eigenschaft der Wolke. Die Textur, die qc enthält,
wird im Folgenden als Dichte-Textur bezeichnet.
Um aus den Texturen lesen zu können, erstellt man ein viereckiges Polygon, dass den
Viewport genau bedeckt. Dazu sollten die Texturkoordinaten so angepasst werden, dass
Seite 3
München, 3.7.2006
jedes Texel genau ein Pixel bedeckt, um korrekte Werte zu gewährleisten. Schließlich
erstellt man einen Pixel Shader für jeden Rechenschritt, der mittels Texture Fetches die
Werte aus den Texturen einliest und das Ergebnis der Rechnung in das Render Target wieder ausgibt.
Für 3D-Wolken wird diese Rechnung nur alle paar Sekunden durchgeführt und zwischendurch interpoliert, da sonst keine flüssige Echtzeit-Darstellung möglich wäre.
3.1.2
Rendering über 3D-Texturen
Um effiziente Lichtberechnung durchzuführen verwendet man das vereinfachtes Beleuchtungsmodell. Unter Ausnutzung der Eigenschaft von Mie-Streuung, dass der größte Teil
des Lichts nach vorne gestreut wird, beschränkt man sich nun beim ’Multiple Forward
Scattering’ darauf, das Licht nur nach vorne zu streuen. Gleichung (6) muss also neu
definiert werden:
1
r(x, l, −l)I(x, −l)
(9)
4π
l ist dabei die Richtung des Lichtstrahls von der Quelle. Diskretisierung von Gleichung
(5) ergibt:
g(x, l) =
N
N
j=1
j=1
Ib = Ia · ∏ exp(−τ j ) + ∑ g j
N
∏
exp(−τk )
(10)
k= j+1
In rekursiver Schreibweise:
Ik =
gk−1 + Tk−1 · Ik−1 , 2 ≤ k ≤ N
I0 ,
k=1
(11)
mit Tk := exp(−τk ), I0 := Ia , gk := g(xk , l)∀k ∈ {1, . . . , N}
Dieser Algorithmus ist auf der Grafikkarte z.B. mittels 3D-Texturen durchführbar. Man
erstellt dafür ein 3D-Volume, das die komplette Wolke einschließt, richtet es nach der
Lichtquelle aus und setzt die Kamera auf die Position der Lichtquelle, für gerichtetes
Licht entspräche das einer isometrischen Perspektive.
Die Slices des Volumes werden dann generiert, indem das k − 1-te Slice mittels Alpha
Blending auf das k-te Slice gerendert wird. Dazu müssen die Parameter der Alpha-BlendFunktion richtig gewählt werden:
cresult = fsrc · csrc + fdst · cdst
Setze also fsrc := 1, csrc := gk−1 , fdest := Tk−1 , cdest := Ik−1 , dann ergibt sich die Rekursion in Gleichung (11).
Um eine beleuchtete Wolke zu erhalten muss nun die Dichte-Textur mit der BeleuchtungsTextur multipliziert werden.
Bisher unberücksichtigt blieb die Position des Betrachters, daher wird zusätzlich eine
Einfach-Streuung in Richtung der Kamera durchgeführt:
Ek = Sk + Tk · Ek−1 , 1 ≤ k ≤ N
Seite 4
(12)
München, 3.7.2006
Sk ist das gestreute Licht am Punkt xk in Kamerarichtung. Das Vorgehen hierbei ist analog
zum ’Multiple-Forward-Scattering’-Algorithmus, nur werden die Slices hier direkt auf
den Viewport gerendert.
3.2
MS Flight Simulator 2004
Da Skyworks nur indirekt künstlerische Kontrolle über das Aussehen der Wolken bietet,
einige Wolkentypen nur schwer zu generieren sind und es einen hohen Rechenaufwand
erfordert, verwendet MS Flight Simulator 2004 ein in diesen Punkten geeigneteres Verfahren.
Die Wolken werden in 3DSMax als Quader generiert und zu Formationen angeordnet, die
das grobe Aussehen einer Wolkenlandschaft wiedergeben. Man texturiert die Wolken mit
einer Auswahl vorgenerierter Bilder, die die verschiedenen Wolkentypen darstellen. Dazu
werden frei rotierbare 2D-Sprites in den Mittelpunkt jedes Quaders gesetzt und mit der
entsprechenden Textur belegt.
Im Spiel selbst werden die Wolken als Billboards gerendert, d.h. die Sprites werden so
rotiert, dass sie immer zur Kamera zeigen.
Dadurch kann ein sogenannter ’Parting of the Red Sea’-Effekt auftreten, wenn man den
Wolken zu nahe kommt. Um das zu vermeiden, wird der Sichtwinkel des Billboards zur
Kamera bei kleiner Entfernung gesperrt. Sollte die Kamera schwenken und auf die Kante des Billboards blicken wird die Transparenz reduziert, da sonst Artefakte auftreten
können.
Werden viele Wolken gleichzeitig dargestellt, resultiert das in einem großen Anteil von
Wolken, der zwar gerendert wird, aber eigentlich nicht sichtbar ist. Eine Optimierung
dafür bieten Impostor-Ringe:
Alle Wolken mit einem Mindestabstand zum Betrachter werden in einen Ring aus Impostors gerendert. Der Ring wird dann wie eine Kulisse um die Kamera platziert um die enthaltenen Szene vorzutäuschen. Der Performance-Gewinn entsteht nun dadurch, dass der
Impostor-Ring nicht in jedem Frame neu generiert wird, sondern nur nach Überschreitung
eines Fehlerwertes durch Rotation oder Translation der Kamera.
4
Referenzen
• M.J. Harris, W.V. Baxter III, T. Scheuermann, A. Lastra “Simulation of Cloud Dynamics on Graphics Hardware” In Proc. Graphics Hardware 2003
• Y. Dobashi, K. Kaneda, H. Yamashita, T. Okita, T. Nishita “A Simple, Efficient
Method for Realistic Animation of Clouds” In Proc. ACM SigGraph 2000
• T. Nishita, Y. Dobashi, E. Nakamae “Display of Clouds taking into Account Multiple Anisotropic Scattering and Sky Light” In Proc. ACM SigGraph 1996
• N. Wang “Let there be Clouds! Fast, Realistic Cloud-Rendering in Microsoft Flight
Simulator 2004: A Century of Flight”, Gamasutra Feature Article
Seite 5
München, 3.7.2006
• M.J. Harris “Real-Time Cloud Rendering for Games”, In Proc. Game Developers
Conference 2002
• M.J. Harris, A. Lastra “Real-Time Cloud Rendering”, In Proc. Eurographics 2001
• J. Stam “Real-Time Fluid Dynamics for Games”, In Proc. Game Developers Conference 2003
• M.J. Harris “Fast Fluid Dynamics Simulation on the GPU”, in ’GPU Gems: Programming Techniques, Tips, and Tricks for Real-Time Graphics’, Addison-Wesley
Professional 2004
Seite 6