Erstellen Sie mit Blueprint wunderschöne Behandlungsgebäude

Einleitung


Die Erstellung von Bauplänen für Verfahrensgebäude ist eine verlockende Idee. Die Verwendung standardisierter Module und die automatische Platzierung sind sehr logisch, da dies immerhin dieselbe Architektur ist. Aber wie erreichen wir beim Texturieren natürliche Vielfalt statt Wiederholung?

Dieses Gebäude wurde aus nur einem Modul erstellt und automatisch in Construction Blueprint kopiert . Die Idee ist, dass das Material fast keine manuelle Dateneingabe erfordert. Für das gesamte Gebäude wird nur ein Material verwendet (ausgenommen Fenster). Seine Funktionen dienen zur Steuerung der Randomisierung der Farbe der Scheitelpunkte und der Position von Pixeln im Weltraum.


Das einzige Modul ist alles, was wir brauchen


Keine manuelle Platzierung oder Skripterstellung. Alle Randomisierung erfolgt im Material.

Das in diesem Tutorial beschriebene Material:

  • Hat eine höhenabhängige Schmutzschicht , die das Objekt nur bis zur angegebenen absoluten Höhe bedeckt
  • Wählt die Farbe der Objekte für jede Etage und jedes Segment nach dem Zufallsprinzip aus
  • Verschiebt die Position kleiner Objekte leicht, auch zufällig
  • Ermöglicht dem Benutzer die Auswahl von 2 Farben für die Wände sowie den Wert ihrer Zerstörung


Scheitelpunktfarbe als Daten


03:34

Zusätzlich zu den Positionen von Scheitelpunkten und Normalen bieten Game-Engines normalerweise Zugriff auf andere Werte, z. B. die Farbe der Scheitelpunkte. Beim Schattieren eines Netzdreiecks wird die Farbe zwischen den Scheitelpunkten interpoliert. Sie können es in einem 3D-Editor zeichnen oder die Registerkarte Malen in der UE verwenden. Wenn Sie dies in der Engine tun, haben Sie die Möglichkeit, eine separate Instanz des Netzes in der Welt zu ändern. Ich habe diesen Anwendungsfall im Tutorial zum Zeichnen von Eckpunkten erklärt . In diesem Fall bleiben wir jedoch bei der importierten Farbe, da ich mich für die Verwendung von RGB-Kanälen als exakte Masken zur Steuerung der Randomisierung entschieden habe.


Vergessen Sie nicht, dass Farbe in 3D-Grafiken nur ein Dreikomponentenvektor ist . Seine Komponenten sind die Helligkeit von Rot, Grün und Blau im Bereich von 0 bis 1. Der Wert ist willkürlich, da es sich bei der Farbe des Scheitelpunkts nur um Daten handelt. Anstatt sie direkt zum Malen von Texturen zu verwenden, habe ich beschlossen, die Farben der Maskenoberteile in jeden Kanal zu packen:

  • Der rote Kanal ist die Maske der Primär- und Sekundärfarben der Wände . Polygone mit dem Wert 0 verwenden die Primärfarbe und 1 die Sekundärfarbe.
  • Grüner Kanal - Dient zum Auswählen einer Farbe aus der Palette . Auf diese Weise können Sie die Farbabweichung kleiner Gegenstände, z. B. beim Trocknen von Kleidung, steuern. Ein Wert zwischen 0 und 1 wird auf den Index (UV-Position) in der Palettentextur gerundet.
  • Blauer Kanal - Versatz der Positionen der Scheitelpunkte , um die Scheitelpunkte horizontal zu verschieben. Dies bedeutet, dass 0 für Wände verwendet wird (keine Bewegung) und der Klimaanlage oder der Wäsche Werte bis zu 1 zugewiesen werden können. Dieser Kanal steuert auch die Sichtbarkeit (Deckkraftmaske). Wenn der Wert größer als 0 ist, wird für jedes Gebäudesegment ein eigener Zufallswert hinzugefügt, um eine Variabilität zu erzielen.

In jedem ernsthaften 3D-Editor gibt es eine Funktion zum Malen der Farbe der Scheitelpunkte. Anweisungen dazu finden Sie ganz einfach in Ihrem Editor. Denken Sie daran, Unreal Engine im Netzimportfenster anzuweisen, damit es die Farbe der Scheitelpunkte ersetzt (ersetzt) ​​(anstatt sie zu ignorieren ).

