Vous avez probablement rencontré un terrain où les parois abruptes d'une falaise ont une texture tellement étirée que cela semble irréaliste. Vous avez peut-être un monde généré par les procédures que vous n'avez aucun moyen de dérouler et de texturer par UV. La cartographie tri-planaire fournit une technique élégante pour résoudre ces problèmes et vous donne des textures réalistes, quel que soit l'angle ou la forme la plus complexe. Ici, vous allez apprendre à connaître la technique, voir le code et quelques-uns des avantages, inconvénients et autres possibilités de l’utilisation de la cartographie tri-planaire..
Articles SimilairesLe problème le plus courant concerne les textures étirées, en particulier en ce qui concerne le terrain. Le problème réside dans les coordonnées UV de l'objet que vous texturez. Dans le cas d'un terrain, les coordonnées UV sont réparties dans une grille, régulièrement réparties dans le plan X-Y, comme suit:
Cette disposition UV ne prend pas en compte la différence de hauteur du terrain et provoque des étirements. Vous pouvez prendre des mesures pour aplanir la zone des polygones raides en déroulant soigneusement les coordonnées UV, mais cela conduit à un résultat moins qu'idéal. Vous avez toujours des textures gondolées et certaines tuiles, comme celle du centre, sont compressées.
Vous pouvez également vous trouver dans une position où vous ne pouvez pas dérouler les coordonnées UV du maillage: le terrain ou la forme peut être généré de manière procédurale. Peut-être que vous avez un système de grottes ou des trous dans votre forme.
Nous pouvons résoudre ces problèmes avec la technique de cartographie tri-planaire (également connue sous le nom de "texturation tri-planaire")..
Premièrement, regardons à nouveau le terrain avec la cartographie tri-planifiée qui lui est appliquée:
Maintenant c'est beaucoup plus gentil! L'étirement est parti et les pentes abruptes semblent plus réalistes.
Pour ce faire, la cartographie tri-planaire consiste à rendre la texture 3 fois, dans 3 directions différentes: axes X, Y et Z. Imaginez une boîte. La texture est d'abord projetée vers le bas de l'axe des X positif vers l'axe des X négatif. Tous les fragments (pixels de la géométrie) qui font face dans la direction de l'axe des X reçoivent la texture qui leur est appliquée. Le même processus est appliqué aux axes Y et Z.
Ces rendus sont mélangés. Ainsi, un fragment qui fait face à la moitié de l'axe X et à la moitié de l'axe Z prendra la moitié du rendu de l'axe X et la moitié du rendu de l'axe Z. Si le fragment est orienté à 90% vers l'axe X, il reçoit alors 90% du rendu de l'axe X et seulement 10% de celui-ci. C'est comme prendre 3 bombes aérosols et pulvériser par le haut, le côté et l'avant.
Tout cela se fait dans le fragment shader de votre matériel. Il texture essentiellement la géométrie 3 fois, une fois dans chaque direction, puis mélange le résultat..
La cartographie tri-planaire n’utilise pas du tout les coordonnées UV. Au lieu de cela, il utilise les coordonnées mondiales réelles. Sachant cela, regardons le code.
La première partie consiste à calculer le facteur de mélange pour chaque direction:
// dans wNorm est la normale du fragment vec3 blending = abs (wNorm); mélange = normaliser (max (mélange, 0,00001)); // Force la somme des poids à 1,0 float b = (blending.x + blending.y + blending.z); mélange / = vec3 (b, b, b);
Ici, cela prend la normale du fragment dans l'espace-monde (qui sera normalisé et chaque composant sera compris entre -1 et 1) et nous en ferons une valeur absolue. Peu importe si une normale fait face à -X ou X, c'est tout simplement sur l'axe des abscisses. Si nous nous inquiétions de la direction absolue, nous peindrions la forme de l'avant, de l'arrière, de gauche, de droite, du haut et du bas; 3 fois plus que nécessaire.
Ensuite, nous le forçons à se situer entre 0 et 1, de sorte que nous obtenons un multiplicateur de pourcentage pour chacune des composantes de l'axe. Si la normale est orientée vers le haut sur l’axe Y, nous obtenons une valeur Y de 1 et l’ensemble de la peinture de l’axe Y, tandis que les autres axes auront la valeur 0 et n'en obtiendront aucune..
C'est la partie difficile. Ensuite, nous venons de mélanger les trois valeurs de mélange (x, y, z) avec la texture à cette coordonnée. Rappelez-vous que la coordonnée de la texture est dans l'espace-monde:
vec4 xaxis = texture2D (rockTexture, coords.yz); vec4 yaxis = texture2D (rockTexture, coords.xz); vec4 zaxis = texture2D (rockTexture, coords.xy); // mélange les résultats des 3 projections planaires. vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;
Et là nous l'avons. "tex" est la couleur finale du fragment, mélangée trois fois à partir des 3 axes.
Il peut être très pratique d’appliquer un facteur d’échelle à la texture car vous voudrez sans doute l’échelonner:
// en float scale vec4 xaxis = texture2D (rockTexture, coords.yz * scale); vec4 yaxis = texture2D (rockTexture, coords.xz * scale); vec4 zaxis = texture2D (rockTexture, coords.xy * scale); vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;
Si vous utilisez des mappages tri-planaires et des mappes normales, vous voudrez également appliquer la même procédure aux normales dans le fragment shader, comme suit:
vec4 xaxis = texture2D (rockNormalTexture, coords.yz * scale); vec4 yaxis = texture2D (rockNormalTexture, coords.xz * scale); vec4 zaxis = texture2D (rockNormalTexture, coords.xy * scale); vec4 tex = xaxis * blending.x + xaxis * blending.y + zaxis * blending.z;POINTE: Créez une fonction getTriPlanarBlend () pour calculer le mélange des textures diffuses, normales et spéculaires..
La première chute que vous rencontrerez est la performance. Les fragments de la géométrie vont être rendus 3 fois, une fois dans chaque direction. Cela signifie que les calculs de couleur et d'éclairage (normales) seront répétés puis fusionnés. Si vous êtes déjà attaché à des cadres gratuits, vous pouvez ne pas utiliser de mappage tri-planaire..
La fusion suivante à un angle de 45 degrés, en particulier lorsque différentes textures se chevauchent lorsque vous utilisez la projection de texture, est le prochain inconvénient majeur. Vous pouvez effectuer 4 autres rendus à partir des angles, mais les performances ne seront probablement pas récompensées. Vous pouvez essayer de mélanger avec une carte de profondeur, une technique parfois utilisée dans la projection de texture.
Vous devez maintenant avoir une idée du fonctionnement de la cartographie tri-planaire et de son utilité. Mais il a beaucoup d'autres applications où il peut être légèrement modifié pour produire des résultats intéressants.
Comme mentionné précédemment, le terrain procédural est un bon candidat pour la technique. Les grottes, les falaises et les tunnels de lave complexes sont maintenant faciles à texturer. Vous pouvez même influencer la texture utilisée lorsque celle-ci est basée sur des routines aléatoires ou pseudo-aléatoires (bruit). L'élévation ou même la pente pourraient déterminer la texture utilisée.
En modifiant la routine pour simplement projeter une texture à partir du haut (axe des ordonnées) et en fixant fermement la valeur de fusion dans une plage acceptable, c'est-à-dire. 10%, alors vous pourriez rendre la neige au sommet de tout dans la scène. Une explosion atomique pourrait brûler tout ce qui irradiait depuis un certain point d'origine coordonné au monde en utilisant la même technique, mais en se basant sur l'angle depuis le point d'origine et en utilisant une texture de brûlure sombre..
Est-ce que d'autres applications viennent à l'esprit? Faites-nous savoir et n'hésitez pas à discuter.