Texturierung oder was Sie wissen müssen, um ein Oberflächenkünstler zu werden. Teil 5. Materialsystem

In den vorherigen Teilen der Tutorials haben wir uns angesehen, wie Texturen erstellt werden. Genauer gesagt, wie alles unter der Haube aussieht (wie Yoooriii es in den Kommentaren zum 4. Teil formulierte). Es wurden Begriffe eingeführt - Pixel und Texel. Demontierte ein wenig Scan- und Gittermodelle, PBR und Materialien. Und schließlich haben wir eine Linie unter dem Beruf des „Künstlers in Texturen“ gezogen. Es scheint, dass Sie bereits aufhören und mit der Arbeit beginnen können.

Teil 1. Pixel hier .
Teil 2. Masken und Texturen hier .
Teil 3. Züchterrechte und Materialien hier .
Teil 4. Modelle, Normalen und Sweep hier .
Teil 5. Materialsystem - Sie lesen es.

Einführungsblock


In diesem Teil werden wir keine Übung haben, da sich der fünfte Teil als ziemlich groß herausgestellt hat. Alle Informationen zum Erstellen und Anpassen von Materialien in Unreal Engine 4 finden Sie in den Flakky- Tutorials und vielen anderen. Unsere Aufgabe ist es nun, die Theorie so detailliert wie möglich zu analysieren (und wenn Informationen fehlen, lassen Sie es mich bitte wissen).

2017 trat der technische Künstler Harrison Moore beim Unreal Dev Day Montreal auf. Er sprach darüber, welchen Ansatz für die Texturierung er und sein Team verwendeten, um sicherzustellen, dass das Spiel Paragon sehr schöne Materialien hatte. Unten ist ein Link zu seinem Vortrag.


Tatsache ist, dass wir ein VR-Projekt erstellen, bei dem die Qualität der Texturen von großer Bedeutung ist. Beim Erstellen von Texturen für große Objekte (Wände, Böden, große Schränke, Kisten usw.) stießen wir beispielsweise auf die Tatsache, dass die Standardmethode sehr pixelige Texturen ergab, und auf die Fasen, die mit harten Kanten und einer normalen Karte erstellt wurden (wir haben dies aussortiert) 4 Teile) Wenn sich Objekte in der Nähe ihrer Augen befanden, sahen sie so pixelig und elend aus, dass wir die Texturen vergrößern mussten, um dies zu beheben. Um zumindest eine Annäherung an das gewünschte Ergebnis zu erreichen, haben wir letztendlich begonnen, 8k-Texturen zu nieten. Es stellte sich heraus, dass es sehr teuer war, 8k-Texturen auf den großen Hauptobjekten zu erstellen, aber optisch war es zufriedenstellend (maximal).

Bild

Zunächst verlief alles reibungslos. Die Texturen wurden genietet, die Qualität ist normal, aber nachdem wir eine Szene aus Objekten mit solchen Texturen zusammengestellt hatten, stellten wir fest, dass dies nicht funktioniert. Das Volumen der Texturen war sehr groß - damit unser Projekt mit dem Endbenutzer zusammenarbeiten konnte, musste die Grafikkarte mindestens 3 Gigabyte RAM haben. Und die Größe einer solchen Textur betrug 67 Millionen Texel. Trotz der Tatsache, dass es sich bereits um vollständig berechnete und gebackene Texturen handelt, war keine geringe Rechenleistung der Grafikkarte erforderlich, um alle Texel zu steuern und auf dem Bildschirm anzuzeigen. Wir verstehen jedoch, dass wir für die vollständige Implementierung von PBR nicht 1 Textur (und nicht 1 Kanal) benötigen, sondern mindestens 9 Kanäle.
Als Ergebnis erhielten wir Szenen, in denen das Volumen der Texturen riesig war, die wildesten Berechnungen und fehlgeschlagene FPS von den benötigten Frames auf 90 bis 45 erforderlich waren. Es wurde klar, warum fast alle Spiele nur BaseColor-Texturen verwenden, während andere praktisch keine Verbindung herstellen. Zum Beispiel das Torn-Spiel für VR:

