Créez de magnifiques bùtiments de traitement avec Blueprint

Présentation


La gĂ©nĂ©ration de plans de bĂątiments procĂ©duraux est une idĂ©e tentante. L'utilisation de modules standardisĂ©s et le placement automatique sont assez logiques, car, aprĂšs tout, c'est la mĂȘme architecture. Mais comment pouvons-nous, en texturant, atteindre la diversitĂ© naturelle au lieu de la rĂ©pĂ©tition?

Ce bĂątiment a Ă©tĂ© crĂ©Ă© Ă  partir d'un seul module, copiĂ© automatiquement dans Construction Blueprint . L'idĂ©e est que le matĂ©riel ne nĂ©cessite presque aucune saisie manuelle de donnĂ©es. Un seul matĂ©riau est utilisĂ© pour l'ensemble du bĂątiment (hors fenĂȘtres). Ses fonctions sont utilisĂ©es pour contrĂŽler la randomisation de la couleur des sommets et la position des pixels dans l'espace mondial.


Le seul module est tout ce dont nous avons besoin


Aucun placement manuel ou script. Toute randomisation se fait dans le matériau.

Le matériel décrit dans ce tutoriel:

  • A une couche de saletĂ© dĂ©pendante de la hauteur qui recouvre l'objet uniquement Ă  la hauteur absolue spĂ©cifiĂ©e
  • SĂ©lectionne la couleur des objets pour chaque Ă©tage et segment au hasard
  • DĂ©cale lĂ©gĂšrement la position des petits objets, Ă©galement de maniĂšre alĂ©atoire
  • Permet Ă  l'utilisateur de sĂ©lectionner 2 couleurs pour les murs, ainsi que la valeur de leur destruction


Couleur de sommet en tant que données


03:34

En plus des positions des sommets et des normales, les moteurs de jeu donnent généralement accÚs à d'autres valeurs, par exemple la couleur des sommets. Lors de l'ombrage d'un triangle maillé, la couleur est interpolée entre les sommets. Vous pouvez le dessiner dans un éditeur 3D ou utiliser l'onglet Paint dans l'UE. Si vous le faites dans le moteur, vous aurez la possibilité de modifier une instance distincte du maillage dans le monde. J'ai expliqué ce cas d'utilisation dans le didacticiel sur le dessin de sommets . Cependant, dans ce cas, nous nous en tiendrons à la couleur importée, car j'ai décidé d'utiliser les canaux RVB comme masques exacts qui contrÎlent la randomisation.


N'oubliez pas que la couleur dans les graphiques 3D n'est qu'un vecteur à trois composants . Ses composants sont la luminosité du rouge, du vert et du bleu dans la plage 0 - 1. La valeur est arbitraire, car la couleur du sommet n'est que des données. Au lieu de les utiliser directement pour peindre des textures, j'ai décidé d'emballer les couleurs des masques dans chaque canal:

  • Le canal rouge est le masque des couleurs primaires et secondaires des murs . Les polygones avec une valeur de 0 utilisent la couleur primaire, avec 1 - la couleur secondaire.
  • Canal vert - utilisĂ© pour sĂ©lectionner une couleur dans la palette . Cela vous permet de contrĂŽler la variation de couleur des petits articles, tels que le sĂ©chage des vĂȘtements. Une valeur comprise entre 0 et 1 est arrondie Ă  l'index (position UV) dans la texture de la palette.
  • Canal bleu - dĂ©calage des positions des sommets pour dĂ©placer les sommets horizontalement. Cela signifie que 0 sera utilisĂ© pour les murs (pas de mouvement), et des valeurs jusqu'Ă  1 peuvent ĂȘtre attribuĂ©es au climatiseur ou au linge. Ce canal contrĂŽle Ă©galement la visibilitĂ© (masque d'opacitĂ©). Si la valeur est supĂ©rieure Ă  0, une valeur alĂ©atoire est ajoutĂ©e, la sienne pour chaque segment du bĂątiment, pour crĂ©er une variabilitĂ©.

