Engine & platform

Experimentieren mit Shader Graph: Mit weniger mehr erreichen

RINALDO TJAN / UNITY TECHNOLOGIESContributor
Feb 25, 2021|12 Min.
Experimentieren mit Shader Graph: Mit weniger mehr erreichen
Diese Website wurde aus praktischen Gründen für Sie maschinell übersetzt. Die Richtigkeit und Zuverlässigkeit des übersetzten Inhalts kann von uns nicht gewährleistet werden. Sollten Sie Zweifel an der Richtigkeit des übersetzten Inhalts haben, schauen Sie sich bitte die offizielle englische Version der Website an.

Sie können die Laufzeiteffizienz Ihres Shaders verbessern, ohne die Qualität Ihrer Grafiken zu beeinträchtigen, indem Sie die Materialinformationen für das physikalisch basierte Rendering (PBR) in eine einzige Texturkarte packen und in einen kompakten Shader einfügen. Sehen Sie sich dieses Experiment an.

Dieses Experiment funktioniert sowohl mit der Universal Render Pipeline (URP) als auch mit der High Definition Render Pipeline (HDRP). Um diesen Artikel optimal nutzen zu können, sollten Sie mit Shader Graph bereits vertraut sein. Wenn Sie Shader Graph noch nicht kennen, finden Sie in unseren Ressourcen eine Einführung und weitere Details zu diesem Tool für die visuelle Erstellung von Shadern.

Bei der Arbeit mit Kunstobjekten in einer terrainähnlichen Umgebung werden in der Regel mehrere Ebenen von kachelbarem Material bevorzugt, da sie bessere Überblendungsergebnisse liefern. Die Kosten für die GPU-Leistung, die durch mehrere Textursamples und die Zunahme des Speicherbedarfs mit jeder zum Shader hinzugefügten Ebene entstehen, können jedoch für einige Geräte unerschwinglich und im Allgemeinen ineffizient sein.

Mit diesem Experiment wollte ich Folgendes erreichen:

  • Mit weniger mehr erreichen
  • Minimierung des Speicherbedarfs und sparsamer Umgang mit Textursampling bei der Darstellung eines PBR-Materials
  • Shader-Anweisungen minimieren
  • Ebenenüberblendung mit minimalen Splat Map/Vertex-Farbkanälen durchführen
  • Erweitern Sie die Funktionalität der Splat-Map/Vertex-Farbe für zusätzlichen Schnickschnack

Das Experiment hat zwar seine Ziele erreicht, ist aber mit einigen Vorbehalten behaftet. Sie müssen Ihre Prioritäten entsprechend den Anforderungen Ihres eigenen Projekts setzen und entscheiden, welche Kompromisse für Sie akzeptabel sind.

1. Einzelnes texturverpacktes PBR-Material

Vor der Schichtung müssen Sie zunächst herausfinden, wie das PKR-Material verpackt sein muss. Bei PBR-Materialien sind in der Regel die Parameter für Albedo (BaseColor), Smoothness-Maske, Ambient Occlusion, Metalness und Normal definiert.

Normalerweise werden alle fünf Karten in drei Texturkarten dargestellt. Um die Verwendung von Texturen zu minimieren, habe ich beschlossen, für dieses Experiment auf Metalness und Ambient Occlusion zu verzichten.

Die übrigen Maps - Albedo, Glätte und Normalendefinition - werden üblicherweise durch mindestens zwei Texture Maps dargestellt. Um sie auf eine einzige Karte zu reduzieren, muss jeder einzelne Kanal vorverarbeitet werden.

PBR-Material mit Texturen gepackt

Das Endergebnis des PBR-Materials ist in eine einzige Textur gepackt. Rot = dHdu (Abgeleitete Höhe relativ zur U-Richtung) für die normale Definition#. Grün = dHdv (Ableitungen Höhe relativ zur V-Richtung) für Normale Definition#. Blau = Lineare Graustufenschattierung, die die Albedo darstellt (im Shader rekonstruierte Farbe). Alpha = Lineare Glättungskarte (Standard-Glättungskarte). Anmerkung: Die Textur wird in Unity mit deaktiviertem sRGB und im BC7-Format komprimiert importiert. Wenn Sie auf andere Plattformen portieren, wechseln Sie zum entsprechenden 4-Kanal-Texturformat, das von der Plattform unterstützt wird.

