[DX10] Volumetric Clouds with Mega Particles
-
- Beiträge: 30
- Registriert: 28.11.2003, 17:19
- Kontaktdaten:
[DX10] Volumetric Clouds with Mega Particles
Hi!
Hab mal probiert, volumetrische Wolken nach dem folgenden Paper zu implementieren:
http://www.inframez.com/events_volclouds_slide01.htm
Das klappt eigentlich auch ganz gut, bis auf den vorletzten Schritt, wo die Wolke "verzerrt" werden soll mit einem fractial cube. Nun weiss ich nicht genau, wie das gemeint ist. Soll ich eine Cube-Texture erstellen, die auf allen Seiten eine (dieselbe) Noise-Map hat und dann einen simplen Texture-Lookup im Shader? (hat leider nicht sonderlich gut funktioniert)
In den Slides steht was von 'den Cube rendern'. Dies hab ich auch schon probiert, allerdings verschiebt sich dann die fractial noise Texture über die Wolke wenn die Kamera nahe genug bei der Wolke ist (aufgrund der perspektivischen Projektion).
Der dritte Ansatz, den ich probiert habe, war eine Volumentextur. Dabei habe ich erst die relative Position (zwischen 0 und 1 in jeder Richtung) aller Wolkenpartikel in ein RT gerendert und anschliessend mit diesem Wert den Verzerrungsvektor aus der Volumentextur gelesen.
Wie gesagt, hat alles nicht gut funktioniert (mal gabs ghosting-Artefakte, mal war die Verzerrung viel zu gering, etc...).
Kann mir da jemand einen Tipp geben?
Im Netz hab ich leider nicht sonderlich viel dazu gefunden...
Hab mal probiert, volumetrische Wolken nach dem folgenden Paper zu implementieren:
http://www.inframez.com/events_volclouds_slide01.htm
Das klappt eigentlich auch ganz gut, bis auf den vorletzten Schritt, wo die Wolke "verzerrt" werden soll mit einem fractial cube. Nun weiss ich nicht genau, wie das gemeint ist. Soll ich eine Cube-Texture erstellen, die auf allen Seiten eine (dieselbe) Noise-Map hat und dann einen simplen Texture-Lookup im Shader? (hat leider nicht sonderlich gut funktioniert)
In den Slides steht was von 'den Cube rendern'. Dies hab ich auch schon probiert, allerdings verschiebt sich dann die fractial noise Texture über die Wolke wenn die Kamera nahe genug bei der Wolke ist (aufgrund der perspektivischen Projektion).
Der dritte Ansatz, den ich probiert habe, war eine Volumentextur. Dabei habe ich erst die relative Position (zwischen 0 und 1 in jeder Richtung) aller Wolkenpartikel in ein RT gerendert und anschliessend mit diesem Wert den Verzerrungsvektor aus der Volumentextur gelesen.
Wie gesagt, hat alles nicht gut funktioniert (mal gabs ghosting-Artefakte, mal war die Verzerrung viel zu gering, etc...).
Kann mir da jemand einen Tipp geben?
Im Netz hab ich leider nicht sonderlich viel dazu gefunden...
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [DX10] Volumetric Clouds with Mega Particles
Ich schließe mich der Frage an – bei meiner letzten Wolken-Implementierung war das nämlich auch ein Problem … ein einfacher Texture-Cube ist zwar bei Rotation einwandfrei, in Bewegung allerdings unbrauchbar. Ich würde soweit gehen und sagen, dass man dort eine Volumentextur braucht.
Gruß, Ky
Gruß, Ky
-
- Beiträge: 30
- Registriert: 28.11.2003, 17:19
- Kontaktdaten:
Re: [DX10] Volumetric Clouds with Mega Particles
Hab mir gerade die Screenshots von deinem Terrain und den Wolken angesehen, echt beeindruckend!
Ach ja, zum Thema fractial cube: so ne Textur müsste man auch mal erst noch erstellen. Ich weiss auch nicht recht, wie so eine Textur auszuschauen hat und wie man die dann erstellt. Du hast nicht zufällig so ne 2-Kanal 3D-Textur rumliegen? ;)
Ach ja, zum Thema fractial cube: so ne Textur müsste man auch mal erst noch erstellen. Ich weiss auch nicht recht, wie so eine Textur auszuschauen hat und wie man die dann erstellt. Du hast nicht zufällig so ne 2-Kanal 3D-Textur rumliegen? ;)
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [DX10] Volumetric Clouds with Mega Particles
Achsooo, der benutzt den Texture-Cube, um die Samples beim Postprocessing zu verschieben … dann ist das doch ziemlich anders als das, was ich damals gemacht habe. Ich hätte jetzt empfohlen, einfach drei Volume-Textures unterschiedlicher Auflösung mit zufälligem Noise zu füllen und zu überblenden … aber bei Distortions bin ich überfragt (ich hasse die).
Re: [DX10] Volumetric Clouds with Mega Particles
Kurze Zwischenfrage: Meint ihr den Fehler, der auch in dem folgenden Video zu sehen ist?
http://www.youtube.com/watch?v=3QqD26SXWDc
Wenn ja, so ist es klar, dass es an dem erwähnten "Texture-Cube" liegt. Mit einer Volumen-Textur wäre das nicht der Fall. Um eine solche zu generieren, gäbe es einen ganz praktischen Weg, welcher auch hier in Abschnitt 6.5.2 (nur eben auf Volumentexturen erweitert) erläutert wird:
http://http.developer.nvidia.com/GPUGem ... _ch06.html
http://www.youtube.com/watch?v=3QqD26SXWDc
Wenn ja, so ist es klar, dass es an dem erwähnten "Texture-Cube" liegt. Mit einer Volumen-Textur wäre das nicht der Fall. Um eine solche zu generieren, gäbe es einen ganz praktischen Weg, welcher auch hier in Abschnitt 6.5.2 (nur eben auf Volumentexturen erweitert) erläutert wird:
http://http.developer.nvidia.com/GPUGem ... _ch06.html
-
- Beiträge: 30
- Registriert: 28.11.2003, 17:19
- Kontaktdaten:
Re: [DX10] Volumetric Clouds with Mega Particles
Jup, um diesen Effekt handelt es sich. Ich denke mit so einer Perturbationstextur (in 3D) wäre das Problem gelöst, nur wird in dem Artiekl ja nicht beschrieben, wie man so eine Textur am besten erstellt...
Re: [DX10] Volumetric Clouds with Mega Particles
Doch, in meinem zweiten Link steht:
... so würde ich das zumindest angehen, kann sein, dass das Dir zu zeitaufwändig ist ;)
Also würde ich das so angehen: Man baut sich einen Würfel, in dem man eine kleine Fluid-Simulation reinbastelt. Zum Beispiel hat man einen 512x512x512 Würfel, der aus 512 512x512 Pixel großen "Feuer-Texturen" besteht, d.h. 512 Slices von rötlichen und grünlichen Partikeln, welche in jedem Slice gemäß ihrer Koordinate eingefärbt sind. Dann macht man ein paar zufällige Strömungsquellen da rein, und nach einiger Zeit (aber nicht zu lange!) hat man ein ganz nettes Ergebnis ...GPU Gems hat geschrieben: We rendered a particle system of "heat" particles in a texture target. During the final compositing, we simply used the (red, green) values of each "heat render target" pixel as a (u, v) per-pixel 2D texture coordinates displacement during the texel fetch of the "rendered scene" texture target. That created a noise effect that looked like heat shimmer. See Figure 6-21.
... so würde ich das zumindest angehen, kann sein, dass das Dir zu zeitaufwändig ist ;)
Re: [DX10] Volumetric Clouds with Mega Particles
Ich persönlich befürchte, das würde ein zu gleichmäßiges bzw. unrealistisches Resultat liefern.
- Krishty
- Establishment
- Beiträge: 8316
- Registriert: 26.02.2009, 11:18
- Benutzertext: state is the enemy
- Kontaktdaten:
Re: [DX10] Volumetric Clouds with Mega Particles
Nein. Für die oben verlinkten Screenshots habe ich sogar original die Textur aus dem Artikel benutzt. Aber okay, mein Ansatz war ein wenig anders. Dennoch ist Perlin Noise üblicherweise immer zufriedenstellend … in solchen Fällen bin ich für Probieren über Studieren.
Re: [DX10] Volumetric Clouds with Mega Particles
Was man bei den Perlin-Beispielen so sieht, kommt einem oft sehr gleichmäßig vor. Aber daraus lässt sich eigentlich per Parameter und Modifier alles Mögliche machen. Höhere Amplitude bei Low-Frequenz und kleinere bei High gibt schon wieder ganz andere Ergebnisse. Und wenns turbulent zugehen soll ("Schlieren") setzt man ein zweites Perlin als Versatzoperator ein. Oder eine beliebige andere Funktion. Skalieren und ein Gradient-Lookup und man hat z.B. Holzmaserung. Prinzipiell kann man zusätzlich alle Dichtefunktionen als Modifier verwenden die man auch von Iso-Surfaces kennt, und damit lässt sich eine Menge anstellen.
Was statt Perlin auch geht (aber vom Ergebnis her ähnlich ist, vermutlich nur langsamer): x-mal einen pseudo-zufälligen Punkt und einen Richtungsvektor erzeugen, die "Dichte" an beliebiger Stelle im Raum ist dann die Summe von (ebenfalls pseudo-zufälligen) Wellenfunktionen die in diesem Punkt "starten" (Überlagerung von Wellenfronten in unterschiedlicher Richtung). Wie bei Perlin kann man über Anzahl, Amplituden und Frequenzspektrum/-Verteilung das Aussehen und die fraktale Dimension beeinflussen.
Wenns völlig individuell und noch simpler sein soll: wirf ein paar (viele) Metaballs in den Würfel und verrechne deren Dichte, evtl. mal addierend, mal subtrahierend... es gibt viele Möglichkeiten ein klumpiges 3D-Fraktal zu erzeugen.
Was statt Perlin auch geht (aber vom Ergebnis her ähnlich ist, vermutlich nur langsamer): x-mal einen pseudo-zufälligen Punkt und einen Richtungsvektor erzeugen, die "Dichte" an beliebiger Stelle im Raum ist dann die Summe von (ebenfalls pseudo-zufälligen) Wellenfunktionen die in diesem Punkt "starten" (Überlagerung von Wellenfronten in unterschiedlicher Richtung). Wie bei Perlin kann man über Anzahl, Amplituden und Frequenzspektrum/-Verteilung das Aussehen und die fraktale Dimension beeinflussen.
Wenns völlig individuell und noch simpler sein soll: wirf ein paar (viele) Metaballs in den Würfel und verrechne deren Dichte, evtl. mal addierend, mal subtrahierend... es gibt viele Möglichkeiten ein klumpiges 3D-Fraktal zu erzeugen.