Le back dans le shader Hair

Dans la vraie vie vivante qu’on partage avec ces foutus moustiques si propice à ruiner cette si chouette période de l’année :fuck: , les poils ont des propriétés physiques difficiles à modeler. Les shaders de poils ne sont pas les trucs les plus simples à comprendre et à coder :perplex: . Un petit coup d’œil sur le papier Light Scattering from Human Hair Fibers devrait vous convaincre. Et si vous êtes motivé

Au passage, je pense que le rendu temps-réel est complètement à la ramasse sur ce sujet. « Le temps-réel, c’est le futur », sauf si on a encore des cheveux, sinon : :vomit:

Si vous utilisez le shader Hair de Guerilla, dont la documentation se trouve ici (avec des potards à bouger comme dans vos logiciels préférés ! :bravo: ), vous savez qu’il se compose de trois composants de spéculaires ; primary, secondary et back (nous n’aborderons pas les paramètres Multiple Scatter et Diffuse :nannan: ).

Quand on regarde les images de la documentation officielle, on pourrait être tenté de confondre le back avec un effet de rim de light (une light, souvent forte, venant quasiment de derrière un modèle) :

Nous allons voir que le back n’a rien à voir avec une rim.

Cette image dérobée sur la page de documentation du shader Curve permet de simplifier le comportement qu’on cherche à reproduire avec ces trois composants :

Nous avons donc trois composants :

  • La primaire correspond aux réflexions à la surface du poil (en rouge sur le schéma).
  • La secondaire correspond aux réflexions internes à l’intérieur du poil (en violet).
  • Et une dernière, le back correspond à la transmission à travers le poil (en vert).

Notez à que le back est dans l’alignement de la light.

C’est ici qu’on comprend quelle différence il y a avec une rim light et que ça devient visuellement intéressant. Là où on s’imagine assez bien le comportement des deux premiers spéculaires, qui réagissent à peu près comme sur un shader de base, en miroir (c.à.d, réfléchissent la lumière en face d’eux), l’intensité du spéculaire back dépend de la lumière qui se trouve derrière. :reflechi:

En gros : Plus la lumière derrière le poil (donc devant vous) est importante, plus le spéculaire de back apparaît. C’est contre-intuitif, et c’est pourquoi je vous demande de bien observer ce schéma et de l’avoir en tête pour la suite de ce billet.

Vous l’aurez compris, c’est ce que produit le back qui va nous intéresser.

Rendu

Tout ça c’est bien joli, mais ça donne quoi en image ? :petrus:

Voici six AOV d’un rendu :

La scène est composée :

  • D’un plan avec une texture de Maurus Loeffel (merci à lui) en DiffuseColor.
  • D’une sphère (rouge pur) faisant office de scalp à une procédurale de poils.
  • Sur les poils, un shader Hair par défaut, avec une DiffuseColor gris fonçé.
  • Une grosse SquareLight au-dessus (une « douche »).

Dans l’ordre des AOVs, nous avons :

  • Beauty, Albedo, Diffuse.
  • Specular, Reflection, IndDiffuse.

Notez que les poils cachent totalement la sphère rouge (son scalp).

On remarque que le back est sur l’AOV de Reflection et semble visuellement jouer son rôle.

Mais pourquoi l’AOV de Reflection ?

Rappelez-vous : Le back simule le spéculaire de la lumière venant de derrière le poil. Pour faire cela, le moteur va lancer un rayon comme il le ferait pour un spéculaire standard, mais il va le faire suivant la logique du spéculaire back, tout droit, devant lui (voir schéma). Le back est donc une réflexion qui part dans le sens du rayon original. Le moteur va simplement traverser le poil et récupérer ce qui se trouve derrière. S’il tombe sur d’autres poils il s’arrête, sinon, il touche le plan texturé (d’où la teinte colorée du back).

On comprend pourquoi cet effet n’est visible que sur les bords des poils : Sur les bords, un rayon a peu de chances de croiser un autre poil sur sa route lorsqu’il trace le back, mais quand on se situe au milieu et qu’on trace le back, on tombe rapidement sur un ou plus de poils, ce qui arrête son tracé. On comprend aussi que par extension, le back a un coup de calcul important, par rapport à ce qu’il apporte ; il est tracé partout, mais n’apparaît que sur les bords.

Donc si vous avez des poils très courts et très denses, il faut sérieusement se poser la question de son apport artistique avant de l’activer, car son coût est important. :redface:

En effet, le temps de rendu de ma petite scène de sphère est de 1 min 43 sec (ça aura son importance dans la suite de ce billet).

Maintenant faisons notre super trick de la mort qui va nous permettre de sauver du temps de rendu, la production, notre salaire et draguer en discothèque : Supprimons les poils du trace set « Diffuse » (ici, via le nœud « -Diffuse ») :

