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.