3 Stimmen

OpenGL/GLSL: Was ist der beste Algorithmus zum Rendern von Wolken/Rauch aus volumetrischen Daten?

Ich möchte die 3D-Volumendaten rendern: Dichte (kann auf Alpha-Kanal abgebildet werden), Temperatur (kann auf RGB abgebildet werden). Derzeit bin ich simulationg maximale Intensität Projektion, z.B.: Rendering die dichteste/opake Pixel am Ende.

Ich würde gerne den Effekt eines Feuers im Rauch nachahmen.

Also meine Frage ist, was ist die Techniken in OpenGL, um Bilder auf der Grundlage der verfügbaren Daten zu generieren?

Jede Idee ist willkommen.

Danke Arman.

4voto

Jose Punkte 301

Ich würde es zuerst mit einem Volumen-Strahlenwerfer versuchen.

Sie können googeln "Volume Visualization With Ray Casting" und das sollte Ihnen das meiste geben, was Sie brauchen. NVidia hat ein tolles Beispiel (mit openg) von Ray Casting durch eine 3D-Textur.

Bei Ihrer speziellen Implementierung müssten Sie einfach durch das Volumen schreiten und die Temperatur akkumulieren, bis Sie die gewünschte Dichte erreichen.

Wenn Ihr Volumen nicht in den Videospeicher passt, können Sie das Raycasting in Teilen durchführen und dann einen Kompositionsschritt vornehmen.

Eine kurze Beschreibung des Strahlenwurfs:

CPU: 1) Rendern Sie einen sechsseitigen Würfel im Weltraum als Zeichnungsprimitiv und stellen Sie sicher, dass Sie Tiefenkorrekturen verwenden.

Vertex-Shader: 2) Im Vertex-Shader die Weltposition der Scheitelpunkte abspeichern (dadurch wird pro Fragment interpoliert)

Fragment-Shader: 3) Verwenden Sie die interpolierte Position abzüglich der Kameraposition, um den Vektor der Traversierung durch das Volumen zu erhalten. 4) Verwenden Sie eine while-Schleife, um das Volumen von dem Punkt auf dem Würfel bis zur anderen Seite zu durchlaufen. Es gibt 3 Möglichkeiten, um zu wissen, wann man aufhören muss. A) Teste bei jedem Schritt, ob sich der Punkt noch im Würfel befindet. B) einen Strahlenschnitt mit dem Würfel durchführen und den Abstand zwischen den Schnittpunkten berechnen. C) ein Prerender des Würfels mit Forward Face Culling und speichern Sie die Tiefen in eine zweite Textur-Map dann nur Sampe auf dem Bildschirm Pixel, um den Abstand zu erhalten.

5) in einer Schleife akkumulieren und die Pixelfarbe festlegen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X