L’artiste Jean-Michel Bihorel, également mentor au sein de l’école Creative Seeds, nous présente son dernier projet : le rendu d’une tête de tigre sous Guerilla Render, avec animation de la couleur du pelage.
Il nous propose au passage quelques explications techniques sur sa démarche. Il souligne notamment comment il s’est appuyé sur les dernières avancées techniques proposées dans Guerilla.
Dans ce court article, je voudrais aborder les quelques points qui selon moi on été déterminants dans mon choix d’utiliser Guerilla Render pour ce projet.
Cache et Rendu interactif :
Faire ce projet dans Guerilla m’a permis de bénéficier de son puissant système de cache. Une fois mon cache chargé en Ram, je peux facilement tweaker mes shaders ou mes lampes sans attendre à chaque fois que je lance un rendu. Dans ce cas de figure où mon cache de fourrure était le même d’un plan à l’autre, bien que le cache fasse 2go, je pouvais passer d’un plan à l’autre sans avoir à attendre à nouveau que la mise en cache opère. Il n’est pas classique d’avoir une seule frame de cache lorsque l’on parle de fur, mais cela arrive plus fréquemment si vous éclairez plusieurs plans d’une séquence dans un seul décors volumineux.
De plus, avec le rendu interactif à 25fps, cela permet d’éclairer la scène avec une vraie souplesse. Je trouve le rendu interactif de Guerilla encore plus réactif que les moteurs de rendu GPU. On peut tout à fait cacher les poils pour encore plus de flexibilité le temps de placer quelques lampes puis les ré-afficher sans perdre le cache.
Hair 2 :
Le hair 2 est une représentation beaucoup plus physique de ce qui se passe dans les interactions lumineuse entre les fibres. Sur l’image ci dessous, on peut voir que le scatter dans les poils est beaucoup plus naturel sur l’image de droite. La transition entre le blanc et le noir est beaucoup plus riche, on y retrouve de nouvelles teintes issue des rebonds de lumière.
De base il faut utiliser beaucoup de rebonds de diffuse pour minimiser la perte d’énergie quand on utilise le Hair 2. Mais l’optimisation “multiple scatter” qu’apporte Guerilla permet de drastiquement diminuer les temps de rendu. On perd forcément un peu de qualité “physique” au passage, mais le temps de rendu économisé permet de faire plus d’itérations et de finalement avoir un meilleur résultat avec le multi scatter qu’avec le brute force. La souplesse des choix artistiques que l’on peut se permettre de faire quand la latence d’itération est faible est toujours plus intéressante. L’image ci dessous montre le résultat que vous obtenez en 10 minutes de calcul avec les deux options.
Cam proj rest position :
Pour obtenir ces animations de rayures, j’aurais sûrement pu passer par un setup procédural complexe dans Houdini mais j’ai choisi une solution beaucoup plus simple. J’ai simplement peint des dégradés de valeurs dans Nuke à l’aide du node de roto en fonction d’une caméra fixe de référence. J’ai ensuite remappé ces dégradé à l’aide d’un simple enchaînement de rampes et de noises dont j’anime les paramètres. J’ai ensuite projeté la séquence d’image sur le mesh de la tête ainsi que sur les poils.
Or, si j’avais fait une projection de base sur mes poils, j’aurais perdu l’effet fourrure car j’aurais tout écrasé dans l’axe de la caméra. Or guerilla permet de biaiser l’évaluation de la projection en prenant un paramètre de position arbitraire. En l’occurrence, j’ai stocké la position de leur racine sur tous les segments de chaque poil. Ce qui fait que les poils prennent la couleur reçue par la projection en fonction de la position de leur racine. Cela me permet d’avoir un comportement unique par poil et de conserver le look fourrure. L’image ci dessous montre la différence entre les deux setups avec et sans ref position. Sans la ref position, les contours ne sont pas perturbés par les différences de longueur de poils ou autres variations de grooming ce qui donne un résultat peu naturel.
J’avais bien entendu aussi exporté un paramètre d’ID par poil pour ajouter un peu de variation de couleurs par poils, un attribut de length au cas où j’aurais eu besoin de mapper des attributs en fonction de la longueur du poil. Et j’avais bien entendu stocké la position UV de la racine de chaque poils pour leur appliquer des texture basées sur la géométrie du scalp. Bref, tout cela met bien en valeur la capacité de Guerilla à récupérer n’importe quel attribut arbitraire que vous auriez pu stocker à la génération de votre asset pour affecter le shading.
Deep Open exr id :
Le deep open exr est un format qui permet de stocker des masques parfaitement anti-aliasés pour isoler vos objets dans Nuke au moment du compositing. Contrairement au cryptomatte, l’open exr id ne se base pas sur des passes d’ID avec une couche de coverage mais bien sur des données deep. Ce qui permet d’obtenir un masque avec un antialiasing parfait même pour des objets aussi fins que des poils.
Vous pouvez les sélectionner avec la pipette ou tout simplement avec des expressions. Cela permet de facilement récupérer tous les éléments d’une scène en fonction de leur nomenclature. Vous pouvez donc générer vos passes d’ID à la volée sans avoir à vous en soucier au moment du setup de votre scène de rendu.
Dans mon cas de figure, il était donc simple de corriger un reflet spéculaire un peu violent sur une partie ou l’autre de l’image en isolant les objets de ma scène grâce à l’Open Exr Id.