Bild

Die meisten (ich würde sagen 90%) der Objekte sind einfach gemacht - das Material bestand ausschließlich aus BaseColor. Keine normalen Karten, keine Metallic oder Rauheit. Leider können Sie mit den im Netzwerk verfügbaren Screenshots des Spiels das Minus dieses Ansatzes nicht anzeigen, und umgekehrt zeigen Screenshots sehr oft, dass alle Karten vorhanden sind und das Bild sehr schön ist. Aber reden wir nicht über dieses Spiel.

Zuerst ignorierte ich die Vorlesung, deren Video ich oben eingefügt habe. Genauer gesagt, ich habe nachgesehen und dachte, dass dies ein guter Ansatz zu sein scheint, aber wir haben die Pipeline für die Erstellung von Objekten und Texturen in unserem Team nicht geändert, da dies ausreichend Zeit erfordern würde, um Fähigkeiten zu beherrschen, einzuführen und zu entwickeln. Angesichts des Problems der Materialqualität entschied ich mich jedoch, den Ansatz zur Texturierung zu überdenken.
Wir begannen herauszufinden, was Harrison Moore anbot.

Voraussetzungen für die Bildung des Begriffs „Oberflächenkünstler“


Und so. Die Jungs von Epic Games haben einen interessanten Ansatz für die Texturierung entwickelt (genauer gesagt, darüber gesprochen). Sie verfolgten den Ansatz, Texturen in Substance Painter (oder einem anderen Texturierungsprogramm) zu erstellen, und übertrugen das Backen von Texturen aus dem Programm direkt auf die Engine (genauer gesagt, dieser Prozess kann als prozedurale Erzeugung von Materialien bezeichnet werden). Das heißt, jetzt werden Berechnungen zum Backen von Texturen bereits in der Engine selbst durchgeführt, und Texturen werden nicht erstellt, sondern im Voraus kompiliert. Das Kompilierungsergebnis (Shader) wird in einem Format gespeichert, das die Engine versteht. Wenn ein Modell mit diesem Shader angezeigt wird, wird das Ergebnis dem Modell überlagert.

Wie funktioniert es

In den Motor laden Sie die Textur einer beliebigen Textur (Material) in Größen von 1k. Das heißt, der Standardsatz ist Grundfarbe, ORM, normale Karte. Solche Texturen sind mit 10-20 Teilen geladen. Zum Beispiel 4 Sorten Metall, 5 Sorten Leder, verschiedene Sorten Kunststoff, Holz und so weiter. All dies wird in Shader-Funktionen kombiniert, damit Sie sie später problemlos verbinden können. 1 Rechnung = 1 Funktion.

Bild

Bild

Danach erstellen sie Masken für das Objekt, das wir benötigen. Hier wird Substance Painter wieder notwendig - mit dessen Hilfe werden Masken auf dem Objekt erstellt. Das heißt, Sie müssen angeben, an welchen Stellen des Objekts welche Texturen angezeigt werden sollen, und dann die gewünschte Textur an der richtigen Stelle auf dem Objekt zeichnen:

Bild

Bild

Oben im Screenshot sehen Sie, wie der fliegende Roboter in leuchtenden Farben lackiert ist. Kurz gesagt - dies geschieht speziell, um zu sehen, welche Masken sich wo wo befinden. Der zweite Screenshot zeigt eine der Masken.

Diese Masken werden in die Engine hochgeladen. Sie erstellen auch eine normale Karte für jedes Objekt separat, um die Fasen zu glätten, einige kleine technische Elemente mit Hilfe anzuzeigen und sie auch in die Engine zu laden.

