Seite 1 von 1
Ich brauche einen dichten Layer Wolken
Verfasst: 21.07.2025, 22:18
von Schrompf
Moin Leute,
evtl. habe ich das vor 300 Jahren schon mal in diesem Forum gefragt, aber ich frag nochmal:
Was gibt es für Techniken, um Wolken zu rendern?
Im Schleichspiel sind alle Level ja so Himmelsinseln, hart abgegrenzte Bereiche, die am Rand ins Nichts abfallen. Und da wollte ich auf Bodenhöhe einen blickdichten Layer Wolken einziehen, der sich in alle Richtungen in die Unendlichkeit streckt. Aber wie rendere ich den?
Ich hätte gern, dass er
- immer blickdicht ist,
- ich ihn über Zeit animieren kann,
- Lichtausbreitung darin glaubwürdig aussieht
- von Sonne
- vom Himmel
Himmel macht ja stumpf von oben nach unten dunkler, ok. Sonne wär ein weiterer Raycast, irgendwo da wird's teuer.
Was für Techniken kennt ihr so?
Im Discord schlug jemand vor, dass man ja auch paar hundert K an wolkigen Billboards splatten könnte, aber das skaliert nicht auf große Strecken, oder?
Re: Ich brauche einen dichten Layer Wolken
Verfasst: 22.07.2025, 00:02
von Jonathan
Zum Verständnis: Die Kamera guckt meistens runter, ja? D.h. die Sonne ist über dir, niemals zu sehen, und du guckst von oben nach unten auf die Wolken und willst darunter keinen Boden sehen?
Damit die so richtig Volumetrisch aussehen, bräuchtest du halt schon sowas wie Pathtracing auf volumetrischen Daten, was dann natürlich entsprechend teuer ist. Einfach nur Sprites übereinander rendern kommt da nicht so ganz ran, weil die dann ja keinen Schatten aufeinander werfen, d.h. die Wolke ist insgesamt zu hell und kontrastarm.
Es gab auf der Siggraph mal vor Jahren einen Talk, wie Horizon Forbidden West das gemacht hat. War halt Path-Tracing, aber über mehrere Frames verteilt (und entsprechend Ergebnisse der letzten paar Frames teilweise wiederverwenden) und ging damit dann in Echtzeit. Klang aber irre kompliziert.
Ich würde vermutlich richtung vorgerenderter Sprites ganzer Wolken überlegen. Wenn die Ansicht meistens von oben nach unten ist, könntest du ja z.B. eine einzelne Wolke in 10 Ebenen aufteilen, die du dann mit Parallax Scrolling verschieben kannst, so dass du die Wolke begrenzt auch von der Seite sehen kannst. Die sind ja eh fluffig, das sollte dann also schon mit recht wenig Ebenen ok aussehen. Man müsste noch überlegen, wie genau man die Rendert, damit man, wenn man alle übereinander von oben anschaut ein Ergebnis ganz nah am echten Pathtracing bekommt.
Damit hast du dann eine handvoll Sprites pro Wolke und vlt. nur insgesamt 50 Wolken sichtbar, also keine zig-tausend Sprites.
Für die Lichtrechnung kann man in Azimuth Richtung die Sprites einfach drehen, für die Altitude Richtung müsste man die aber wohl neu vorrendern (vlt. kann man die Ebenen auch begrenzt kippen?). Das hängt dann ganz davon ab, wie dynamisch deine Sonne sein soll.
Für das Rendern kann man bestimmt etwas in Blender basteln, dafür sollte es ja genügend Tutorials geben, wie man Wolken macht. Man muss aber wie gesagt nochmal über die Zerschneidung in Ebenen nachdenken.
Re: Ich brauche einen dichten Layer Wolken
Verfasst: 22.07.2025, 00:53
von Specialist
Ich kann das Cloud Rendering von Microsofts Flight Simulator 2002 empfehlen.
Das ist zwar schon etwas in die Jahre gekommen, aber lässt sich recht gut und flott implementieren.
Vielleicht reicht es für deine Zwecke ja aus.
Hier die Slides:
https://pdfs.semanticscholar.org/1c07/6 ... 2ad208.pdf
https://niniane.org/clouds
Re: Ich brauche einen dichten Layer Wolken
Verfasst: 22.07.2025, 10:33
von Zudomon
Als Inspiration noch die Sky Levels von Unreal 1. Da waren nur 2 Texturen überlagert, die sich bewegt haben, mit Lightmaps. Zumindest blickdicht und animiert.
Bei 1:00 im Video kann man das gut sehen:
Wenn man nicht durch die Wolken durch fallen kann (wobei ich da auch einfach tricksen würde, zu nah an den Wolken -> Grauschleier) dann einfach noch mehrere Schichten machen, wie Jonathan sagt. Glaube so hattest du das auch damals bei der Splitterwelten Promo Demo gelöst. Heutzutage aber lieber direkt im Shader machen, damit man sich das teure Blending spart.
Hier auch noch mal meine alte Version, wo ich damals die Wolken auch als Schichtlayer gerendert habe.
Da war aber noch kein Licht mit einbezogen... die wurden nur dunkler nach unten hin.
Re: Ich brauche einen dichten Layer Wolken
Verfasst: 22.07.2025, 11:01
von joeydee
Habe irgendwo mal was gesehen/gelesen, wo zuerst Körper bzw. Kugeln als Solids beleuchtet wurden, und diese dann als Lookup oder Distorsion-Grundlage benutzt wurden für die finalen fluffigen Formen. Die genaue Tech finde ich leider nicht mehr. Weiß nicht ob das dann mit Sprites gemacht wurde, aber so kann man jedenfalls das Beleuchtungsproblem für diese lösen.
Ich habe mal was ähnliches gemacht mit Bäumen, da war zwar das Ziel ein Ghibli-Zeichentrick-Stil, und alles nur N*L-Vorbeleuchtung, aber vielleicht inspiriert es ja:
viewtopic.php?p=66179#p66179
In meinem Shader wurden da solide Platzhalter-Meshes (Kugeln, Blöcke) beleuchtet, und dann jedes Face in ein versetztes gedrehtes Sprite mit Laub-Textur verwandelt, aber mit dem Beleuchtungswert der ursprünglichen Fläche.
Kugeln raytracen kann man ja ziemlich optimieren, da sollte man Occlusion, Subsurface-Scattering etc. gut einbauen können, um eine realistische Beleuchtungsgrundlage zu bekommen.
Da verweise ich mal auf den Quilez, u.a.:
https://iquilezles.org/articles/spherefunctions/
Unabhängig von den eigentlichen Wolken, wenn man nach unten 100% dicht haben will und falls der gewählte Wolkenrenderer das nicht hergibt, am besten einfach noch einen Groundfog dazu.
Re: Ich brauche einen dichten Layer Wolken
Verfasst: 22.07.2025, 23:40
von Schrompf
Danke! Immer wieder schön, wieviel Ahnung ihr habt. Horizon-Niveau wär natürlich großartig, aber ist wirklich weit jenseits meiner Möglichkeiten. Paar Billboards zu stacken und deren Schatten über x Frames verteilt auf der CPU vorzuberechnen wäre ne gangbare Idee. Jemand im Discord hatte alternativ klassisches Noise auf einer Ebene mit bissl Offset vorgeschlagen, und von da aus könnte man dann VolumeFog anwenden. Ich muss ja keine Cumulus-Wolken mit deutlich ausgeprägter vertikaler Struktur zaubern, wenn ich eh nur Fake-Wolken als Leerefüller haben will.
Das dann als Parallax-Schichten zu rendern bringt mich auf ne Idee. 10 Layer mit Wolkenabschnitten sind ja im Endeffekt nur 10 Samples durch die Wolkentextur. Da könnte man ja auch die zehn Samples durch ne Art HeightMap machen, die eine Wolkenstruktur abbildet. Himmelslicht macht man, indem man mit zunehmendem Abstand zur Wolkenoberseite abdunkelt. Für Sonnenschatten könnte man ne zweite HeightMap aus Sonnensicht machen, und der Abstand des Samples dazu ergibt die Sonnenhelligkeit. Das ist ne ShadowMap, fällt mir auf.
Da lässt sich was machen, denke ich. Vielen Dank für den Input. Ich müsste nur mal eher als um 11 abends an den Rechner kommen.
Re: Ich brauche einen dichten Layer Wolken
Verfasst: 23.07.2025, 09:29
von joeydee
Noch eine Ergänzung.
Lichtausbreitung darin glaubwürdig aussieht
[...]
Himmel macht ja stumpf von oben nach unten dunkler
Nicht ganz. Himmel ist eigentlich hemisphärische Beleuchtung, dem käme wohl ein AO-Pass am nächsten.
Re: Ich brauche einen dichten Layer Wolken
Verfasst: 23.07.2025, 14:12
von Schrompf
Ja, stimmt. Aktuell versuch ich mal einen recht ebenen Layer, über den nur bissl wie auf einem Meer die Wellen drüberlaufen. Da sind die Steigungen so gering, dass "von oben nach unten" erstmal ausreichen sollte.
Re: Ich brauche einen dichten Layer Wolken
Verfasst: 24.07.2025, 18:44
von Schrompf
Erster Take: eine segmentierte randomisierte weiße Ebene:
Nächster Schritt ist jetzt das Ausrendern der Tiefen in ein RenderTarget, um TIefenwerte für die Blickdichte-Berechnung zu haben.
Und ja, ich habe noch einen Bug mit der Nebelberechnung. Alle Formeln dreimal gecheckt, ich kapier's noch nicht, aber nach hinten schlägt der Nebel in Konterfarben um. Muss ich wohl mal das gute alte Pix64 rausholen und reindebuggen.
Re: Ich brauche einen dichten Layer Wolken
Verfasst: 27.07.2025, 13:42
von Schrompf
Die Wolkenoberfläche hat eine Tiefe im Bild, aber die Szenentiefe ist überall 0 :-( Naja, wir kommen noch hin.
Re: Ich brauche einen dichten Layer Wolken
Verfasst: 27.07.2025, 14:15
von Schrompf
Per-Pixel Nebel, erster Take: die Nebeloberfläche kriegt in den FragmentShader die eigene Tiefe reingereicht, liest dazu die Tiefe der Szene aus ner Textur. Der Unterschied zwischen den beiden Tiefen ist ein Maß dafür, wieviel Weg das Licht an dieser Stelle durch den Nebel zurücklegt.
Nächster Schritt: ShadowMap samplen. Ich mach ja eh 64 Samples pro Pixel. Wenn ich die 64 Samples einfach entlang des Strahls strecke, müsste ich zum selben Preis einen hübschen Schnitt durch das ShadowMap-Volumen kriegen.