Bearbeitung der Karten

Albedo

Albedo wird normalerweise als RGB-Textur definiert; viele geländeähnliche Materialien (Fels, Sand, Schlamm, Gras usw.) bestehen jedoch aus einer begrenzten Farbpalette. Sie können diese Eigenschaft ausnutzen, indem Sie Albedo als Graustufenverlauf speichern und ihn dann im Shader farblich neu zuordnen.

Für die Umwandlung der RGB-Albedo in einen Graustufenverlauf gibt es keine feste Methode. Für dieses Experiment wurde die Graustufen-Albedo durch selektives Maskieren der ursprünglichen Albedo-Map-Kanäle und Ambient Occlusion erstellt; um die hervorstechende Farbe in der Shader-Farbrekonstruktion abzustimmen, müssen Sie nur die manuellen Anpassungen im Auge behalten.

Helle und dunkle Färbung mit Rampenkontrasteinstellung für die Albedo-Rekonstruktion.

Glattheit

Die Glätte wird als sehr wichtig für die Definition von PBR-Materialien angesehen. Um die Glätte genauer zu definieren, hat sie ihren eigenen Kanal.

Ein einfacher Multiplikator wurde der Glätte im Shader hinzugefügt, um eine gewisse Variation im Material zu erreichen.

Glättungsmultiplikator

Normale Definition