Als nächstes wird ein neuer Shader (Material) erstellt, in den die erstellten Masken eingefügt werden. Die erforderlichen Shader-Funktionen werden mit den erforderlichen Texturen (z. B. rostiges Metall, Kunststoff und frisches Metall) hinzugefügt, und dann wird der Code geschrieben (fast nichts muss geschrieben werden, nachdem alle Epic Games alles getan haben, um uns das Arbeiten zu erleichtern), in dem wir angeben wie man Masken richtig mischt, welche Texturen unter welchen Masken angezeigt werden sollen, wie man Schmutztexturen anzeigt und so weiter.

Nachdem alles zusammengesetzt ist, wird der Shader kompiliert und das Ergebnis angezeigt.

Nun, es scheint, dass so etwas - schließlich kann das gleiche in Painter gemacht werden und ein fertiges Ergebnis erzielen. Dies ist jedoch nicht so. Und Fliesen sind schuld.

Ein bisschen über Fliesen


Kacheln (wörtlich - gekachelt, Fliesen) - Dies ist eine Wiederholung der Textur, als ob die Fliese, wenn sie kleiner als der Bereich für die Texturierung (UV) ist. Dies ist notwendig, um die Lücken zu füllen, die sich im UV-Raum bilden, wenn die Textur kleiner ist. Die Grafikkarte dupliziert sie nur so oft wie nötig, um die Lücke zu schließen. Das Kacheln funktioniert auf interessante Weise - die Grafikkarte berechnet jede Texel-Textur (z. B. 1 KB groß). Und wenn es um das duplizierte Teil geht, werden bereits keine Berechnungen durchgeführt, da diese bereits vorhanden sind. Die Grafikkarte kopiert und fügt die Daten einfach ein. Kopieren Einfügen. Und es kostet praktisch nichts für die Leistung. Dies ist nicht so ressourcenintensiv, dass es nichts beeinflusst, selbst wenn Sie 10.000 * 10.000 Wiederholungen kacheln (und dies mit unserem Beispiel von etwa 10 Milliarden Texeln für eine Minute über die Zahlen wiederholen), wird Ihr Projekt keine Sekunde lang langsamer.

Weiter


Das heißt, wir können jetzt die Rechnung annehmen. Zeigen Sie an der richtigen Stelle in der Einrichtung und tönen (duplizieren) Sie genau so viel, wie Sie benötigen, um die gewünschte Qualität zu erzielen. Aufgrund der Kacheln wird die Größe der Texel stark reduziert, was die Qualität der Textur selbst erhöht.
Der Nachteil dieses Ansatzes ist die Mathematik. Um die Texturen auf dem Objekt anzuzeigen, muss der Shader verschiedene Operationen mehrmals berechnen, um das Endergebnis anzuzeigen. Anstelle der Standard-3-Texturen muss die Engine Masken berücksichtigen, Normalen, Farben usw. mischen.

Tatsächlich wird der Verlust in den Berechnungen ausgeglichen:

  1. Sie können und werden in Rechnung gestellte Funktionen wiederverwenden. Immer wieder an anderen Objekten. Das heißt, die Berechnungen sind insgesamt gleich, aber die Anzahl der Texturabbildungen selbst ist zeitweise geringer. Sie müssen nicht mehr für jedes Objekt neue Texturen erstellen, sondern nur noch Bereiche für Texturen definieren und dieselben Texturen verwenden.
  2. Sie können kleinere Maskengrößen erstellen, z. B. 128 x 128 Pixel. Das reduziert die Berechnungen um das Hundertfache.
  3. Sie können Texturen nach Belieben kacheln, um ein Ergebnis zu erzielen, das mit der Standardtexturmethode nicht erzielt werden kann.
  4. Durch Hinzufügen anderer Berechnungen und Masken können Sie mit einzelnen Kanälen spielen, z. B. die Kacheln des Rauheitskanals kleiner als Farbkarten machen, wodurch die visuelle Wiederholung des Bildes gestört und ein Gefühl der Einzigartigkeit der gesamten Oberfläche erzeugt wird.
  5. Sie können Texturfunktionen so auferlegen, dass sie sich relativ zu den Koordinaten des Objekts im Weltraum bewegen. Auf diese Weise können Sie zwei identische Objekte mit denselben Shadern platzieren, aber beide sehen einzigartig aus.