Wie bereits erwähnt, besteht die Farbe in diesem Projekt aus einer Reihe genauer Werte. Für eine ähnliche Aufgabe und fast jede technische Aufgabe der Spielekunst bevorzuge ich Houdini . Ein ähnliches Ergebnis kann jedoch (mit etwas mehr Aufwand) in jedem anderen 3D-Editor erzielt werden. Achten Sie einfach darauf, was jeder Farbkanal im Shader anzeigen soll.

Ich habe den gesamten Prozess der Zuweisung von Werten zu Scheitelpunktfarbkanälen in einem separaten Lernprogramm erläutert: Speichern von Daten in Scheitelpunktfarbe mithilfe von Houdini . In diesem Tutorial verwende ich die kniffligen Houdini-Tools, um den Prozess effizienter zu gestalten.

Bauplan


07:57

Der Entwurf, den ich erstellt habe, ist einfach. Es wird einfach eine flache Wand des Gebäudes erstellt, wobei das Netz horizontal und vertikal dupliziert wird. Es hat veränderbare Variablen MeshWall (Static Mesh), NumberOfFloors (Ganzzahl), NumberOfSegments (Ganzzahl) und Material .


Das Ergebnis der Blaupause: 4 Stockwerke, 2 Segmente.

Der gesamte Prozess wird in einem Konstruktionsskript ausgeführt, d. H. während der Levelbearbeitung. Dadurch verhält sich das resultierende Netz wie jedes andere statische Objekt. Dies wird beispielsweise bei der Gebäudebeleuchtung berücksichtigt.


Die Maschenabmessungen werden zuerst gemessen. Rahmenlänge bedeutet die halbe Größe des Objekts. Wir können es einmal berechnen und speichern, da der Wert für alle Segmente gleich ist.


Der Rest des Codes wird in zwei Zyklen ausgeführt. Die äußere Schleife erzeugt Etagen als Ganzes, die innere Schleife erzeugt Segmente innerhalb der aktuellen Etage. Die Position wird durch die Schleifeniterationsindizes multipliziert mit der Breite und Höhe des Netzes berechnet.



Zu jedem Segment wird eine neue statische Netzkomponente hinzugefügt. In einigen Fällen ist es hilfreich, Instanzen zu verwenden. Das Hinzufügen von Komponenten führt zu einer Erhöhung der Anzahl der Draw Calls, was in „schweren“ Szenen zu Problemen führen kann.


Das ist alles. Wenn Sie neue NumberOfFloors und NumberOfSegments festlegen, wird das Gebäude automatisch aktualisiert.

Zwei durch Scheitelfarbe maskierte Wandfarben


21:16


Auf beide Farben wird als Parameter zugegriffen. Der rote Kanal der Farbe der Eckpunkte wird als Mischungskoeffizient zwischen ihnen verwendet.


Kanalpacken und Mischen


14:22


Wir möchten, dass die Farben der Wände nur die Wände selbst beeinflussen, nicht aber die Fensterrahmen und Klimaanlagen. Sie sollten auch keine beschädigten Bereiche betreffen. Dies kann erreicht werden, indem die Maske in den Alphakanal der Grundfarbe gewickelt wird. Mit anderen Worten, die Textur der Grundfarbe hat einen transparenten Hintergrund, und hier werden die Farben der Wände beeinflusst.

Übrigens habe ich die Texturen Metalness, Roughness und Occlusion (alle in Graustufen) in die R / G / B-Kanäle derselben Textur gepackt. Dies reduziert die Anzahl der Sampler, Dateien und Lerp um das Dreifache - eine großartige Optimierung, die keine Kompromisse erfordert. Ein Tutorial zu dieser Technik finden Sie in den Notizen.


Geräusche von der Textur



Dieses Rauschmuster wurde verwendet, um zwischen dem ersten (sauberen) und dem zweiten (beschädigten) Texturensatz zu mischen. Anstatt es in Echtzeit zu berechnen, was für qualitativ hochwertiges Rauschen eine kostspielige Prozedur sein wird, lade ich es einfach aus der Textur. Der WorldAlignedTexture-Knoten projiziert ihn von drei Seiten ( er generiert UV-Koordinaten prozedural ).


