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