Es versteht sich, dass dieser Ansatz nicht für alle Plattformen gilt. Zum Beispiel sind mobile Spiele aufgrund der Komplexität der Berechnungen bereits schwierig auf diese Weise zusammenzusetzen.

Das einfachste Beispiel für die Nachteile des Standardansatzes für die Texturierung und des neuen Materialebenensystems (wie die Jungs von Epic Games diesen Ansatz nannten) ist Final Fantasy 15. Um die Bildqualität zu verbessern, haben sie ein Paket mit 4k-Texturen veröffentlicht. Und was ist 4K-Textur? Dies sind 16 Millionen Texel-Fehlkalkulationen pro Kanal. Und wenn es 9 davon für den PBR-Standard gibt?
Und hier beginnt die Kraft des Systems der Materialschichten so weit wie möglich zu entstehen. Um mit Texturen Kleidung auf dem Charakter zu sammeln, reicht es aus, 3-4 Texturen (vielleicht mehr) zu verwenden. Insgesamt ist es weniger als Standard-Texturen mit hoher Auflösung, die Leistung ist ungefähr auf dem gleichen Niveau und die Qualität kann durch Kacheln gesteuert und viel höher eingestellt werden.

Materialschichtsystem


Die Jungs von Epic Games gingen noch einen Schritt weiter und präsentierten eine Beta-Version des „Material Layer Systems“, die keinen Hype verursachte und sich als ziemlich fehlerhaft herausstellte.
Ein Beispiel ihrer Arbeit ist in diesem Video zu sehen:


Aufgrund der Tatsache, dass das System noch nicht für die Arbeit geeignet war, haben wir uns damit vertraut gemacht und waren froh, dass wir es eines Tages fertigstellen würden. Im Moment haben wir uns jedoch geweigert, damit zu arbeiten, und haben manuell Shader erstellt, wobei jede Maske im Shader direkt angegeben wurde.
Infolgedessen versuchten wir zu experimentieren.

Wie wir normale Karten losgeworden sind


Anfangs verlief die Arbeit mit Texturen nicht ganz reibungslos - wir erzielten den gewünschten Effekt mit Texturen, aber die normale Karte hat uns immer noch sehr gehemmt, da sie für jedes Objekt generiert werden musste, um ein Gefühl von schönen Fasen zu erzeugen. Trotz der Qualität der von uns erstellten Texturen ließen die Abschrägungen bei Annäherung an das Kameraobjekt auch bei 8k-Texturen zu wünschen übrig (ich erinnere mich, dass wir ein Projekt für VR entwickelt haben). Aber 8k Textur ist ein sehr großes Volumen an Texeln. So groß, dass 2 vollständige Sätze von Texturen FPS bis zu 45 Frames drückten (für VR benötigen Sie 90).

Dann haben wir uns mit der Methode zum Erstellen von Fasen vertraut gemacht, über die ich im 4. Teil kurz gesprochen habe. Durch das Erstellen von Fasen an Objektmodellen konnten normale Karten fast vollständig entfernt werden. Ja, wir haben die Polygonmodelle erhöht, jedoch nicht mehr als 20-40%, während die Qualität der Fasen in die Höhe geschossen ist.

Dieser Ansatz ermöglichte es uns, ein weiteres Problem zu beseitigen - Nähte an den Kanten. Beim Erstellen von Fasen am Modell war es nicht mehr erforderlich, das Modell entlang harter Kanten zu schneiden. Im Prinzip gab es keine harten Kanten an den Modellen, so dass die Inseln groß wurden, sie anfingen, große Räume einzuschließen, und jetzt, da wir Textur auf die Modelle anwenden, gibt es praktisch keine Nähte an den Modellen.

