Beleuchtung für Spiele für Mobilgeräte mit Unity

Beleuchtung ist einer der wichtigsten Aspekte eines Spiels. Sie können damit für die richtige Stimmung sorgen, den Spieler anleiten, Bedrohungen oder Ziele identifizieren und vieles mehr. Beleuchtung kann die visuelle Darstellung eines Spiels ausmachen oder zerbrechen. Zum Beispiel kann eine gute Beleuchtung dazu führen, dass ein schlechtes Modell im Spiel besser aussieht, während schlechtes Licht ein gutes Modell verschlechtern kann.

Dieser Leitfaden enthält Informationen zur besseren Beleuchtungsleistung in einem Spiel für Mobilgeräte. Wie du die Beleuchtung einsetzt, wirkt sich auf die Leistung deines mobilen Spiels aus. Es ist wichtig, die Beleuchtung effizient zu nutzen, damit Ihr Spiel so reibungslos wie möglich läuft.

Teile dieses Artikels basieren auf Werken, die von Arm Limited stammen und urheberrechtlich geschützt sind.

Pipelineoptionen für das Rendering

Die Legacy-Rendering-Pipeline von Unity enthält die folgenden Renderingpfade:

  • Vorwärtsrendern
  • Verzögerte Schattierung

Vorwärtsrendern

Beim Vorwärts-Rendering sind Echtzeit-Beleuchtung sehr teuer. Wenn Sie die Anzahl der pro Pixel vorhandenen Lichter reduzieren, können Sie diese Kosten ausgleichen.

Verzögerte Schattierung

Für die verzögerte Schattierung ist GPU-Unterstützung erforderlich. Auf kompatibler Hardware kann durch verzögerte Schattierung eine große Anzahl von Echtzeitlichtern mit hoher Beleuchtungsqualität gerendert werden. Leider funktioniert die verzögerte Schattierung bei mobilen GPUs nicht gut, da sie eine geringere Bandbreite haben.

Bei der Entwicklung eines Titels für Mobilgeräte ist es wichtig, dass dein Spiel auf möglichst vielen Geräten reibungslos läuft.

Universelle Rendering-Pipeline

Unity hat die Universal Render Pipeline (URP) entwickelt. Wir empfehlen Ihnen dringend, für Ihre Spiele für Mobilgeräte URP zu verwenden.

Helle Modi

Je nachdem, wie sich ein Licht bewegt oder in einer Szene verwendet wird, werden unterschiedliche Lichtmodi verwendet. Helle Modustypen haben unterschiedliche Leistungsmerkmale. Berücksichtigen Sie bei der Implementierung von Lampen Folgendes:

  • Für statische Beleuchtung verwenden Sie den Modus Angeheftet. Diese Option eignet sich am besten für Objekte, die ihre Beleuchtung während der Laufzeit nicht ändern. Das Backlicht ist der Prozess der Vorberechnung und Speicherung von Beleuchtungsdaten in Texturkarten, die auch als Lightmaps bezeichnet werden.
    • Die angeschaltete Beleuchtung kann während der Laufzeit nicht geändert werden. Das Licht und die Schatten in den Lightmaps sind statisch. Da die gesamte Beleuchtung in Unity vorverarbeitet wurde, gibt es keine Berechnungen der Laufzeitbeleuchtung, die sich auf die Leistung auswirken.
    • Dynamische Schatten können mit dem verankerten Licht nicht erstellt werden. Dies kann bei dynamischen oder beweglichen Objekten seltsam aussehen.
  • Verwenden Sie gemischt für statische Lichter, die Sie mit sich bewegenden Objekten interagieren lassen möchten. Zum Beispiel eine Fackel, die Licht auf einen Spieler wirft und einen Schatten erzeugt, wenn sich der Spieler daran bewegt.
    • Durch gemischtes Licht entsteht dynamisches direktes Licht und Schatten.
    • Sie können gemischte Beleuchtung in Lightmap-Berechnungen für statische Objekte einbeziehen.
    • Du kannst die Intensität zur Laufzeit ändern. Nur das Licht wird aktualisiert.
    • Teuer.
  • Verwenden Sie Echtzeit für dynamische oder bewegliche Lichter, z. B. Licht, das von einem Feuerball erzeugt wird, der vom Boden aufsteigt und explodiert.
    • Dynamische Licht- und Schatteneigenschaften können während der Laufzeit geändert werden.
    • Lichter in Echtzeit sind nicht in Lightmaps verankert.
    • Sehr teuer.