(Au passage, je ne vais pas en discothèque, parce que tout le monde sait bien que)

Bref, on vire les poils du trace set « Diffuse » et on rend :

On remarque immédiatement que l’AOV de Reflection est « bizarre » et ressemble plus à une sorte de verre trouble qu’une réflexion. Si vous avez bien suivi ce qu’on a dit plus haut, vous avez peut-être compris ce qui se passe. :sauteJoie:

Je vous disais que pour calculer le back, le moteur lance un rayon de réflexion, mais orienté dans son sens original (c’est le spéculaire de back qui veut ça, voir le schéma). S’il touche un autre poil, il s’arrête, s’il ne touche pas de poil, il touche le plan (ou parfois ici, la sphère faisant office de scalp). C’est pour ça qu’en principe, ça ne fonctionne que sur les bords, le rayon ayant peu de chances de taper d’autres poils.

Sauf qu’ici, il semble que tout le spéculaire de back se soit comporté comme s’il n’avait rencontré aucun poil… Comme si, le trace set utilisé pour tracer le back ne contenait pas les poils… D’ailleurs, il utilise quoi comme trace set Guerilla pour tracer ses poils ? :petrus:

Allez dans « Hair / Advanced / Trace Set » :

Mais, les bras m’en tombent ! :bete:

Alors forcément, là vous êtes pépouze, le cul posé dans votre siège à lire un billet de blog écrit avec amour et vous comprenez peut-être ce qui se passe, mais je vous assure que quand un rendu comme ça tombe dans votre boite mail avec pour objet : « UrGeNt ! A rEnDrE pOuR aVaNt Yèr !!11! », vous envisagez sérieusement une reconversion dans le recyclage de mugs usagés au tréfonds de la Sibérie. :casseTeteMur:

Vous l’aurez compris, en virant les poils du trace set « Diffuse », vous avez purement et simplement supprimé les poils de leur propre réflexion… :slow_clap:

On peut se demander ce qu’on y gagne réellement : Après tout, il suffirait de remettre les poils dans le trace set « Diffuse » et on pourrait rendre sa production heureuse… :sourit:

C’est là qu’interviennent les temps de rendu. La dernière image, avec le poil supprimé du trace set « Diffuse » met 48 secondes à se calculer. Pour rappel, le rendu original met 1 min 43 sec, plus du double (l’écart n’est pas aussi important sur des rendus de production, mais pas loin). Ni l’un, ni l’autre n’est une solution acceptable pour la production.

Comment on fait ?

Donc je disais : La Sibérie… :seSentCon:

OK, à partir d’ici il faut commencer à manipuler des trace set :enerve: , donc si vous n’êtes pas à l’aise avec ce concept, vous pouvez lâcher ce billet en choisissant :

  • Soit vous avez une grosse ferme de calcul, vous laisser les poils dans la Diffuse. :grenadelauncher:
  • Soit vous êtes limité par votre puissance de calcul, vous pouvez proposer à la production de niquer virer l’back. :siffle:

Et c’est gentil d’être passé ! :IFuckTheWorld:

Pour les autres, voici le moment que vous attendiez secrètement en commençant la lecture de ce billet, ce plaisir coupable qui vous prend quand vos temps de rendu foutent le camp, ce truc qui crée chez certains leads des envies de meurtre vis-à-vis de leurs graphistes partis en vacances, ce machin réfléchi et posé dans le wiki du studio avec plus grand sérieux du monde par le sup lighting en début de prod et qui n’a plus aucune réalité à la seconde où les premiers plans commencent à sortir. J’ai nommé : Les trace set. :youplaBoum:

En vrai, je taquine, car c’est loin d’être ingérable. :trollface:

En effet, comme le trace set par défaut, « Diffuse », est celui contenant tout ce qui est tracé par les rayons d’indirect (et c’est bien la raison pour laquelle on vire les poils de ce trace set), il suffit que les poils aient leur propre trace set. :idee:

On peut imaginer un trace set « Hair » (ou « Char_Hair », tant qu’à faire) contenant toutes les primitives de poil, et l’ajouter à la liste des trace set tracé par le (ou les) shader de Hair :

Avec une tel approche, les poils sont bien retirés du trace set « Diffuse » (c.à.d qu’ils ne sont pas pris en compte dans le calcul de l’indirect du reste de votre scène), mais ils sont pris en compte par le shader de Hair, et donc le back est calculé correctement. :papi:

Avec une telle approche le rendu est similaire à la première image (le back est joli tout pleins), à l’exception de l’AOV d’indirect qui devient totalement noir (les poils n’étant plus dans la diffuse) et le temps de rendu passe à 1 min 10 sec.

À vous de voir si c’est justifié. :sourit:

Conclusion

Comme le disait le poète :

Sauve ta tournette, créé un trace set.

À bientôt !

:marioCours: