Cartes des rides dans The Blacksmith

Lors de la planification du court métrage The Blacksmith , nous n'avons jamais vraiment accordé une priorité suffisante à un shader de peau personnalisé pour qu'il ait une chance réaliste d'être retenu comme tâche. Cependant, nous voulions toujours voir s'il y avait quelque chose de simple que nous pouvions faire pour ajouter un peu de vie supplémentaire aux expressions du Challenger. Après un brainstorming rapide, nous avons décidé d'essayer d'ajouter des cartes de rides pilotées par blendshape au projet.
Pour ajouter des détails et de la profondeur aux expressions, nous avons décidé que le shader standard nous donnerait le meilleur rapport qualité-prix si nous laissions les rides affecter à la fois les normales et l'occlusion. Nous voulions également une méthode permettant de limiter l’influence de certaines expressions à des parties spécifiques du visage.
Entrez le pilote Wrinkle Maps
Nous avons créé un composant qui permettait à l'animateur de définir les couches de rides, une couche par blendshape dans le maillage. Les définitions de calque contenaient des mappages de texture et des modificateurs de force, ainsi qu'un ensemble de poids de masquage qui seraient mis en correspondance avec une texture de masquage de partie de visage. En utilisant les poids de masquage, des couches de rides spécifiques pourraient affecter une à quatre parties du visage masquées, chacune avec une influence différente.

Comme nous voulions pouvoir mélanger jusqu'à quatre expressions différentes à tout moment, le mélange à lui seul nécessitait 11 échantillonneurs de texture avec toutes les fonctionnalités activées (deux textures de base, huit textures de détail et une texture de masquage). La seule option réaliste pour cela était de composer les cartes de rides mélangées dans une passe de pré-rendu hors écran. Nous avons constaté que le format de texture de rendu ARGB2101010 était parfait pour nous, car il nous permettrait de regrouper les normales dans deux des canaux 10 bits, le canal restant recevant l'occlusion. À chaque image, le composant de la carte des rides trouverait les quatre formes de mélange les plus influentes et attribuerait les poids de rendu des calques en conséquence.

Une fois que nous avions toutes les données de rides composées dans l'espace écran, la seule chose restante à faire était de rediriger les entrées de données normales et d'occlusion dans le shader standard que nous utilisions pour le rendu du visage. En pratique, cela signifiait simplement ajouter une poignée de lignes à la fonction principale du shader de surface.
// Sample occlusion and normals from screen-space buffer when wrinkle maps are active
#ifdef WRINKLE_MAPS
float3 normalOcclusion =
tex2D(_NormalAndOcclusion, IN.screenPos.xy / IN.screenPos.w).rgb;
o.Occlusion = normalOcclusion.r;
#ifdef _NORMALMAP
o.Normal.xy = normalOcclusion.gb * 2.f - 1.f;
o.Normal.z = sqrt(saturate(1.f - dot(o.Normal.xy, o.Normal.xy)));
#endif
#endifRésultats finaux
La comparaison de la tête de base avec la forme de mélange exagérée et en colère à plein poids illustre les détails supplémentaires ajoutés par les cartes de rides mélangées :


Nous avons également ajouté divers modes de sortie de débogage qui nous ont permis de visualiser facilement les cartes d'occlusion et normales entièrement mélangées. Ils ont été très utiles pour déterminer exactement quel composant a contribué à quoi dans le résultat final.

Nous avons divisé cette fonctionnalité en un exemple de projet que vous pouvez obtenir à partir de l'Asset Store. Il s'agit essentiellement de la tête du Challenger avec quelques-unes des expressions que nous avons utilisées dans The Blacksmith, mais cela devrait servir de point de départ utile pour faire fonctionner ce système dans vos propres projets.