Weitere Informationen finden Sie unter Unity's Lighting Pipeline.

Verwenden Sie nach Möglichkeit statisches Licht und vermeiden Sie dynamisches Licht

Die dynamische oder Echtzeit-Beleuchtung wird für jeden Frame berechnet und aktualisiert. Sie eignen sich hervorragend, um Objekte zu bewegen, Interaktivität zu zeigen und Emotionen zu erzeugen.

Im Gegensatz dazu sind statische Lichtinformationen in Lightmaps verankert. Durch die Verwendung von Lightmap-Texturen kann ein Objekt teure Berechnungen pro Scheitelpunkt oder Pixel für die Beleuchtung vermeiden. Die Kosten für das Rendern einer Lightmap-Textur sind immer deutlich niedriger als bei der dynamischen Beleuchtung. Wir empfehlen, für die Implementierung in ein mobiles Spiel die verankerte Beleuchtung als erste Wahl zu verwenden.

Lightmap-Back-up

Die Vorberechnung der Lichteffekte wird als Lightmap-Verankerung bezeichnet. Der Effekt des Lichts wird in einer separaten Textur gespeichert, der sogenannten Lightmap. Die Lightmap kann verwendet werden, um die Darstellung von Objekten zu optimieren. Die Lightmap-Verankerung muss nur einmal pro Szene durchgeführt werden. Wenn Sie die Geometrie Ihrer Szene oder die Parameter der verankerten Lampen ändern, müssen Sie die Lightmaps neu verankern. Mit Ausnahme des Aufwands durch die Lightmap-Textur entstehen keine zusätzlichen Leistungskosten während der Laufzeit. Dies ist der beste erste Ansatz für die Beleuchtung auf einer mobilen Plattform.

Das künstliche Licht wird von dynamischen oder sich bewegenden Aspekten deiner Szene nicht beeinflusst. Die Back-up-Beleuchtung umfasst Baked Global Illumination für alle statischen Elemente. Das bedeutet, dass bei Lightmap-Berechnungen indirektes Licht berücksichtigt wird, das von anderen statischen Objekten reflektiert wurde, sowie die gebrannten Lichter, die direkt auf das Objekt fallen.

Abbildung 1: Die vollständig verpackte Beleuchtungseinrichtung, die in der Armies-Technologie-Demo verwendet wurde.

Führen Sie zum Backen der Lampen die folgenden drei Schritte aus.

Schritt 1: Lampen auf „Gemischt“ oder „Gebacken“ stellen

Stellen Sie den Modus der Lampen auf „Gemischt“ oder „Baked“ (Gemischt) ein. Bei mobilen Titeln empfiehlt es sich, „Baked Lights“ statt „Gemischt“ zu verwenden. Das ist die kostengünstigste Methode, um Licht zu rendern.

Abbildung 2: Die Modus-Einstellung der Lampe in Unity.

Schritt 2: Objekte statisch machen

Achten Sie darauf, dass alle Objekte, die von abgebrennten LEDs betroffen sind, statisch sind. Für ein Objekt, das als statisch markiert ist, gibt es viele Optimierungen. Normalerweise ist es jedoch am besten, Alles in der Drop-down-Liste Statisch auszuwählen. Da das Objekt als Static (Statisch) markiert ist, weiß Unity, dass es in das Light-Backing aufgenommen werden muss.

Abbildung 3: Ein Beispiel für ein statisches Menü.

Schritt 3: Licht wird gebacken

Sie können zum Backen Ihrer Lampen das Menü Beleuchtung verwenden, das sich unter Fenster > Rendering > Beleuchtungseinstellungen befindet.

Die gespeicherten Daten beim Verankern von Lampen basieren auf der Szene, die zu Beginn des Verankerns aktiv war. Ein Ordner wird mit dem Namen der verankerten Szene generiert. In diesem Ordner sind alle Komponenten für die Beleuchtungsdaten gespeichert. Wenn Ihr Projekt mehrere Szenen gleichzeitig lädt, müssen Sie das Licht für jede Szene aktivieren. Wenn du die Szene anpasst, musst du die Lichter neu erwärmen.