Dies bedeutet nicht, dass wir jetzt für alle Objekte keine separate normale Karte haben. Die meisten Standardobjekte können einfach Fasen in Modellen ohne zusätzliche normale Karte verwenden.

Letztendlich haben wir die Masken schrittweise reduziert, die Shader vergrößert und kompliziert und damit begonnen, komplexe Materialien zu erstellen, mit denen wir sehr schöne Oberflächen texturieren können:

Bild

Über dem Boden bestehen 2 Texturen - Eisenstreifen - 32x32 Pixel und Sechsecke - 32x32 Pixel. Das Material hat eine sehr komplexe Formel - eine sehr große Anzahl von Operationen für Berechnungen - ungefähr 295 Anweisungen. Für gewöhnliches Material würde ein solcher Shader mehr Rechenleistung erfordern, aber wir verwenden nur 32x32 = 1024 Texel pro Kanal. 9 Kanäle = 10k Texel, die bei der Berechnung dieses Materials + Maske 128x128 berücksichtigt werden müssen. Eine sehr große Anzahl von Operationen wird durch eine kleine Anzahl von Texeln zur Verarbeitung ausgeglichen. Als Ergebnis haben wir ein schönes Bild mit einem sehr schnellen und einfachen Shader erhalten.
Dank Masken, kompetenter Kontrolle über Kacheln und Kanäle können Sie sehr komplexe Shader erstellen, die schöne Materialien erzeugen und gleichzeitig praktisch keine Ressourcen verbrauchen.

Zum Beispiel verwenden wir derzeit ungefähr 10-15 Texturen für das gesamte Projekt (plus mehrere einzigartige vollständig strukturierte Objekte unter Verwendung der Standardmethode). Auf fast jedem Objekt befindet sich das gleiche Metall. Es wird in Shadern modifiziert - wir fügen dem Material verschiedene Farben hinzu, wir verschieben Texturrauheitskarten, bringen Kratzer auf die Maske auf und ihre Koordinaten werden durch die Koordinaten des Objekts gesteuert (wenn es sich um statische Objekte handelt), was zu einzigartigen Objekten mit ihren Chips, Rissen und Schmutz führt .
Wenn Sie die Bildschirmauflösung erhöhen, reicht es aus, die Kacheln einfach so anzupassen, dass die Anzahl der Texel mit der Anzahl der Pixel auf dem Bildschirm übereinstimmt. Bei der Standardmethode für die Texturierung müssen Sie alle Texturen schaufeln, alte Projekte in Painter aufnehmen und erneut speichern. Und Sie müssen sicherstellen, dass die Textur nicht geht. Und dann muss all dies erneut in die Engine importiert werden und sicherstellen, dass dort alles in Ordnung ist und die Shader schnell größere Texturen als zuvor berechnen.

Mit Texturen denken


Als ich mit 3D-Künstlern über das Thema Texturen sprach, wurde mir wiederholt gesagt, dass die meisten Objekte nicht mit Texturen zusammengesetzt werden können, sondern dass dies eine separate Textur mit eindeutigen Mustern und anderen Komponenten erfordert. Zum Beispiel diese Laube:

Bild

Die Komplexität der Darstellung dieses Objekts im strukturierten Plan besteht darin, dass es einzigartige Momente hat:

Bild

Das Gürtelmuster auf dem Stoff kann eine separate Textur haben und einfach über die Stoffstruktur aufgebracht werden. Oder nähen Sie einen Gürtel in die Stoffstruktur, und dann erhalten wir eine einzigartige Stoffstruktur mit einem Gürtel:

Bild

Bei Verwendung dieser Textur wird das Nähen von Gürteln an den Stoff im selben Bereich ständig wiederholt, dies ist jedoch nicht ersichtlich.

