Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

Vortäuschen von Global Illumination

Warum Global Illumination vortäuschen?

Godot bietet mehrere Global Illumination (GI)-Methoden an, die alle ihre Vor- und Nachteile haben. Nichtsdestotrotz ist es möglich, alle GI-Methoden zu vermeiden und stattdessen einen handgemachten Ansatz zu verwenden. Es gibt einige Gründe für die Verwendung eines "handgemachten" Ansatzes zur Global Illumination anstelle von VoxelGI, SDFGI oder gebackenen Lightmaps:

  • Sie benötigen eine gute Performance beim Rendern, können es sich aber nicht leisten, einen potenziell umständlichen Prozess zum Backen von Lightmaps zu durchlaufen.

  • Sie brauchen einen Ansatz für GI, der vollständig in Echtzeit und in prozedural generierten Levels funktioniert.

  • Sie brauchen einen Ansatz für GI, der vollständig in Echtzeit funktioniert und nicht unter signifikanten Lichtlecks leidet.

Die unten beschriebenen Ansätze decken nur die indirekte diffuse Beleuchtung ab, nicht die spiegelnde Beleuchtung. Für spiegelnde Beleuchtung, erwägen Sie die Verwendung von ReflectionProbes, die in der Regel billig genug sind, um in Verbindung mit diesem vorgetäuschten GI-Ansatz verwendet werden.

Siehe auch

Sie sind sich nicht sicher, ob das Vortäuschen von Global Illumination mit Lichtern für Ihre Bedürfnisse geeignet ist? Unter Welche Global Illumination-Technik sollte ich verwenden? finden Sie einen Vergleich der in Godot 4 verfügbaren GI-Methoden.

Vortäuschen von DirectionalLight3D-Global Illumination

Während der Himmel seine eigene gerichtete Beleuchtung liefert, strahlt der Haupt-DirectionalLight3D-Node der Szene normalerweise eine große Menge Licht aus. Bei Verwendung einer GI-Technik würde dieses Licht an festen Oberflächen reflektiert und an den meisten schattierten Oberflächen im Freien zurückgeworfen werden.

Wir können dies vortäuschen, indem wir einen zweiten DirectionalLight3D-Node mit den folgenden Änderungen hinzufügen:

  • Rotieren Sie das Licht um 180 Grad. Dadurch kann es die vom Haupt-DirectionalLight3D-Node zurückgeworfene Beleuchtung darstellen.

  • Setzen Sie Schatten auf Aus. Dies reduziert die Performance der sekundären Lichtquelle und ermöglicht gleichzeitig, dass schattige Bereiche einigermaßen beleuchtet werden (was wir hier wollen).

  • Stellen Sie Energie auf 10-40 % des ursprünglichen Wertes ein. Es gibt keinen "perfekten" Wert, experimentieren Sie also mit verschiedenen Energiewerten, je nach Licht und Ihren typischen Materialfarben.

  • Setzen Sie Specular auf 0.0. Indirekte Beleuchtung sollte keine sichtbaren spiegelnden Flecken erzeugen, daher müssen wir die spiegelnde Beleuchtung für das sekundäre Licht vollständig deaktivieren.

Bemerkung

Dieser Ansatz funktioniert am besten in Szenen, die hauptsächlich im Freien stattfinden. In Innenräumen wird das Licht des sekundären DirectionalLight3D immer noch sichtbar sein, da bei diesem Licht die Schatten deaktiviert sind.

Dies kann umgangen werden, indem die Energie des sekundären DirectionalLight3D beim Betreten eines Innenbereichs sanft verringert wird (und beim Verlassen des Innenbereichs das Gegenteil geschieht). Dies kann zum Beispiel mit einem Area3D-Node und AnimationPlayer erreicht werden.

Vortäuschen von Positionslicht-Global Illumination

Es ist möglich, den gleichen Ansatz wie DirectionalLight3D für Positionslichter (OmniLight3D und SpotLight3D) zu verfolgen. Dies erfordert jedoch mehr manuelle Arbeit, da dieser Vorgang für jeden Node mit Positionslicht in der Szene wiederholt werden muss, um gut auszusehen.

Im Idealfall sollten zusätzliche OmniLight3Ds an jeder Stelle hinzugefügt werden, an der eine signifikante Lichtmenge auf eine ausreichend helle Oberfläche trifft. Aufgrund von Zeitbeschränkungen ist dies jedoch nicht immer leicht durchführbar (insbesondere bei der prozeduralen Generierung von Ebenen).

Wenn Sie es eilig haben, können Sie einen sekundären OmniLight3D-Node an der gleichen Position wie den Haupt-Node platzieren. Sie können diesen Node als Child-Element des Haupt-OmniLight3D-Nodes hinzufügen, um das gleichzeitige Verschieben und Ausblenden beider Nodes zu erleichtern.

Nehmen Sie im sekundären OmniLight3D-Node die folgenden Änderungen vor:

  • Erhöhen Sie die Reichweite des Lichts um 25-50%. Dadurch kann das sekundäre Licht das erhellen, was zuvor nicht vom ursprünglichen Licht erhellt wurde.

  • Setzen Sie Schatten auf Aus. Dies reduziert die Performance der sekundären Lichtquelle und ermöglicht gleichzeitig, dass schattige Bereiche einigermaßen beleuchtet werden (was wir hier wollen).

  • Stellen Sie Energie auf 10-40 % des ursprünglichen Wertes ein. Es gibt keinen "perfekten" Wert, experimentieren Sie also je nach Licht und Umgebung mit verschiedenen Energiewerten.

  • Setzen Sie Specular auf 0. Indirekte Beleuchtung sollte keine sichtbaren spiegelnden Flecken erzeugen, daher müssen wir die spiegelnde Beleuchtung für das sekundäre Licht vollständig deaktivieren.

Für SpotLight3D kann der gleiche Trick angewendet werden. In diesem Fall sollte das sekundäre OmniLight3D so platziert werden, dass es dort reflektiert wird, wo das meiste Licht zurückgeworfen wird. Dies ist normalerweise in der Nähe des primären Auftreffpunkts des SpotLight3D.

Im folgenden Beispiel wird ein SpotLight3D-Node verwendet, um den Boden des Raumes zu beleuchten. Da jedoch keine indirekte Beleuchtung vorhanden ist, bleibt der Rest des Raums völlig dunkel. Im wirklichen Leben würden die Wände und die Decke des Raums durch das Licht beleuchtet werden, das von der Umgebung reflektiert wird. Mit einem OmniLight3D-Node, der zwischen dem Ursprung des SpotLight3D und dem Boden positioniert wird, kann dieser Effekt simuliert werden:

../../../_images/faking_global_illumination_comparison.webp