Abbildung 4: Ein Beispiel für verankerte Lightmaps.

Lightmaps optimieren

Nachdem die Beleuchtung eingerichtet ist, solltest du prüfen, ob die verankerten Karten optimiert sind. Die Größe der Lightmaps hängt von ihren jeweiligen Einstellungen ab. Da die Arbeitsspeichernutzung auf Mobilgeräten niedrig gehalten werden muss, muss die Lightmap-Größe überwacht werden.

Im folgenden Beispiel aus der Armies-Demo gibt es sieben Lightmaps mit 1.024 × 1.024 Pixel. In der Vorschau der Karte sehen Sie Mesh-Netzwerke auf der Lightmap. Die ausgewählten Mesh-Netzwerke sind hervorgehoben.

Abbildung 5: Dies ist ein Beispiel für eine Lightmap. Die blauen Abschnitte sind ausgewählte Elemente.

In den Einstellungen für die Lichtzuordnung gibt es viele Einstellungen, zusammen mit der Größe der Karten, die bestimmen, wie viel Arbeitsspeicher und Speicherplatz die einzelnen Karten belegen. In den folgenden Abschnitten werden einige wichtige Einstellungen erläutert.

Lightmapper

Unity bietet die folgenden drei Methoden, um die Lichter in Ihrer Szene zu verankern:

  • Enlighten (Erleuchteen): wird nur bis zur Version 2020 mit Langzeitsupport unterstützt. Verwenden Sie diese Option nicht für neue Projekte.
  • Progressive CPU: Spart viel Zeit, da inkrementell Light Maps erstellt werden. Wenn Ansicht priorisieren ausgewählt ist, haben die Bereiche in der Ansicht „Szene“ Vorrang. Dadurch kann die Iterationszeit für das Einrichten der Beleuchtung für die Szene verkürzt werden.
  • Progressive GPU: Dies funktioniert wie eine Progressive CPU, generiert die Lightmap aber auf der GPU statt auf der CPU. Auf unterstützter Hardware kann diese Methode die Verankerungszeit im Vergleich zur Verwendung der CPU erheblich verkürzen. Für das Einrichten einer progressiven GPU gelten zusätzliche Anforderungen. Weitere Informationen zu den Anforderungen finden Sie auf der Seite The Progressive GPU Lightmapper.

Abbildung 6: In den Lightmapper-Einstellungen können Sie die Verankerungsmethode für Ihre Szene ändern.

Texel

Ein Texel oder Texturpixel ist ein einzelnes Pixel in einer Texturkarte. Texels speichern Lichtinformationen in einer Lightmap für jeden Lichtpunkt, der auf ein Objekt trifft. Je mehr Texel pro Raumeinheit verwendet werden, wirkt sich auf die Beleuchtungsqualität, die Berechnungszeit für das Backen, die Kosten für die Festplattenspeicherung und die VRAM-Kosten Ihrer Lightmaps aus.

Sie können die Anzahl der erforderlichen Lightmap-Daten reduzieren, indem Sie die Anzahl der Texel pro Verankerungseinheit in den Einstellungen für die Lichtzuordnung anpassen.

Abbildung 7: Verfügbare Einstellungen für Lightmaps.

In den Lightmapping Settings (Einstellungen für die Lichtzuordnung) wird mit dem Parameter Lightmap Resolution gesteuert, wie viele Texel pro Einheit in der Lightmap verwendet werden. Das folgende Beispiel zeigt einen Würfel mit unterschiedlichen Einstellungen für die Lightmap-Auflösung. Sie sehen, wie eine höhere Auflösung den Arbeitsaufwand schnell erhöht.

Abbildung 8: Der erste Würfel hat eine Lightmap-Auflösung von 1. Der zweite Würfel hat eine Lightmap-Auflösung von 2. Der dritte Würfel hat eine Lightmap-Auflösung von 5.

Wenn Sie sich ansehen möchten, wie die Textelemente in Ihrer Szene angeordnet sind, wählen Sie in der Ansicht „Szene“ die Drop-down-Liste Zeichenmodus und dann Baked Lightmap aus.

Ein verankertes Objekt wird in einem Schachbrett-Overlay überdeckt. Das Schachbrettmuster zeigt, wie sich die Texter verteilen, wenn Sie die Lichter backen.