Dans tout Ă©diteur 3D sĂ©rieux, il existe une fonction pour peindre la couleur des sommets. Vous pouvez facilement trouver des instructions sur la façon de procĂ©der dans votre Ă©diteur. N'oubliez pas d'indiquer Ă  Unreal Engine dans la fenĂȘtre d'importation de maillage afin qu'il remplace ( Remplace ) la couleur des sommets (plutĂŽt que de l'ignorer ( Ignorer )).

Comme je l'ai dit ci-dessus, la couleur de ce projet est un ensemble de valeurs exactes. Pour une tĂąche similaire, et presque n'importe quelle tĂąche technique de l'art du jeu, je prĂ©fĂšre utiliser Houdini . Cependant, un rĂ©sultat similaire peut ĂȘtre obtenu (avec un peu plus d'efforts) dans n'importe quel autre Ă©diteur 3D. Faites juste attention Ă  ce que chaque canal de couleur doit indiquer dans le shader.

J'ai mis en évidence l'ensemble du processus d'attribution de valeurs aux canaux de couleur de sommet dans un didacticiel distinct: stocker les données dans la couleur de sommet à l'aide de Houdini . Dans ce tutoriel, j'utilise les outils Houdini délicats pour rendre le processus plus efficace.

Plan de construction


07:57

Le plan que j'ai créé est simple. Il crée simplement un mur plat du bùtiment, reproduisant le maillage horizontalement et verticalement. Il a des variables mutables MeshWall (maillage statique), NumberOfFloors (entier), NumberOfSegments (entier) et Material .


Le résultat du plan: 4 étages, 2 segments.

L'ensemble du processus est exécuté dans Construction Script, c'est-à-dire pendant l'édition de niveau. Grùce à cela, le maillage résultant se comportera comme tout autre objet statique. Par exemple, il sera pris en compte lors de la construction de l'éclairage.


Les dimensions du maillage sont mesurĂ©es en premier. La longueur de la bordure signifie la moitiĂ© de la taille de l'objet. Nous pouvons le calculer une fois et l'enregistrer, car pour tous les segments, la valeur sera la mĂȘme.


Le reste du code s'exécute en deux cycles. La boucle extérieure crée des étages dans leur ensemble, la boucle intérieure crée des segments dans l'étage actuel. L'emplacement est calculé par les indices d'itération de boucle multipliés par la largeur et la hauteur du maillage.



Un nouveau composant de maillage statique est ajouté à chaque segment. Dans certains cas, il sera utile d'utiliser des instances. L'ajout de composants entraßne une augmentation du nombre d'appels de tirage, ce qui peut provoquer des problÚmes dans les scÚnes «lourdes».


C’est tout. Lors de la dĂ©finition de nouveaux NumberOfFloors et NumberOfSegments, le bĂątiment sera automatiquement mis Ă  jour.

Deux couleurs de mur masquées par la couleur des sommets


21:16


Les deux couleurs sont accessibles en tant que paramÚtres. Le canal rouge de la couleur des sommets est utilisé comme coefficient de mélange entre eux.


Emballage et mélange de canaux


14:22


Nous voulons que les couleurs des murs affectent uniquement les murs eux-mĂȘmes, mais pas les cadres de fenĂȘtres et les climatiseurs. De plus, ils ne devraient pas affecter les zones endommagĂ©es. Cela peut ĂȘtre fait en enveloppant le masque dans le canal alpha de la couleur de base. En d'autres termes, la texture de la couleur de base a un fond transparent, et c'est lĂ  que les couleurs des murs sont affectĂ©es.

Soit dit en passant, j'ai emballĂ© les textures de mĂ©tal, de rugositĂ© et d'occlusion (toutes dans des tons de gris) dans les canaux R / G / B de la mĂȘme texture . Cela rĂ©duit le nombre d'Ă©chantillonneurs, de fichiers et de Lerp de trois fois - une excellente optimisation qui ne nĂ©cessite aucun compromis. Un tutoriel sur cette technique se trouve dans les notes.


Le bruit de la texture



Ce motif de bruit a Ă©tĂ© utilisĂ© pour se fondre entre le premier (propre) et le deuxiĂšme (endommagĂ©) jeux de textures. Au lieu de le calculer en temps rĂ©el, ce qui pour un bruit de haute qualitĂ© sera une procĂ©dure coĂ»teuse, je le charge simplement Ă  partir de la texture. Le nƓud WorldAlignedTexture le projette sur trois cĂŽtĂ©s ( il gĂ©nĂšre des coordonnĂ©es UV de maniĂšre procĂ©durale ).


