Mit Materialfunktionen kannst du Teile eines Materialdiagramms in ein wiederverwendbares Asset packen, das du in einer Bibliothek freigeben und auf einfache Weise in anderen Materialien einfügen kannst. Ihr Zweck ist das Streamlining der Materialerstellung, indem sofort Zugang zu gemeinsam verwendeten Netzwerken von Materialknoten gewährt wird.
Zum Beispiel enthält die nachfolgend gezeigte Funktion Blend_Overlay das gesamte auf der rechten Seite des Bildes gezeigte Materialausdrucksnetzwerk. Anstatt dieses Knotennetzwerk immer wieder zu konstruieren, kannst du es aus der Materialfunktionsbibliothek direkt in dein Diagramm einfügen.
Funktionen werden wie normale Materialen im Material-Editor bearbeitet, allerdings mit einigen Einschränkungen bei den Knoten, die du verwenden kannst. Wenn sie ordnungsgemäß verwendet werden, können sie Materialredundanz reduzieren, was wiederum den Wartungsaufwand des Künstlers reduziert. Materialfunktionen halten doppelte Ausdrücke synchron und verhindern so die unvermeidlichen Fehler, die entstehen, wenn bei einer Änderung ein Duplikat übersehen wird.
Materialfunktionen sind im Inhaltsbrowser eine eindeutige Asset-Klasse. Ihre Diagramme sind den der Materialien ähnlich, unterscheiden sich aber in einem wichtigen Punkt. Anstatt eines Knotens vom Typ „Hauptmaterial" besitzen Materialfunktionen Knoten vom Typ „FunctionOutput", die als Output-Pins auf dem endgültigen Knoten vom Typ „Materialfunktion" angezeigt werden, wenn sie ein einem Material verwendet werden.
Es kann hilfreich sein, sich eine Materialfunktion wie ein Gehäuse für ein Elektronikprojekt vorzustellen. Du kannst so viele Inputs und Outputs hinzufügen, wie du für nötig hälst. Der Hauptteil der Funktion ist das Netzwerk des materiellen Ausdrucks zwischen diesen Inputs und Outputs. Dieses Beispiel nimmt zwei Ebenen und mischt sie wie in einer Bildschirmmischung in Photoshop Die Funktion abstrahiert die Details von einem Künstler, so dass er die Mathematik einer Bildschirmüberblendung nicht kennen muss, um eine Bildschirmüberblendungsoperation zu verwenden.
Materialfunktion Input- (1) und Output-Knoten (2).
Wie du oben sehen kannst, ist es dir überlassen, was zwischen dem Input und dem Output geschieht, und wird durch ein beliebiges Netz von Standardknoten vom Typ „Materialausdruck" definiert. Sobald du eine Materialfunktion in ein Material eingefügt hast, siehst du nur den Knoten vom Typ „Materialfunktionsaufruf" mit seinen Inputs und Outputs. Der Rest des Diagramms ist in der Funktion ausgeblendet.
Materialfunktionsbibliothek
Wenn deine Materialfunktion fertiggestellt ist, kannst du sie für den einfachen Zugriff während der Materialerstellung in der Materialfunktionsbibliothek veröffentlichen. Die Materialfunktionsbibliothek befindet such in der Palette auf der rechten Seite des Material-Editors. Die Palette enthält eine kategorisierte und filterbare Liste von verfügbaren Materialfunktionen. Diese Liste wird aus den geladenen Funktionen befüllt, aber auch aus allen Materialfunktionen, die sich in der Inhaltsbrowserdatenbank befinden.
Du kannst den Mauszeiger über diese Einträge bewegen, um ihre Beschreibung als Tooltip zu sehen oder einen per Drag & Drop in dein Material einfügen.
Damit eine Materialfunktion in der Materialfunktionsbibliothek erscheint, muss ihre Eigenschaft In Bibliothek veröffentlichen markiert sein. Wähle im Materialfunktions-Editor alle Knoten ab, indem du im Diagramm in einen leeren Bereich klickst, um die Basiseigenschaften der Materialfunktion anzuzeigen. Die Option In Bibliothek veröffentlichen befindet sich im Detail-Panel.
Eine vollständige Auflistung der standardmäßig in der Materialfunktionsbibliothek vorhandenen Funktionen findest du in Referenz der Materialausdrücke.
Funktionsbezogene Knoten
Nachfolgend siehst du die Knoten vom Typ „Materialausdruck", die sich auf Materialfunktionen beziehen, zusammen mit ihren Zweck:
- MaterialFunctionCall – Ermöglicht die Verwendung einer externen Funktion aus einem anderen Material oder aus einer anderen Funktion. Die Input- und Output-Knoten der externen Funktion werden zu Inputs und Outputs des Knotens vom Typ „Funktionsaufruf"
- FunctionInput – Kann nur in einer Materialfunktion platziert werden, wo er einen der Input-Pins der Funktion definiert.
- FunctionOutput – Kann nur in einer Materialfunktion platziert werden, wo er einen der Output-Pins der Funktion definiert.
- TextureObject – Nützlich zum Bereitstellen einer Standardtextur für den Input einer Texturfunktion innerhalb einer Funktion. Dieser Knoten tastet die Textur nicht wirklich ab, somit muss er zusammen mit einem Knoten vom Typ „TextureSample" verwendet werden.
- TextureObjectParameter – Definiert einen Texturparameter und gibt das Texturobjekt aus, das in Materialien verwendet wird, die eine Funktion mit Textureingaben aufrufen. Dieser Knoten tastet die Textur nicht wirklich ab, somit muss er zusammen mit einem Knoten vom Typ „TextureSample" verwendet werden.
- StaticSwitch – Führt eine Kompilierzeitauswahl zwischen zwei Inputs basierend auf dem Input-Wert durch.
- StaticBool – Nützlich zum Bereitstellen eines booleschen Standardwerts für den Input einer booleschen Funktion innerhalb einer Funktion. Dieser Knoten schaltet zwischen nichts um, somit muss er zusammen mit einem Knoten vom Typ „StaticSwitch" verwendet werden.
- StaticBoolParameter – Definiert einen statischen booleschen Parameter und gibt den statischen booleschen Wert aus, der in Materialien verwendet wird, die eine Funktion mit statischen booleschen Inputs aufrufen. Dieser Knoten schaltet zwischen nichts um, somit muss er zusammen mit einem Knoten vom Typ „StaticSwitch" verwendet werden.
Input und Output
Da Materialfunktionen gekapselte Netzwerke aus Knoten sind, muss der Nutzer dafür sorgen, dass die Daten in sie und aus ihnen fließen können. Dies wird über die Knoten FunctionInput und FunctionOutput gehandhabt. Das Verstehen dieser Knoten ist für die Verwendung von Materialfunktionen von entscheidender Bedeutung.
Innerhalb der Materialfunktion selbst erscheinen die Knoten „FunctionInput" und „FunctionOutput" so:
Wenn die Materialfunktion in einem Material verwendet wird, erscheinen die Knoten FunctionInput und FunctionOutput als Input- und Output-Pins auf dem Knoten vom Typ „Materialfunktion":
Knoten vom Typ „FunctionInput"
Wie bereits erwähnt, dienen Knoten vom Typ FunctionInput als das Gateway, durch das Daten in eine Materialfunktion gelangen. Eine bestimmte Funktion kann eine beliebige Anzahl dieser Input-Knoten besitzen, wobei jeder einem Input-Pin auf dem Knoten vom Typ „Funktionsaufruf" entspricht.
Knoten vom Typ „FunctionInput" besitzen die folgenden Eigenschaften und Daten-Pins:
| Element | Beschreibung |
|---|---|
| Eigenschaften | |
| Input-Name | Der Name des Inputs, der in der Materialfunktion als Output-Pin sichtbar ist, wenn sie innerhalb eines Materials verwendet wird. |
| **Beschreibung | Eine Beschreibung des Inputs, die als Tooltip sichtbar wird, wenn du den Mauszeiger über den entsprechenden Input-Pin auf dem Knoten vom Typ „Materialfunktion" bewegst. |
| **Input-Typ | Dies definiert, welchen Datentyp der Input akzeptiert. Siehe Input-Typen unten. |
| Vorschauwert | Dies dient als Mittel zum Testen und zur Veranschaulichung der Funktion während der Konstruktion. Jeder hier eingegebene Wert wird verwendet, als würde er von einem Input außerhalb der Funktion übergeben. |
| Vorschauwert als Standard verwenden | Mit diesem Kontrollkästchen können die im Vorschaubild eingestellten Daten als Standardwert verwendet werden. Dies ist nützlich, wenn du den Nutzer nicht zwingen möchtest, für diesen Wert eine Eingabe in die Funktion zu machen. |
| Sortierpriorität | Diese Zahl wird verwendet, um die Reihenfolge zu steuern, in der die Input-Pins auf dem Knoten vom Typ „Materialfunktion" angezeigt werden. Die Reihenfolge ist vom Niedrigsten zum Höchsten. |
| Input-Pins | |
| Vorschau | Daten, die diesem Input übergeben werden, ersetzen die Eigenschaft „Vorschauwert". Wie die zugehörige Eigenschaft ist auch diese nützlich, um die Funktion während der Konstruktion zu testen und Standardwerte festzulegen. |
| Output-Pins | |
| (Unbeschriftet) | Dies stellt den Output für die eingehenden Daten bereit, die von der Funktion verarbeitet werden. |
Knoten vom Typ „FunctionOutput"
Ein Knoten vom Typ „FunctionOutput" ist das Mittel, mit dem Daten innerhalb einer Materialfunktion die Funktion zur weiteren Verwendung in einem Material verlassen. Mit anderen Worten, er gibt das endgültige Ergebnis der Materialfunktion aus. Wie bei Knoten vom Typ „FunctionInput" kann eine Funktion eine beliebige Anzahl von Output-Knoten besitzen, was zu einer beliebigen Zahl von potenziellen Output-Pins führt.
Wenn ein Knoten vom Typ FunctionOutput ausgewählt wird, sind folgende Eigenschaften im Detail-Panel zugänglich.
| Element | Beschreibung |
|---|---|
| Output der Materialausdrucksfunktion | |
| Output-Name | Der Name des Outputs, der in der Materialfunktion als Output-Pin sichtbar ist, wenn sie innerhalb eines Materials verwendet wird. |
| **Beschreibung | Eine Beschreibung des Outputs, der als Tooltip angezeigt wird, wenn du den Mauszeiger über den entsprechenden Output-Pin auf dem Knoten vom Typ „Materialfunktion" bewegst. |
| Materialausdruck | |
| Sortierpriorität | Diese Zahl wird verwendet, um die Reihenfolge zu steuern, in der die Output-Pins auf dem Knoten vom Typ „Materialfunktion" angezeigt werden. Die Reihenfolge ist vom Niedrigsten zum Höchsten. |
| Beschreibung | Dieses Beschreibungsfeld definiert den Text in der Kommentarblase des Knotens. Dies ist nur innerhalb des Materialfunktions-Editors sichtbar. |
| Output-Pins | |
| (Unbeschriftet) | Dies stellt den Output für die eingehenden Daten bereit, die von der Funktion verarbeitet werden. |
Input-Typen
Inputs besitzen einen spezifizierten Typ, der für alle mit ihnen verbundenen Ausdrücke erforderlich ist. Um den Input-Typ festzulegen, wählst du im Materialfunktions-Editor einen Knoten vom Typ FunctionInput aus und verwendest die Dropdown-Liste Input-Typ, um eine Option auszuwählen.
Wenn der Input-Typ in einem Material aufgerufen wird, wird er neben den Input-Verbindern in gekürzter Form angezeigt. In diesem Fall sind beide Inputs vom Typ „Vector3" und somit wird V3 angezeigt. Alles, was in einem Material an einen Input angeschlossen wird, muss in den richtigen Input-Typ konvertiert werden, sonst erhältst du einen Fehler.
Nachfolgend findest du die verfügbaren Input-Typen und ihre Abkürzungen:
| Input-Typ | Abkürzung |
|---|---|
| Scalar | S |
| Vector2 | V2 |
| Vector3 | V3 |
| Vector4 | V4 |
| Texture2D | T2D |
| TextureCube | TCube |
| Texture2DArray | T2dArr |
| VolumeTexture | TVol |
| StaticBool | B |
| MaterialAttributes | MA |
| TextureExternal | TExt |
Gemeinsame Eigenschaften
Wenn du während der Bearbeitung einer Materialfunktion alle Knoten abwählst oder in den Hintergrund des Materialdiagramms klickst, werden die Basiseigenschaften der Funktion im Detail-Panel sichtbar.
| Element | Beschreibung |
|---|---|
| Eigenschaften | |
| Beschreibung | Diese Beschreibung wird als Tooltip angezeigt, wenn Nutzer in der Palette den Mauszeiger über die Materialfunktion oder über den Hauptteil des Knotens vom Typ „Funktionsaufruf" im Material-Editor bewegen. |
| In Bibliothek veröffentlichen | Wenn dieses Kontrollkästchen markiert ist, erscheint die Materialfunktion in der Liste der Materialfunktionen in der Palette des Material-Editors, so dass du sie in Materialien einfügen kannst. Du musst möglicherweise den Editor neu starten, damit eine neue Funktion erscheint. |
| Bibliothekskategorien | Dieses Array enthält alle Kategorien des Reiters „Materialfunktionen", unter dem diese Funktion erscheint. |
Vorschau
Beim Bearbeiten einer Materialfunktion zeigt der Vorschau-Viewport, welcher Knoten gerade in der Vorschau angezeigt wird. Du kannst mit der rechten Maustaste auf einen beliebigen Knoten klicken und Knotenvorschau starten wählen, um eine Vorschau der Ergebnisse des Materialnetzwerks bis zu diesem Punkt anzuzeigen.
Meistens möchtest du eine Vorschau des Funktions-Outputs oder das Endergebnis der Materialfunktion sehen. Standardmäßig wird die Vorschau des Output-Knotens der Materialfunktion angezeigt.
Vorschau des Funktions-Input
Knoten vom Typ „Funktions-Input" besitzen einige Optionen zum Festlegen von Vorschauwerten, da sie nicht die Werte kennen, die Künstler im Material verwenden werden. Jeder Input besitzt einen eingebauten Vorschauwert, den du verwenden kannst, um eine Konstante für Float-Input-Typen anzuzeigen. Funktions-Inputs besitzen außerdem den Verbinder „Vorschau", mit dem du deinen eingebauten Wert mit jedem Wert, der dem Input-Typ entspricht, überschreiben kannst. In diesem Beispiel werden Textur-Samples verwendet, um einen Vorschauwert für die beiden Vector3-Inputs bereitzustellen.
Beachte, dass der Input im Detail-Panel die Option Vorschauwert als Standard verwenden besitzt. Wenn diese Option aktiviert ist, wird jedes Mal der Vorschauwert verwendet, wenn die Funktion in einem Material aufgerufen wird und nichts mit dem Input verbunden ist. Der Vorschauwert fungiert als Fallback und verhindert Kompilierungsfehler, wenn nichts mit dem Input verbunden ist. Dadurch wird der Input zu einem optionalen Input und wird daher in Grau gezeichnet.
Parameter
Du kannst Parameter in einer Materialfunktion verwenden, so wie du sie in regulärem Material verwenden würdest. Diese Parameter werden direkt an ein beliebiges Material zur Verwendung übergeben. Bei der Verwendung von Texturparametern gibt es einige leichte Unterschiede.
Texturparameter
Um einen Texturparameter innerhalb einer Materialfunktion zu verwenden, erstellst du einen Knoten vom Typ FunctionInput und änderst den Datentyp auf Texture2D. Verbinde ihn auf einem Knoten vom Typ Textur-Sample mit dem „Überschreiben-Pin" des Texturobjekts.
Wenn du diese Materialfunktion in einem Material verwendest, platzierst du einen Knoten vom Typ TextureObjectParameter und verbindest ihn mit dem Input-Pin Texture2D auf der Materialfunktion.
Statische boolesche Parameter
Erstelle ähnlich wie bei statischen Schaltparameter einen FunctionInput und ändere den Input-Typ auf StaticBool. Verbinde ihn mit einem Knoten vom Typ StaticSwitch:
Platziere In dem Material, das die Funktion verwendet, einen Knoten vom Typ StaticBoolParameter und verbinde ihn mit dem Input, der einen statischen Bool-Wert akzeptiert (in diesem Beispiel Kachelung aktivieren).
Organisation
Materialfunktionen werden häufig von vielen Künstlern und Teamkollegen verwendet, die nicht an der Erstellung der Funktion selbst beteiligt waren. Daher ist es wichtig, eine gute Dokumentation darüber bereitzustellen, was die Funktion bewirkt und welche Werte für ihre Inputs und Outputs erforderlich sind. Aus diesem Grund besitzen Funktionen mehrere Dokumentationsfelder über dem Funktionsnamen und den Input-/Output-Namen:
Funktionsbeschreibung
Materialfunktionen besitzen das Feld Beschreibung, in dem du dokumentieren kannst, was die Funktion bewirkt. Um eine Beschreibung hinzuzufügen, klickst du im Materialdiagramm während der Bearbeitung einer Materialfunktion auf eine leere Fläche. Dadurch werden die Eigenschaften der Funktion im Detail-Panel angezeigt, wo du in dem Feld eine Beschreibung eingeben kannst.
Der Beschreibungstext wird als Tooltip angezeigt, wenn du innerhalb eines Materialdiagramms den Mauszeiger über den Knoten vom Typ „Funktionsaufruf" bewegst.
Beschreibungen zum Input und Output
Du kannst in deiner Materialfunktion den Input- und Output-Pins einen Namen und eine Beschreibung hinzufügen. Wähle beim Bearbeiten einer Materialfunktion einen Input- oder Output-Knoten im Materialdiagramm aus. Fülle im Detail-Panel die Felder Input-Name und Beschreibung aus.
Wenn diese Materialfunktion in einem Material verwendet wird, zeigt jeder Input-Pin den Namen an, den du eingegeben hast und die Beschreibung wird als Tooltip angezeigt, wenn du den Mauszeiger über den Input bewegst.
Wenn du eine Materialfunktion bearbeitest, stehen dir alle Werkzeuge zum Organisieren und Dokumentieren deines Materialdiagramms zur Verfügung. Hier erfährst du mehr über das Organisieren eines Materialdiagramms.
Verteilung
Wenn du eine Materialfunktion bearbeitest und zum erneuten Kompilieren und Anwenden der Änderungen auf die Schaltfläche Speichern klickst, wird die neue Version an alle geladenen Materialien oder Funktionen propagiert, die diese Materialfunktion referenzieren. Alle nicht geladenen Materialien, die die Funktion referenzieren, werden mit den Änderungen aktualisiert, wenn sie das nächste Mal geladen werden.
Wenn ein Input oder Output aus einer Funktion gelöscht wird und die Änderungen propagiert werden, werden alle Links zu diesen gelöschten Verbindungen in Materialien, die diese Funktion verwenden, ungültig! Es ist wichtig, dies zu berücksichtigen, bevor du eine Materialfunktion erneut kompilierst, da die Verteilung nicht rückgängig gemacht werden kann. Je mehr Materialien in einer Funktion verwendet werden, desto größer ist die Gefahr eines Bruchs, seien Sie also vorsichtig.
Alle geladenen Materialien, die die Funktion verwenden, werden als verändert markiert, wenn die Funktionsänderung propagiert wird. Dies kann genutzt werden, um zu sehen, welche Pakete neu gespeichert werden können, um längere Ladezeiten zu vermeiden. Du kannst alle geladenen Materialien finden, die eine Funktion verwenden, indem du mit der rechten Maustaste in den Inhaltsbrowser klickst und Materialien finden, die diese Funktion verwenden wählst.
Verschachteln von Funktionen
Du kannst Materialfunktionen innerhalb anderer Funktionen verschachteln und sie willkürlich verketten. Die einzige Einschränkung ist, dass Materialfunktionen nicht so verschachtelt werden können, dass eine zirkuläre Abhängigkeit entsteht.
Kompilierungsfehler
Wenn Fehler innerhalb einer Materialfunktion vorhanden sind, wird ein Kompilierungsfehlerdialog generiert, wenn du versuchst, das Material zu kompilieren. Es erscheint auch eine rote Fehlermeldung auf der Materialfunktion, die nicht korrekt kompiliert wurde. Du kannst den Mauszeiger über die Fehlermeldung bewegen, um einen Tooltip anzuzeigen, der den Kompilierungsfehler beschreibt. In diesem Beispiel empfängt die Materialfunktion keine Daten an ihren Inputs, wodurch die Kompilierung fehlschlägt
Du kannst die obigen Fehler vermeiden, indem du Vorschauwerte für deine Inputs bereitstellst und dann die Eigenschaft *Vorschauwert als Standard verwenden für jeden Input aktivierst. Diese Praxis kann sich jedoch als zweischneidiges Schwert erweisen, da es keinen offensichtlichen Hinweis (z. B. eine Fehlermeldung) gibt, der dich daran erinnert, dass du einen Input nicht angeschlossen hast.
Standard-Materialfunktionen
Unreal Engine enthält mehrere Dutzend vorgefertigte Standard-Materialfunktionen. Diese sind über die Palette des Material-Editors oder über die Suche des Kontextmenüs zugänglich.
Wenn du eine der Standard-Materialfunktionen bearbeiten möchtest, findest du die Assets im Inhaltsbrowser innerhalb des Ordners Engine > Inhalt > Funktionen.
Wenn Änderungen an einer Standard-Materialfunktion vorgenommen und gespeichert werden, sind diese Änderungen in allen Instanzen der Funktion vorhanden. Aus diesem Grund wird dringend empfohlen, dass du ein Duplikat von Standardfunktionen erstellt, wenn du Änderungen vornehmen möchtest.
Weitere Informationen zu den in Unreal Engine enthaltenen Standard-Materialfunktionen findest du in der Materialfunktionsreferenz.