Die Normalenkarte ist wichtig für die Darstellung der detaillierten Eigenschaften einer Oberfläche. Ein typisches PBR-Material verwendet eine Tangential Space Normal Map. In diesem Experiment wählte ich aus den folgenden Gründen eine vorkonvertierte Ableitungskarte mit einem Oberflächengradientengerüst. (Weitere Informationen finden Sie imRahmen von MortensenMikkelsen's surface gradient framework ).

Verwenden Sie diese Photoshop-Aktion, um Normal Maps für den Tangentenraum in Ableitungen vorzukonvertieren.

Die Verwendung einer vorkonvertierten Derivate-Karte hat mehrere Vorteile:

  • Kann direkt in einen Oberflächengradienten umgewandelt werden, wobei weniger Anweisungen benötigt werden als bei einer Standard-Tangentenraum-Normalkarte, die eine Derivatkonvertierung im Shader erfordert.
  • Kann in zwei Kanälen (dHdu und dHdv) gespeichert werden, was zu einem geringeren Speicher- und Textur-Cache-Footprint zur Laufzeit führt
  • Erfordert keine Rekonstruktion des blauen Kanals im Shader, was typisch für die Verarbeitung von Normalen im Tangentenraum ist, da das Oberflächengradienten-Framework die Rekonstruktion der Normalen übernimmt (weniger Shader-Anweisungen)
  • Funktioniert korrekt, wenn es in Photoshop angepasst wird - d. h. durch Überblenden, Maskieren oder Reduzieren der Intensität - und erfordert keine Renormierung. Um zum Beispiel die Intensität zu reduzieren, mischen Sie die Karte einfach mit RGB(128,128,0).

In Verbindung mit dem Rahmenwerk für Oberflächengradienten sind weitere Vorteile zu nennen:

  • Normale Bump-Informationen können im Shader auf die gleiche Weise überblendet und zusammengesetzt werden wie Albedo-Blend/Composite, mit dem richtigen Ergebnis.
  • Das Erhöhen, Verringern und Rückgängigmachen von Beulenbeiträgen ist trivial und genau.

Aber auch vorkonvertierte Ableitungen aus der Tangentenraum-Normalkarte haben einige Nachteile:

  • Bei der Photoshop-Konvertierung wird die Normaldefinition in einem Winkel von mehr als 45 Grad geklemmt, um die Präzision einer 8-Bit-Textur auszugleichen.
  • Künstler sind es gewohnt, mit Normal Maps im Tangentenraum zu arbeiten, und benötigen die Maps als Teil ihres Arbeitsablaufs zur Vorkonvertierung in Photoshop.

Anmerkung: Das Einspannen in einem Winkel von mehr als 45 Grad gilt nicht für Shader-basierte Ableitungskonvertierungen.

Je nach Anwendungsfall kann sich die Einschränkung mehr oder weniger stark auswirken. Bei diesem Versuch hat eine normale Richtung von weniger als 45 Grad keine nennenswerten negativen Auswirkungen auf das Endergebnis. In diesem Fall ist es sogar von Vorteil, da es unerwünschte Reflexionen aus der extremen Normalrichtung reduziert.

Ein Vergleich zwischen einer vorkonvertierten Derivatkarten-Textur und einer Tangentenraum-Normalkartentextur.
Stresstest-Unterschiede zwischen vorkonvertierten Ableitungen und der Tangentenraum-Normalkarte. Beachten Sie, dass der sphärische Bump aufgrund der 45-Grad-Klemmung in der vorkonvertierten Ableitungskarte einige Artefakte aufweist.
Grafik
Grafik
Grafik

Der vollständige Auspackvorgang

Grafik

Der komplette Sub-Graph zum Entpacken der Compact PBR-Textur zur Ausgabe von farbigem Albedo, Glätte und Oberflächengradient.

Anmerkung: Die Konvertierung des Oberflächenverlaufs in Normal erfolgt außerhalb des Subgraphen, so dass das Material auf der Grundlage der Ausgabe des UnpackedSubGraphs einfach überblendet werden kann.

Materialien
Materialien
2. Schichtung des Materials

Für dieses Experiment wählte ich eine auf Ebenen basierende Überlagerungsmethode auf einem einzelnen Kanal. Das Unterdiagramm führt fünf lineare Interpolationen durch (plus die Basis, die sechs Ebenen bildet).

Es gibt viele Möglichkeiten, Ebenengewichte zu mischen. Diese Methode hat die Einfachheit einer einzigen Vektoreingabe, die dem Ziel des Experiments entspricht. Dies ermöglichte viele Überlagerungen, ohne mehrere Kanäle in Splat-Maps oder Vertex-Kanälen zu verbrennen.

Der Nachteil dieser Methode ist, dass Sie das Gewicht des Beitrags einer einzelnen Schicht nicht kontrollieren können. Die Überblendung wird immer ein Übergang von der vorherigen Ebene sein. Je nach Anwendungsfall kann dies ein einschränkender Faktor im Vergleich zu einer herkömmlichen kanalweisen Mischung sein.

Grafik

Die Untergrafik, um einen einzelnen Kanal neu zuzuordnen, um die sechs Ebenen darzustellen.

Das oben gezeigte Unterdiagramm ist für sechs Ebenen des tierbasierten Blending vordefiniert. Um mehr Ebenen zu erstellen, teilen Sie 1 durch die gewünschte Anzahl der überblendeten Ebenen, ziehen Sie 1 ab und ordnen Sie dann jede Ebene basierend auf diesem Wertebereich neu zu.

Bei einem neunschichtigen Mischungsmaterial beträgt der Bereich für die Neuzuordnung jeder Schicht beispielsweise 1/(9-1) = 0,125.

Beachten Sie, dass sich der Schattierungsbereich verringert, wenn Sie den einzelnen Kanal in kleinere Teile unterteilen.

Schichtung
Grafik
Materialien
3. Erweiterung der Funktionalität des Materials

Für die Ebenenüberblendung ist nur ein einziger Kanal erforderlich (der rote Scheitelpunktkanal). Die übrigen drei Scheitelpunktkanäle bieten zusätzliche Funktionen. Der endgültige Shader-Graph erzeugt Ergebnisse unter Verwendung der verbleibenden Vertex-Kanäle.

In diesem Experiment wurde die Vertex-Malerei im Unity-Editor mit Polybrush (verfügbar im Paketmanager) durchgeführt. Vorgeschlagene Vertex Paint-Farbpalette für diesen Shader.

Rot: Dient zur Gewichtung des Ebenenbeitrags. Demo zum Malen eines roten Vertex-Kanals

Grün: Legt die Eigenschaft des Oberflächenverlaufs fest, um den Beitrag der normalen Unebenheiten zu spiegeln, zu reduzieren oder hinzuzufügen (auf -1 und 1 umgestellt).

  • 0 kehrt die normale Beule um (-1)
  • Der Wert 0,5 hebt die normale Bodenwelle auf (0).
  • 1 setzt den normalen Bump auf den ursprünglichen Wert (+1).

Demo zum Malen eines grünen Vertex-Kanals

Blau: Steuert die Glätte und die Skala des Oberflächenverlaufs, um einen nassen Wasser-Look zu erzeugen

  • 0 = keine Änderung
  • 255 = maximale Glättung und flache Normal Map (nasses Aussehen)

Demo zum Malen eines blauen Vertex-Kanals

Alpha: Steuert die Gewichtung der Albedo-Ebene, wobei die Grundfarbe auf Weiß gesetzt wird und der Beitrag auf der y-Achse der Oberflächennormale basiert. Sie verändert die Glätte nicht und nutzt die ursprüngliche Glätte der Oberflächenschicht und die Eigenschaft der Unebenheiten.

  • 0 = kein Schnee
  • 255 = fester Schnee

Alpha-Vertex-Kanal-Malerei in Kombination mit den vorherigen Kanälen, um zu zeigen, wie die einzelnen Ebenen mit dem Schnee interagieren

Die kombinierten Ergebnisse der verschiedenen Scheitelpunkt-Malkanäle:

Sie können die Shader-Blending-Methode und die Einstellungen für die verschiedenen Vertex-Kanal-/Splat-Map-Funktionen entsprechend den Anforderungen Ihres Projekts anpassen.

4. Vergleich der Leistung

Ziel dieses Experiments war es, die Funktionalität des Shader Graphs zu erweitern und gleichzeitig die Ressourcen zu minimieren. Die Textur wurde vorverarbeitet und entpackt, aber lohnt sich das in Bezug auf die Laufzeiteffizienz?

Das Leistungsprofil zeigt, welche Effizienzgewinne durch diese Bemühungen erzielt wurden.

Zum Vergleich mit dem kompakten sechsschichtigen Blend-Shader wurde ein standardmäßiger sechsschichtiger Blend-Shader erstellt. Beide Shader wurden mit einer identischen Überblendmethode mit den gleichen Funktionen erstellt. Der Hauptunterschied besteht darin, dass der Standard-Shader drei verschiedene Texturen verwendet, um eine einzige Ebene darzustellen.

Für das Profiling wurde ein einzelnes Mesh mit Blend-Material auf dem Bildschirm gerendert, wobei die Universal Render Pipeline der Zielplattform verwendet wurde.

Mobiler Speicher und Leistungsprofil

Texturkomprimierung für Mobiltelefone (Android):

Standard PBR mit Albedo, Maske und Normal Map bei 1024x1024 für Mobile:

  • 6x Albedo-Karte ASTC 10x10 = 6x 222.4 KB
  • 6x Maskenkarte ASTC 8x8 = 6x 341.4 KB
  • 6x normale Karte ASTC 8x8 = 6x 341.4 KB

Gesamter Texturspeicherverbrauch 5.431 MB

Kompaktes PBR bei 1024x1024 für Mobilgeräte:

  • 6x PackedPBR Texture ASTC 8x8 = 6x 341.4 KB

Gesamter Texturspeicherverbrauch 2.048 MB

Mit dem kompakten sechsschichtigen Material gibt es etwa 62% weniger Texturspeicherverbrauch auf Mobile (Android), Einsparungen von mehr als der Hälfte. Mobiles Android/Vulkan mit Adreno 630 (Snapdragon 845); Snapdragon-Profilergebnisse:

  • Etwa 70 % weniger Texturspeicher, der während der Laufzeit gelesen wird.
  • Standard benötigte 9971020 Uhren zum Rendern.
  • Compact benötigte 6951439 Uhren zum Rendern.

Kompaktes Material wird auf dem Bildschirm etwa 30 % schneller dargestellt. Profiling-Ergebnis vom Snapdragon Profiler.

PC-Speicher und Leistungsprofil

Standard PBR mit Albedo, Maske und Normal Map bei 1024x1024:

  • 6x Albedo-Karte DTX1 = 6x 0,7 MB
  • 6x Maskenkarte DXT5/BC7 = 6x 1,3 MB
  • 6x Normal Map DXT5/BC7 = 6x 1,3 MB Gesamter Texturspeicherverbrauch 19,8 MB

Kompaktes PBR bei 1024x1024:

  • 6x PackedPBR Texture BC7 = 6x 1.3 MB

Gesamter Texturspeicherverbrauch 7,8 MB

Das kompakte sechsschichtige Material verbraucht 60 % weniger Texturspeicher auf dem PC (Einsparungen von mehr als der Hälfte).

PC-Laptop mit Radeon 460 Pro, gerendert bei 2880x1800; RenderDoc-Profilergebnisse:

  • Zeichnen Sie Opaques für die Standard-6-Lagen-Mischung: 5,186 ms.
  • Draw Opaques für kompakte 6-Schicht-Mischung: 3,632 ms. Kompaktes Material wird auf dem Bildschirm etwa 30 %* schneller gerendert. *Der Wert des RenderDoc-Profils schwankt; 30 % ist ein Durchschnittswert von Beispielen.

PC-Desktop mit nVidia GTX 1080 Rendering bei 2560x1440; nSight-Profilergebnisse:

  • Render Opaques für 6-lagiges Standardmaterial: 0,87 ms
  • Render Opaques für kompaktes 6-lagiges Material: 0,48 ms

Kompaktes Material wird auf dem Bildschirm etwa 45 % schneller dargestellt. Profiling-Ergebnisse von nSight.

Leistungsprofil der Konsole

Auf der PlayStation 4 führt die Verwendung von kompaktem Material zu einer Speichereinsparung von 60 %, was identisch mit der PC-Version ist, da die PS4 die gleiche Komprimierung verwendet.

PS4 Basis-Rendering bei 1920x 1080; Razer-Profilergebnisse:

  • Render Opaques für 6-lagiges Standardmaterial: 2,11 ms
  • Render Opaques für kompaktes 6-lagiges Material: 1,59 ms

Kompaktes Material wird auf dem Bildschirm etwa 24,5 % schneller dargestellt.

Profiling-Ergebnis vom PS4 Razor Profiler.

Zusammenfassend lässt sich sagen, dass die Verwendung eines kompakten PBR-Shaders mit sechs Ebenen einen Leistungsgewinn und erhebliche Speichereinsparungen ermöglicht. Die Unterschiede in der GPU-Leistung sind interessant, aber zu erwarten, da das Auspacken des Materials mehr ALUs verbraucht als das Abtasten mehrerer Texturen.

Laden Sie das Beispielprojekt herunter

Dieses Beispielprojekt mit Shader-Grafiken und Untergrafiken kann hier heruntergeladen werden:

[DOWNLOAD HIER], Unity 2020.2.5f1 mit HDRP 10.3.1

[HIER HERUNTERLADEN], Unity 2020.2.5f1 mit URP 10.3.1

[HIER HERUNTERLADEN], Photoshop-Aktion zur Vorkonvertierung von Tangentenraum-Normalkarten in Ableitungen.

Zum Mitnehmen

Screenshot aus der Universal Render Pipeline-Version des Projekts.

Die wichtigsten Bestandteile dieses Experiments sind:

  • Shader Graph für benutzerdefiniertes Material
  • Vorkonvertierte Derivate
  • Rahmen für Oberflächengradienten
  • Albedo-Farbrekonstruktion
  • Überblendung von Ein-Kanal-Ebenen
  • UpVector-Überblendtechnik, Glätte- und Unebenheitskontrolle über Vertexkanalüberblendung

Dieses Experiment zeigt, wie Sie mit Shader Graph schöne und gleichzeitig effiziente Grafiken erstellen können. Wir hoffen, dass dieses Beispiel Künstler und Entwickler dazu inspirieren kann, die ästhetischen Grenzen ihrer Unity-Projekte zu erweitern.

Über den Autor

Rinaldo Tjan (Technical Art Director, R&D, Spotlight Team) ist ein Echtzeit-3D-Künstler mit einer großen Leidenschaft für Echtzeit-Beleuchtungs- und Rendering-Systeme.

Er begann seine Karriere in den Tagen der PlayStation 2 und verfügt über mehr als ein Jahrzehnt an Wissen über einen durchgängigen Künstler-Workflow, von der Texturierung bis zur Erstellung der fertigen gerenderten Szene. Bevor er zu Unity Technologies kam, half er bei der Entwicklung von AAA-Spielen wie BioShock 2, The Bureau: XCOM Declassified, und Mafia III.

Derzeit arbeitet er mit Unity-Kunden zusammen, um ihnen zu helfen, ihre Projekte zu erweitern und ihr wahres Potenzial mit Unity auszuschöpfen. Gleichzeitig hilft er dabei, die interne Entwicklung und die Standards der Unity-Rendering-Funktionen voranzutreiben.