Im folgenden Beispiel wird durch eine Reduzierung der Lightmap-Auflösung von 15 auf 12 in der Armee-Demo die Anzahl der erforderlichen Lightmaps von sieben auf vier reduziert.

Abbildung 9: Die Armeen-Demo mit einer Lightmap-Auflösung von 12.

Texel-Nutzung

Sie können zwar die Anzahl der Texel pro Einheit in einer gesamten Szene festlegen, es gibt jedoch häufig einige Objekte, die nicht so viele Texel benötigen.

Mit Unity können Sie steuern, wie viele Textelemente jedes Objekt verwendet. Im Bereich Inspector > Mesh-Renderer für ein Objekt wird mit dem Parameterwert Scale In Lightmap die Anzahl der Textteile gesteuert, die das Objekt in der Lightmap verwendet.

Im folgenden Beispiel hat der Kubus links fünf Texel mit Lichtinformationen pro Backeinheit. Beim rechten Feld ist die Skalierung in Lightmap auf 0,5 festgelegt. Mit dieser Einstellung werden die Lichtsignale auf 2,5 skaliert, was weniger Platz in der Lightmap als im Feld links benötigt.

Abbildung 10: Zwei Würfel mit unterschiedlichen Lightmap-Auflösungen.

Abbildung 11: Sie können die Einstellung In Lightmap skalieren ändern, sodass ein Objekt weniger Textteile hat.

Vermeiden Sie die Ausgabe von Texten für Folgendes:

  • Oberflächen und Objekte, die Spieler nicht sehen können So wird Arbeitsspeicher für Lightmaps für Details vergeudet, die nicht auf dem Bildschirm zu sehen sind.
  • Oberflächen mit wenig Lichtabweichungen z. B. Objekte, die sich im Schatten befinden oder von einer einzelnen Lichtquelle berührt werden.
  • Kleine oder dünne Gegenstände. Die Lichtmenge, die diese erhalten, wirkt sich nicht stark auf das endgültige Rendering der Szene aus.

Möglichst falsche Beleuchtung

Sie können einige Elemente fälschen, um die Verarbeitungsanforderungen zu verringern. Dies kann dazu führen, dass Ihre Inhalte hell erscheinen, tatsächlich aber effizientere Methoden verwendet werden.

Falsche Schatten

Echtzeit-Schatten sind teuer. Sie werden mit der Methode Schattenzuordnung generiert. Die Kosten für das Rendern der Geometrie einer Szene auf der Schattenkarte sind proportional zur Anzahl der Eckpunkte, für die Schatten gezeichnet wurden. Wir empfehlen, die Anzahl der Geometrie, die Schatten wirft, und die Anzahl der Lichtschatten in Echtzeit zu begrenzen.

Sie können falsche Schatten für Schatten auf dynamische Objekte ohne dynamische Lichter implementieren. Dadurch werden die Renderingkosten niedrig gehalten und ein ähnlicher Effekt wie bei dynamischen Schatten erzielt. Im Folgenden finden Sie einige Möglichkeiten, unechte Schatten zu implementieren:

  • Verwenden Sie ein 3D-Mesh-Netzwerk, z. B. ein Flugzeug oder ein Viereck, das Sie unter der Figur platzieren, und wenden Sie eine verschwommene Textur darauf an.
  • Sie können einen eigenen benutzerdefinierten Shader für komplexere Blob-Schatten schreiben.

Im folgenden Beispiel sehen Sie das Ergebnis, wenn Sie ein 3D-Mesh-Netzwerk für einen Schatten verwenden:

Abbildung 12: Schattenimplementierung in der Armies-Technologiedemo

Lichtinformationen direkt auf Texturen übertragen

Wenn Sie einen Teil des Farbtons als Texturen malen, reduzieren Sie den Rechenaufwand für zusätzliche Lichter. Dadurch wird beim Verankern der Beleuchtung Arbeitsspeicher gespart, da weniger Lightmap-Daten benötigt werden.

Lichtsonden

Wenn Sie dynamische Objekte mit verankerter Beleuchtung verwenden, werden sie von den Lightmaps nicht beeinflusst. Dadurch haben sie möglicherweise das Gefühl, nicht Teil der Szene zu sein.