Nasse Stellen werden durch eine Maske erzeugt und Schmutz oder etwas anderes wird aufgetragen. Und es sieht schon einzigartig aus.

Fransen zeichnen sich auch durch Textur aus, und ihre Größe wird sehr klein sein, wenn sie sich wiederholen. Sie können es über die Maske auf dem Modell anzeigen.

Ein einzigartiges Muster an einem Metallhaken kann entweder mit einem Aufkleber oder mit einer separaten Schicht einer kleinen normalen Karte angebracht werden, die unter der Sweep-Position geglättet und durch die Maske entwickelt werden kann.

Falten auf einer Stoffrolle können mithilfe von Geometrie oder Maskierung mit Schattierung realisiert werden. In der aktuellen Eisengeneration verursacht das Hinzufügen einer kleinen Anzahl von Scheitelpunkten keine Belastung, und Sie können sie immer mit Lods in einiger Entfernung verstecken.

Holzobjekte können abgeschrägt werden, wodurch die normale Karte vollständig aus den Berechnungen entfernt wird. Usw. Das Wichtigste dabei ist, dass all dies sehr schnell angepasst werden kann, ohne dass Programme von Drittanbietern und Zeitverschwendung erforderlich sind.

Und am wichtigsten ist, dass all diese Texturen in jedem anderen Shader verwendet werden können, um Farben und Flecken anzupassen.

Ausnahmen


Die meisten, würde ich sagen, 95% aller Objekte im Spiel werden von dieser Methode abgedeckt. Im Allgemeinen fällt sogar handgemachte Malerei unter die Textur und kann durch diese implementiert werden. In dieser technologischen Phase können jedoch nicht alle Objekte implementiert werden. Zum Beispiel komplexe Zeichen mit speziellen Elementen. Und selbst wenn Sie sorgfältig darüber nachdenken, können Sie sie mit Texturen bedecken - es ist wichtig, sie rechtzeitig zu sehen, abzuschneiden und abzudunkeln.

Mir wurde angeboten, das Sofa (Bild unten) als ein Element zu demonstrieren, das nicht strukturiert werden kann.

Bild

Wenn Sie jedoch genau hinschauen, hat das Sofa 3 Texturen (Leder oben, Polsterung, Holz für die Beine) und 2 Schwierigkeiten - dies sind Falten und Nähte. Falten können auf zwei Arten nachgeahmt werden:

  1. Zusätzliche Eckpunkte.
  2. Eine zusätzliche kleine normale Karte, die Faltwellen aussendet (eine attraktivere Methode).

Gleiches gilt für Nähte - sie können mit einer Maske hervorgehoben und die Textur für Nähte aufgehellt werden oder wiederum mit einer zusätzlichen normalen Karte.

Alle Unterbrechungen, alle Übergänge können mit Texturen und Masken simuliert werden, wodurch das gleiche Ergebnis erzielt wird, jedoch mit einer geringeren Anzahl von Texturen (wir müssen nur die Texturen des Standardgewebes für unser Projekt verwenden und seine Farbe direkt im Shader ändern).

Hier können Sie eine Frage stellen - was tun mit dem Verblassen der Kissen? Masken lösen solche Probleme mit einem Knall =)

Weiterhin können wir die gleichen Texturen für Stühle verwenden. , . , . — . , , . , , , , .


. , , , — . , , .

, — , - , . , , . , , .

, , , , . , , . , - .

Substance Designer — , .
Epic Games " Jobs in Unreal Engine — Surface Artist ", , . , , .

:

, Qbercat Studio, «Cat Movies» ( , , -. , ) . 3D- 1 . 1- 3-5 3D-. , , .

Snake discord- " Unreal Engine — RuCommunity ", .
Flakky , .

, - — . , , , .

=)

Source: https://habr.com/ru/post/de461545/


All Articles