Ein häufiges Problem, mit dem sich die Nutzer in Godot 3.x konfrontiert sahen, war die Schwierigkeit, Sky Shader zu erstellen, die in Echtzeit aktualisiert werden. In Godot 4.0 soll dieses Problem durch die Integration von Sky Shaders behoben werden.

Sky Shader Godot 4.0

Wenn Sie an der Implementierung interessiert sind, können Sie den Code auf GitHub finden.

Sky-Ressourcen.

In Godot 3.x gab es zwei Sky-Typen, ProceduralSky und PanoramaSky. Die gemeinsamen Elemente zwischen den beiden kamen von der übergeordneten Sky-Klasse. In Godot 4.0 werden Sie die Sky-Klasse direkt verwenden. Die Sky-Klasse enthält 3 Eigenschaften:

  1. Ein Material (kann ShaderMaterial, PanoramaSkyMaterial, ProzeduralSkyMaterial oder PhysicalSkyMaterial sein).
  2. Die Radiance-Size.
  3. Der Update-Modus.

Statt in Unterklassen ist das Verhalten des Himmels in seinem Material enthalten. Für alle drei *SkyMaterial-Typen können die Benutzer „In ShaderMaterial konvertieren“ wählen und den Code direkt bearbeiten.

PanoramaSkyMaterial.

Das PanoramaSkyMaterial verhält sich genau wie das vorherige PanoramaSky. Weisen Sie dem Material eine Panorama-Textur zu und Sie sind fertig.

ProceduralSkyMaterial.

Das ProceduralSkyMaterial verhält sich sehr ähnlich wie das alte ProceduralSky mit einigen wichtigen Unterschieden:

  • Unterstützt bis zu 4 Sonnen.
  • Aktualisiert sich jetzt sofort, wenn Berechnungen auf der GPU durchgeführt werden.
  • Die Sonneneigenschaften (Richtung, Energie und Farbe) werden aus den DirectionalLights in der Szene gezogen.

Diese Änderungen machen das ProceduralSkyMaterial zu einer guten Lösung, um schnell einen Himmel zusammenzustellen, wenn Realismus nicht im Vordergrund steht. Es kann leicht optimiert und aktualisiert werden. Zudem verwendet es einen leichten Shader, um den Verbrauch von GPU-Ressourcen zu vermeiden.

PhysicalSkyMaterial.

Das PhysicalSkyMaterial ist eine neue Ressource, die den Himmel auf der Grundlage verschiedener physikalischer Eigenschaften, insbesondere Rayleigh- und Mie-Scattering, zeichnet. Das PhysicalSkyMaterial basiert auf dem Preetham-Daylight Modell (mit einigen Hacks, um es auf Kosten der physikalischen Genauigkeit benutzerfreundlicher zu machen).

Das PhysicalSkyMaterial kann nur eine Sonne haben und es erfordert das Vorhandensein eines DirectionalLight in der Szene, um den Himmel zu beleuchten.

Der Hauptvorteil des PhysicalSkyMaterials besteht darin, dass Sie Eigenschaften des Himmels definieren und anschließend plausibel aussehende Veränderungen am Himmel basierend auf der Tageszeit erfolgen (z.B. Sonnenuntergang und Sonnenaufgang sind automatisch).

Das PhysicalSkyMaterial ist so gestaltet, dass es schnell und einfach zu optimieren ist. Es gibt realistischere Modelle des Tageslichts und wenn die Nutzer etwas Realistischeres benötigen, können sie ShaderMaterials verwenden, um ihre eigenen Himmelsmodelle zu implementieren.

Sky-Shader.

Es wird davon ausgegangen, dass die meisten Nutzer mit einem der drei oben genannten Himmelsmaterialien zurechtkommen werden. Aber wenn Sie mehr Flexibilität benötigen oder etwas Komplexeres machen wollen (z.B. Wolken oder Nebel), ist das Sky Shader-System so konzipiert, dass Sie alles erstellen können, was Sie benötigen.

Sky Shader sind eine weitere Art von Shader, die in einem ShaderMaterial verwendet werden können.