Sie können dies mit Lichtsonden lösen. Lichtsonden haben ähnliche Vorteile wie Lightmaps. Sie speichern wenig Daten, die im Voraus berechnet und zur Verwendung während der Laufzeit gespeichert werden können. Dadurch fällt ein Großteil der Rechenkosten für die Bearbeitungszeit auf.

Während eine Lightmap das in einem Texel aufgenommene Licht für Oberflächen codiert, speichert eine Lichtsonde das Licht, das durch den leeren Raum fällt. Sie können diese Daten nutzen, um sich bewegende Objekte auszuleuchten. Mit Lichtsonden können Sie dynamische Objekte visuell mit Lightmap-Objekten in Ihrer Szene verknüpfen.

Lichtsonden eignen sich am besten zum Aufleuchten von Objekten, die sich in deiner Szene bewegen. Die Sonden nutzen Ihre verankerten Lichter, damit Ihre sich bewegenden Objekte das gleiche Licht wie die Szene haben. Das Ausleuchten dynamischer Objekte mit Lichtsonden ist kostengünstiger als das Licht mit Echtzeitbeleuchtung.

Weitere Informationen finden Sie auf den Seiten Statische Beleuchtung mit Lichtsonden und Lichtsonden.

Abbildung 13: Lichtsonden, die das dynamische Publikum in der technischen Demo der Armee beleuchten.

Einstellungen für den Mesh-Renderer

Unabhängig von der Lichtart in der Szene ist es wichtig, dass die Einstellungen für den Mesh-Renderer korrekt sind.

Deaktivieren Sie alles, was Sie nicht verwenden. Einstellungen wie Schatten streamen verursachen Kosten, wenn Sie die Szene auch dann rendern, wenn das Objekt nicht beleuchtet ist. Das folgende Beispiel der Mesh Renderer-Einstellungen bezieht sich auf ein in Abbildung 13 dargestelltes Zeichen. Die Figur verwendet Daten von Lichtsonden, aber keine Reflexionssonden.

Mit der Einstellung Mischproben für Lichtsonden werden Lichtinformationen von den nächstgelegenen Lichtsonden mit der Figur kombiniert. Während sich die Figur in der Szene bewegt, ändern sich die Lichtsonden, die die Figur beeinflussen. Cast Shadows ist deaktiviert, da für das Rendering die Blob-Methode verwendet wird. Schatten empfangen ist ebenfalls deaktiviert, da die Szene verankert ist und keine Echtzeitschatten vorliegen.

Abbildung 14: Mesh-Renderer-Einstellungen für das Rendering von Abbildung 13

Licht- und Lichtarten in Echtzeit

Wir empfehlen, das Licht mit verankerter Beleuchtung, Lichtsonden und gefälschten Lichttechniken wie bemalten Lichttexturen oder Shader-Material-Effekten zu behandeln. Wenn Sie jedoch Echtzeitlicht benötigen, müssen Sie den zu verwendenden Lichttyp berücksichtigen.

Für jede Leuchte fallen unterschiedliche Kosten für die Berechnung der Beleuchtung an. In der folgenden Liste sind die einzelnen Lampentypen aufgeführt:

  • Richtung:Das Licht hat eine gleichmäßige Richtung und fällt nicht ab. Richtlicht ist das günstigste Echtzeitlicht. Häufig ist nur eine Richtung pro Szene erforderlich. Beim Vorwärts-Rendering, dem vorgeschlagenen Renderingpfad für Mobilgeräte, fügt Unity ein standardmäßiges Richtungslicht ein, wenn es in der Szene keine Richtungslichter gibt.
  • Spot:Der Spot-Licht blendet Objekte außerhalb ihres Kegels aus und beleuchtet sie nicht. Dies macht Spot-Beleuchtung rechenintensiver als solche mit sphärischen Zugangspunkten. Die beste Leistung wird erzielt, wenn die Kegelbreite eng gefasst ist und nur die gewünschten Objekte ausgewählt werden.
  • Punkt:Diese strahlen Licht in alle Richtungen aus. Licht in alle Richtungen ist hilfreich, aber auch sehr teuer. Punktleuchten sind in einer ganzen Region teuer. Darüber hinaus kann die Schattenberechnung der teuerste Teil der Beleuchtung sein. Wenn Sie Licht in alle Richtungen werfen, gibt es mehr Schatten und mehr Berechnungen.