Material-Graphen
Die Standard-Materialtypen decken das meiste ab, was ein Projekt braucht. Wenn nicht, können Sie ein Material stattdessen als Graph bauen: Knoten verbinden, und der Editor kompiliert daraus einen echten Shader.
Greifen Sie danach, wenn Sie etwas wollen, das ein festes Material nicht ausdrücken kann — eine scrollende Textur, eine Auflösung, ein Hologramm, Wasser, eine Farbe, die sich mit dem Blickwinkel ändert, eine wehende Fahne.
Jeder Knoten mit seinen Ports: Shader-Knoten-Referenz — 95 Knoten.
Die eingebauten Typen sind kein getrenntes System mit angeschraubtem Graphen — standard,
physical, toon und die übrigen sind selbst Punkte in genau diesem Raum. Ein Graph-Material ist
also kein Bürger zweiter Klasse: Es geht denselben Weg, bekommt dieselbe Beleuchtung und
funktioniert auf Mobilgeräten.
Wie ein Graph aufgebaut ist
Ein Graph läuft von Eingängen über Mathematik zu Ausgängen.
| Kategorie | Was dort wohnt |
|---|---|
| input | UVs, die Oberflächennormale, Zeit, Position, Texturen, welche Instanz gezeichnet wird |
| const | feste Zahlen und Farben, die Sie eintippen |
| math | Arithmetik und Kurven auf einzelnen Zahlen |
| vector | Vektoren und Farben bauen, zerlegen, mischen und transformieren |
| light | Beleuchtungsterme, die Sie selbst formen |
| post | Knoten, die das gerenderte Bild abtasten — siehe Bildschirmeffekte |
| output | wie die Oberfläche tatsächlich aussieht |
Die Oberflächenausgänge
Der Ausgabeknoten ist das Ende Ihres Graphen, und seine Eingänge sind die physikalische Beschreibung der Oberfläche:
| Ausgang | Bedeutet |
|---|---|
baseColor | die Farbe der Oberfläche |
metallic | 0 für ein Dielektrikum, 1 für blankes Metall — selten dazwischen |
roughness | 0 spiegelglatt, 1 vollkommen matt |
normal | speisen Sie Ihre eigene Normale ein, um Oberflächendetail zu ergänzen |
emissive | Licht, das die Oberfläche selbst abgibt |
alpha | Transparenz |
clearcoat · clearcoatRoughness | eine Lackschicht obendrauf |
ior · transmission · thickness | Brechung, für Glas und Flüssigkeiten |
Was Sie unverbunden lassen, behält seine Voreinstellung, und der Compiler faltet es weg — ein Ausgang, den Sie nicht benutzen, kostet nichts.
Mit Instanzen arbeiten
Zwei Eingangsknoten gibt es eigens für
instanzierte Objekte: instanceId sagt Ihnen, welche Kopie
gerade gezeichnet wird, und instanceColor gibt deren Tönung.
Speisen Sie instanceId in einen Hash, und jede Kopie bekommt eigene Tönung, Größe oder
Animationsphase — aus einem einzigen Zeichenaufruf. Ein Grasfeld, in dem jeder Halm ein wenig
anders schwankt, kostet genauso viel wie eines, in dem alle gleich schwanken.
Beide lesen an einem gewöhnlichen Mesh vernünftige Voreinstellungen, ein Graph, der sie benutzt, geht also nie kaputt, wenn er ohne Instancing verwendet wird.
Bildschirmeffekte
Ein Graph, der das gerenderte Bild abtastet, ist überhaupt kein Oberflächenmaterial — er ist ein Vollbildeffekt über der ganzen Szene. Farbkorrektur, Vignetten, Unschärfen, Scanlinien.
Die Engine merkt das von selbst: Benutzen Sie einen Knoten, der das Bild liest, wird der Graph zu einem Effekt statt zu etwas, das Sie auf ein Objekt legen. Mehrere Effekte auf einer Szene laufen in der von Ihnen gegebenen Reihenfolge.
Texturen und Farbraum
Ein Texturknoten tastet eine Bildressource ab. Farbbilder werden für Sie dekodiert, damit die Mathematik auf echten Farbwerten arbeitet.
Eine Textur, die Zahlen statt Farbe trägt — eine Roughness Map, eine Maske, eine Height Map — muss als solche markiert sein, sonst wird sie farbkorrigiert und Ihre Werte sind subtil falsch. Das ist die mit Abstand häufigste Ursache für „meine Roughness Map sieht überhaupt nicht so aus, wie sie sollte".
Skripte haben keinen Zugriff auf die Graph-Komponente, Sie können einen Graph-Parameter also nicht aus Code setzen.
Das schränkt weniger ein, als es klingt, denn die beiden Dinge, die man will, sind beide abgedeckt:
| Sie wollen | Tun Sie |
|---|---|
| Etwas, das sich selbst animiert | nehmen Sie den time-Eingang im Graphen — Pulsieren, Scrollen, Schimmern gehören dorthin |
| Etwas, das vom Spielzustand getrieben wird | treiben Sie stattdessen einen gewöhnlichen Materialslot an: Ein Skript kann emissiveIntensity, color, opacity, roughness schreiben |
Ein Leuchtfeuer, das ewig pulsiert, ist also ein Graph, der time liest; ein Leuchtfeuer, das
heller wird, wenn die Spielerin punktet, ist ein Skript, das emissiveIntensity auf ein
Standardmaterial schreibt.
Praktische Ratschläge
Fangen Sie bei einem Preset an. Ein Standardmaterial als Graph zu duplizieren gibt Ihnen einen korrekten, vollständigen Ausgangspunkt. Von einer leeren Fläche aus zu bauen heißt, Beleuchtung neu herzuleiten, die Sie nicht herleiten mussten.
Achten Sie darauf, was Sie hinzufügen. Ein Graph läuft für jedes Pixel, in jedem Bild. Ein Texturzugriff ist billig; eine Schleife nicht. Fällt die Bildrate nach einer Änderung, ist der zuletzt hinzugefügte Knoten der Verdächtige.
Speichern Sie ihn als Ressource, und jedes Objekt, das ihn benutzt, aktualisiert sich auf einmal — was zugleich heißt: eine Stelle zum Korrigieren, wenn der Look nicht stimmt.
Weiter: Partikel — Feuer, Rauch, Funken und Staub.