FlameWorks: Nvidias Feuersimulation unter die Haube geschaut

Mit dem FlameWorks-System will Nvidia Spielentwicklern ein leistungsfähiges Werkzeug zur realistischen Darstellung von Feuer und Rauch in die Hand geben. Wie es funktioniert, erfuhren wir auf der GPU Technology Conference 2014.

In Pocket speichern vorlesen Druckansicht 23 Kommentare lesen
Lesezeit: 7 Min.
Von
  • Roland Austinat
Inhaltsverzeichnis

Hinter dem etwas sperrigen Vortragstitel "Smoke & Mirrors: Advanced Volumetric Effects for Games" versteckte sich auf der GPU Technology Conference 2014 ein Blick unter die Haube von FlameWorks. Mit diesem System sollen Spielentwickler ihre Werke mit volumetrischen Feuer- und Raucheffekten verschönern können.

Es ist Bestandteil von Nvidias GameWorks-Bibliothek, die primär aus der Physik-Engine PhysX, der Raytracing-Engine OptiX, dem VisualFX-SDK und den notwendigen Tools und Beispielen besteht. FlameWorks ist Teil des VisualFX-SDK, das auch die Komponenten WaveWorks, FaceWorks, HairWorks, GI Works (GI: Global Illumination) sowie Turbulence enthält.

"FlameWorks kombiniert eine rasterbasierte Strömungssimulation und einen qualitativ hochwertigen Volumen-Renderer", erklärt Simon Green, Grafikprogrammierer bei Nvidia. "Unsere Inspirationen waren Offline-Renderer wie Plume von ILM, FumeFX, Maya Fluids und Houdini Pyro – doch wir wollten vergleichbare Ergebnisse in Echtzeit erreichen."

Damit möglichst viele Entwickler auf FlameWorks zugreifen können, stehen die leichte Integration in eigenen Programmcode sowie eine individuelle Parametrisierung ganz oben. Denn auch, wenn Flammen und Rauch in einem Spiel oft nur schmückendes Beiwerk sind, erfordert ihre Berechnung jede Menge Arbeit – Arbeit, die FlameWorks den Programmierern abnehmen soll.

Nvidias Feuersimulation (17 Bilder)

Zur Vermeidung von Diffusionsfehlern setzen die Programmierer statt des Semi-Lagrange-Verfahrens die MacCormack-Methode ein, die den Rechenfehler von einem Element zum nächsten schätzt und vom Endergebnis abzieht. (Bild: Roland Austinat)

Simon Greens Kollege Nuttapong Chentanez beschreibt die Simulationskomponente von FlameWorks. Sie konzentriert sich ausschließlich auf die Simulation des am Verbrennungsprozess beteiligten Fluids und quantifiziert Geschwindigkeit, Temperatur, Brennstoffart und Rauchdichte. Diese vier Parameter werden in Rasterelementen gespeichert, die ihrerseits in zwei Vec4-3D-Texturen Platz finden.

Die eigentliche Simulation läuft in vier Schritten ab. Im Advektionsschritt berechneten die Nvidia-Designer zunächst mit Hilfe des Semi-Lagrange-Verfahrens, wie sich die Geschwindigkeit des Fluids auf seine Eigenschaften wie Temperatur und Dichte auswirkt. Allerdings führte dieses Verfahren nur zu einer Genauigkeit erster Ordnung: Wirbel und kleine Strömungsdetails verschwanden, Flamme und Rauch wurden zu glatt. Deshalb setzen die Programmierer die MacCormack-Methode ein, die den Rechenfehler von einem Element zum nächsten schätzt und vom Endergebnis abzieht. Dadurch werden Diffusionsfehler vermieden.

Im zweiten Simulationsschritt wird der Strömungsaustrittspunkt definiert. Die Mündung eines Flammenwerfers besitzt beispielsweise eine andere Form als das Maul eines feuerspeienden Drachens. "Derzeit unterstützen wir Sphären, Ebenen, Kästen und Kegel", erklärt Nuttapong Chentanez. "Programmierer können aber auch eigene Austrittspunkte einbauen, indem sie Shader definieren, die die Dichte- und Geschwindigkeitstexturen verändern."

Sowohl in diesem als auch im Advektionsschritt verstärkt FlameWorks außerdem kleine Wirbel, damit sie nicht früher als gewünscht aus der Darstellung verschwinden. "Es ist auch möglich, das Raster zu bewegen, um einem sich bewegenden Objekt zu folgen", sagt Chentanez. Sehr praktisch für ein Computerspiel, denn dort bleiben beispielsweise feuerspuckende Drachen eher selten faul an einem Ort stehen.

Jetzt ist alles bereit für den dritten Schritt: den Verbrennungsvorgang. "Liegt die Fluidtemperatur über ihrer Zündtemperatur, startet die Verbrennung", sagt Nuttapong Chentanez. Brennstoff wird verbraucht, die Temperatur steigt an und sorgt für eine nach oben gerichtete Auftriebsbewegung, während sich das Fluid ausdehnt. Optional ist auch eine Absenkung der Temperatur möglich. Im vierten und letzten Schritt findet eine Inkompressibilitätsberechnung statt.