Copy to Clipboard

Alles in Sky Shaders findet in der Funktion fragment() statt. Der Output ist ein einzelner Farbwert, COLOR.

Der einfachste Sky Shader ist:

Copy to Clipboard

Die meisten Sky Shader werden sich auf die Blickrichtung verlassen, die EYEDIR genannt wird. Shader geben auch die POSITION an, d.h. die Position der aktiven Kamera im Weltraum. Diese kann dazu verwendet werden, den Himmel je nach Standort der Kamera zu verändern.

Sky Shader zeichnen auf den Hintergrund und auf die Radiance Cubemap. Dadurch kann die Szene in Echtzeit die Beleuchtungsaktualisierungen von Änderungen des Himmels erhalten.

Sky Shader haben auch zwei optionale eingebaute Subpasses, die mit HALF_RES_COLOR und QUARTER_RES_COLOR zugänglich sind. Diese Subpasses lassen den Sky Shader auf einer Textur mit halber oder viertel Auflösung laufen, damit teure Berechnungen weniger oft durchgeführt werden müssen (z.B. für Wolken). Um die Subpasses zu verwenden, müssen Sie derzeit den entsprechenden Rendermodus use_half_res_pass oder use_quarter_res_pass einstellen.

Sky Shader ermöglichen es den Benutzern, unterschiedlichen Code zu schreiben, je nachdem, welches Renderingziel sie verwenden. So können Nutzer eine Version für die Cubemap und eine andere für jeden Unterpass haben.

Copy to Clipboard

Schließlich bieten Sky Shader Zugang zu Informationen über die ersten 4 DirectionalLights in der Szene.

  • LIGHT0_DIRECTION: Richtung des ersten DirectionalLight.
  • LIGHT0_ENABLED: wahr, wenn mindestens ein DirectionalLight in der Szene vorhanden ist.
  • LIGHT3_COLOR: Farbe des vierten Lichts in der Szene. Wenn LIGHT3_ENABLED falsch ist, ist dieser Wert unbestimmt.
  • LIGHT2_ENERGY: Energie des dritten DirectionalLight in der Szene.

Sky Shader sollten es den Nutzern ermöglichen, beliebig komplexe Himmel zu erstellen.

Performancebezogene Überlegungen.

Der Sky Shader wird auf einem Vollbild-Quadrat gezeichnet, nachdem alle Objekte gezeichnet wurden. Das bedeutet, dass verdeckte Pixel nicht gezeichnet werden. Dies gilt jedoch nicht für die Aktualisierung der Radiance Map und der Sub-Buffer.

Im Allgemeinen besteht die beste Optimierung darin, die Aktualisierung der Radiance Cubemap so weit wie möglich zu vermeiden. Die Radiance Cubemap aktualisiert jedes Einzelbild: wenn TIME im Shader verwendet wird, wenn eine Uniform im Shader geändert wird, wenn eine der Lichteigenschaften aktualisiert wird, wenn die Bildschirmgröße aktualisiert wird (bei Verwendung von Subpasses) und wenn sich die Position der aktiven Kamera ändert (bei Verwendung von POSITION). Die Radiance Cubemap wird mehrmals pro Bild aktualisiert, wenn sich mehrere Kameras einen Himmel und eine Position im Shader teilen.

Die Nutzer sollten auch versuchen, teure Berechnungen in den Subpassbuffern durchzuführen und anschließend, wenn möglich, auf den Vollbildschirm hochzuskalieren. Wenn der Himmel besonders glatt ist, können Sie das Ganze sogar in die Radiance Cubemap rendern und dann beim Zeichnen auf den Bildschirm aus der Cubemap lesen.

Schlußfolgerungen.

Bitte beachten Sie, wenn Sie bereits Szenen mit dem ProceduralSky oder PanoramaSky haben, wird diese Änderung diese unterbrechen und Sie müssen ein ProceduralSkyMaterial oder ein PanoramaSkyMaterial erstellen.

Vielen Dank für Ihren Besuch.

Quelle: godotengine.org