Höhenabhängiger Schmutz. Remap-Funktion


18:00


Schmutz ist eine flache Farbe, die durch ein Gefälle im Weltraum aufgetragen wird. Die Komponente Z der Pixelposition in der Welt wird in das Intervall 0-1 umgewandelt. Dies gibt uns eine nützliche Maske - Lerp- Koeffizient. Das anfängliche Minimum und Maximum (zum Beispiel von 150 bis 700 cm) werden vom Benutzer als skalare Parameter übertragen. Ein wenig Rauschen wird hinzugefügt, um den Übergang natürlicher zu gestalten.



Die Funktion TAA_Remap_01_Clamped wurde von mir erstellt. Ich benutze es in fast allen Shadern. Es konvertiert den Wert im Quellintervall in das Intervall 0-1. Ideal zum Erstellen von Masken basierend auf der Entfernung (von der Kamera, vom Boden oder sogar für Formen im UV-Raum).

Farb-Randomisierung, Elemente verstecken


22:55


Wenn Sie einen zufälligen Wert vom Referenzpunkt der Segmentposition abrufen, können Sie die Farbpalette für kleine Objekte verschieben. Eine Palette ist eine Textur mit horizontal ausgerichteten Farben. Wenn Sie also das zum Lesen verwendete Bild verschieben, erhalten Sie die endgültige Farbe.



Die Textur der Palette in vergrößertem Maßstab. Die übliche Größe beträgt 8 × 1 Pixel mit deaktivierter Komprimierung


Der grüne Scheitelpunkt-Farbkanal dient als Randomisierungswert und Maske. Ein Wert von 0 bedeutet "hier keine Farbe anwenden".


Übernehmen Sie den lokalen Positionsoffset



Die letzte Funktion ist das zufällige Verschieben von Objekten entlang der X-Achse. Dazu wird den Eckpunkten ein materialgesteuerter Positionsversatz hinzugefügt. Wenn Sie diesen Trick anwenden, müssen Sie zwei Dinge beachten - komplexe Kollisionen (für das Schießen) und Distanzfelder. Sowohl der eine als auch der andere Parameter wissen nicht, dass ein solcher Offset durchgeführt wurde.

Ich werde den blauen Kanal erneut nehmen und eine Zufallszahl hinzufügen - dasselbe Rauschen, das auf der Position des Segments basiert, das wir zuvor verwendet haben. Konvertieren wir es von Intervall 0-1 in das Intervall von -0,5 bis 0,5, damit die Bewegung in beide Richtungen ausgeführt wird. Dann multiplizieren wir es mit PositionOffsetStrength . Der Append-Knoten fügt die verbleibenden Achsen hinzu (Konstante 0 für Y und Z).

Ganz unerwartet erfordert Unreal, dass die Ausgabe in Weltkoordinaten versetzt wird . Wir haben die lokale Position berechnet. Wie konvertiere ich es?

Dies kann durch Transformieren des Raums dieser neuen lokalen Position in den Weltraum unter Verwendung des Transformationsknotens erreicht werden. Dann subtrahiere ich die anfängliche Position des Scheitelpunkts in der Welt von dieser neuen Scheitelpunktposition und erhalte den Weltversatz anstelle der Position. Kombinieren Sie dies mit der Veröffentlichung des World Position Offset- Materials, und dort wird die Arbeit erledigt.


Fertiges Material


Ich hoffe, Sie haben aus diesem Tutorial etwas Neues gelernt. Hier ist ein Screenshot des gesamten Materialknotendiagramms:


Projektdateien und Diskussion


Sie können Projektdateien kostenlos herunterladen (oder auf Wunsch spenden): Projektdateien . Wenn Sie Feedback oder Fragen haben, nehmen Sie an der Diskussion in Reddit teil .

Zusätzliche Lektüre


  • Eine einfache Möglichkeit, Texturen in RGB-Kanäle zu packen, besteht darin, mit Photoshop drei Graustufentexturen in Kanälen eines einzelnen RGB-Bildes zu speichern. Durch das Verpacken können Sie Platz sparen und vor allem drei Texturen in einem Lesevorgang erhalten. Dies ist die Mühe wert, da das Lesen von Texturen aus dem Speicher eine der zeitaufwändigsten GPU-Operationen ist.

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


All Articles