Der Grund: Ist ein Fluid inkompressibel, kann es im Geschwindigkeitsfeld nicht zu Divergenzen kommen. Die Masse bleibt konstant und es bildet sich die für ein Fluid charakteristische Drehbewegung aus. "Dieser Schritt ist der rechenintensivste der ganzen Simulation", sagt Chentanez. Dabei wird ein Druckfeld berechnet, dessen Gradient die Divergenz des Geschwindigkeitsfelds aufhebt.

Eine Demonstration eines feuerspuckenden Drachens mit rund vier Millionen Voxeln (Geschwindigkeitsraster: 128 x 128 x 256 Voxel), deren Dichte durch eine Rasterverdopplung auf 256 × 256 × 512 auf rund 33 Millionen Voxel ansteigt, läuft auf einer GeForce GTX Titan immerhin noch mit etwa 30 Bildern pro Sekunde. "Wir können die Dichte in der doppelten oder vierfachen Auflösung der Geschwindigkeit speichern und dann im Advektionsschritt die Geschwindigkeit durch Interpolation an die Dichte anpassen", erklärt Simon Green. "Physikalisch ist das zwar nicht hundertprozentig korrekt, doch das Ergebnis sieht gut aus und belastet die ohnehin rechenintensive Inkompressibilitätsberechnung nicht weiter." In der Tat: Selbst eine vierfach interpolierte Dichte sieht sehr natürlich aus.

Die Simulationsergebnisse werden dann an den Volumen-Renderer von FlameWorks verarbeitet. Dessen Gebrauch ist optional – Entwicklern steht frei, eigene Renderer einzusetzen. Der mitgelieferte besitzt jedoch zahlreiche Eigenschaften, die ihn attraktiv machen. Etwa Color Mapping: Eine zunächst schwarzweiße Flamme lässt sich physikalisch korrekt einfärben. Alternativ dürfen sich die Grafiker eigene Farbverläufe ausdenken, um etwa magischem Feuer einen ganz besonderen Schein zu verpassen. Ein zuschaltbares Hitzeflimmern und unterschiedliche Filtermodi sind ebenfalls dabei. Aber Vorsicht: "Kubische Filterung sorgt für sanftere Übergänge, benötigt jedoch den achtfachen Rechenaufwand", sagt Simon Green.

Etwas getrickst wird bei den volumetrischen Schatten. Sie werden mit einer halb oder gar nur einer ein Viertel so großen Auflösung der Dichtetextur erzeugt, was zur Streifenbildung führen kann. Die Lösung: Dem Ausgangswert des Lichtstrahls wird eine Zufallskomponente hinzugefügt. Die erzeugt zwar Unschärfen, doch mit einem numerischen Verwischen verschwinden sie spurlos.

Wer dem Renderer noch mehr zu tun geben will, aktiviert die angenäherte Volumenstreuung. Gerade bei besonders "verrauchten" Verbrennungsprozessen sorgt sie für zusätzlichen Realismus. Sie erfordert HDR-Rendering und trennt die Lichtemission des Brennvorgangs von der Ausgangstextur, verwischt sie dann in drei Dimensionen und kombiniert sie schließlich wieder mit der Ausgangstextur. Selbstverständlich kann der Renderer auch die Reflektionen der Flamme auf anderen Körpern beziehungsweise deren Spiegelung auf wieder anderen Körpern berechnen und darstellen.

Die Entwicklung von FlameWorks ist mitnichten abgeschlossen. "Derzeit läuft das System nur unter DirectX 11, doch eine zukünftige Unterstützung von OpenGL wäre denkbar", sagt Simon Green. Neben einer Integration von FlameWorks mit GI Works – Feuer wird dann zu einer volumetrischen Lichtquelle – sowie verbessertem Volumenrendering arbeiten Nvidias Programmierer vorrangig an der Optimierung.

Zwar benötigt eine GeForce GTX Titan zur Berechnung von 256.000 Voxeln (64 × 64 × 64) nur eine Millisekunde. Doch verdoppeln sich deren x-, y- und z-Werte (128 × 128 × 128), verfünffacht sich die Berechnungszeit auf 5,1 Millisekunden. Eine erneute Verdopplung (256 × 256 × 256) läuft dann definitiv nicht mehr in Echtzeit: Erst nach 40 Millisekunden steht das Ergebnis fest. "Der ganze Prozess ist außerdem sehr speicherintensiv", ergänzt Green. "Ehe man sich versieht, nutzt man bereits 1 GByte Texturspeicher für Geschwindigkeit, Temperatur und Co." Das soll aber nicht bedeuten, dass Drachen nur auf absoluten High-End-Systemen Feuer spucken: "FlameWorks läuft schon auf einer GeForce 680", sagt Simon Green. (axk)