Saleté en fonction de la hauteur. Fonction de remappage


18h00


La saleté est une couleur plate appliquée par un dégradé dans l'espace mondial. La composante Z de la position des pixels dans le monde est convertie en intervalle 0-1. Cela nous donne un masque utile - coefficient de Lerp . Le minimum et le maximum initiaux (par exemple de 150 à 700 cm) sont transmis par l'utilisateur sous forme de paramÚtres scalaires. Un peu de bruit est ajouté pour rendre la transition plus naturelle.



La fonction TAA_Remap_01_Clamped a Ă©tĂ© crĂ©Ă©e par mes soins. Je l'utilise dans presque tous les shaders. Il convertit la valeur de l'intervalle source en intervalle 0-1. IdĂ©al pour crĂ©er des masques en fonction de la distance (de la camĂ©ra, du sol ou mĂȘme pour les formes dans l'espace UV).

Randomisation des couleurs, masquage des éléments


22 h 55


L'obtention d'une valeur aléatoire à partir du point de référence de la position du segment vous permet de décaler la palette de couleurs pour les petits objets. Une palette est une texture avec des couleurs alignées horizontalement, donc déplacer l'image utilisée pour la lecture nous donne la couleur finale.



La texture de la palette Ă  plus grande Ă©chelle. Sa taille habituelle est de 8 × 1 pixel avec compression dĂ©sactivĂ©e


Le canal de couleur du sommet vert sert de valeur de randomisation et de masque. Une valeur de 0 signifie "ne pas appliquer de couleur ici".


Appliquer le décalage de position locale



La derniĂšre fonction consiste Ă  dĂ©placer des objets de façon alĂ©atoire le long de l'axe X. Pour ce faire, un dĂ©calage de position contrĂŽlĂ© par le matĂ©riau est ajoutĂ© aux sommets. Lorsque vous utilisez cette astuce, vous devez ĂȘtre attentif Ă  deux choses - les collisions complexes (pour la prise de vue) et les champs de distance. L'un et l'autre paramĂštre ne savent pas qu'un tel dĂ©calage a Ă©tĂ© effectuĂ©.

Je reprendrai le canal bleu et ajouterai un nombre alĂ©atoire - le mĂȘme bruit basĂ© sur la position du segment que nous avons utilisĂ© plus tĂŽt. Convertissons-le de l'intervalle 0-1 Ă  l'intervalle de -0,5 Ă  0,5, afin que le mouvement soit effectuĂ© dans les deux sens. Ensuite, nous le multiplions par PositionOffsetStrength . Le nƓud Append ajoutera les axes restants (constante 0 sur Y et Z).

De façon assez inattendue, Unreal nécessite que la sortie soit décalée en coordonnées universelles . Nous avons calculé la position locale . Comment le convertir?

Cela peut ĂȘtre fait en transformant l'espace de cette nouvelle position locale en espace mondial en utilisant le nƓud Transformer . Ensuite, je soustrais la position initiale du sommet dans le monde de cette nouvelle position du sommet, obtenant le dĂ©calage du monde au lieu de la position. Combinez cela avec la sortie du matĂ©riau World Position Offset , et c'est lĂ  que le travail est effectuĂ©.


Matériau fini


J'espĂšre que vous avez appris quelque chose de nouveau grĂące Ă  ce tutoriel. Voici une capture d'Ă©cran de l'intĂ©gralitĂ© du graphique du nƓud de matĂ©riau:


Fichiers du projet et discussion


Vous pouvez télécharger des fichiers de projet gratuitement (ou pour un don, si vous le souhaitez): fichiers de projet . Si vous avez des commentaires ou des questions, rejoignez la discussion dans Reddit .

Lecture complémentaire


  • Un moyen simple d'intĂ©grer des textures dans des canaux RVB consiste Ă  enregistrer trois textures en niveaux de gris dans les canaux d'une seule image RVB Ă  l'aide de Photoshop. L'emballage vous permet d'Ă©conomiser de l'espace et, plus important encore, d'obtenir trois textures en une seule opĂ©ration de lecture. Cela en vaut la peine car la lecture des textures de la mĂ©moire est l'une des opĂ©rations GPU les plus longues.

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


All Articles