Dorian Fevrier's blog - Mot-clé - aovJe m’appelle FEVRIER Dorian, je suis infographiste 3D passionné par mon métier, l’informatique en général, l’internet, la programmation et l’évolution de tout ce petit monde. Vous trouverez sur ce blog des tutoriaux, mes coups de cœurs, avis, etc.2024-01-02T23:48:05+01:00FEVRIER Dorianurn:md5:695d9c73474c33ce3dab043823509c4bDotclearFaire un AOV d’occlusion avec la DiffuseColor dans Guerillaurn:md5:9eabbc909fb9e257a5159df830d120062021-10-09T23:29:00+02:002021-11-18T10:24:26+01:00NarannInfographie 3D - Boulotambientaovguerillaocclusion<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_tn.png" style="float: left; margin: 0px 1em 1em 0px; width: 150px; height: 150px;" />Il y a plein de façons de faire de l’<em>ambiant occlusion</em>. :hehe: Certains sortent cette passe au moment du lighting pour donner de la flexibilité au compo ; pour assombrir les creux. D’autres sortent cette passe avant l’étape de rendu, au moment de l’animation, voir du layout ; pour du contrôle qualité. Dans chaque situation, le contenu de la passe d’<em>ambiant occlusion</em> est adapté au besoin ; pour du compo il faut qu’elle soit en niveaux de gris, pour du contrôle qualité on peut afficher chaque objet avec une couleur particulière, etc.</p>
<p>Quand le lookdev des assets est (enfin) disponible, il peut être intéressant d’avoir une <em>ambiant occlusion</em> générée avec les textures de lookdev plutôt que des couleurs uniformes. C’est ce que nous allons faire dans ce billet. :bravo:</p> <h3>Méthode de base</h3>
<p>Avant de faire des choses compliquées, on peut s’appuyer sur ce que Guerilla propose, à savoir les AOVs <em>Occlusion</em> et <em>Albedo</em>. Voici une scène éclairée avec amour :petrus: :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_001.png" style="margin: 0px auto; display: table; width: 261px; height: 203px;" /></p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_002.png" style="margin: 0 auto; display: table;" /></p>
<p>Le lookdev des objets, c’est juste une texture colorée différente mise dans l’attribut « DiffuseColor » de leur « Surface2 » respectif. :siffle:</p>
<p>On lui ajoute les deux AOVs, <em>Occlusion</em> et <em>Albedo</em> :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_003.png" style="margin: 0 auto; display: table;" /></p>
<p>Utiliser cette méthode implique de devoir recompositer les deux images en sortie de Guerilla (via un précomp, par exemple), mais ça nous oblige à gérer un processus externe. Ce serait quand même plus simple si Guerilla pouvait sortir l’ambiant occlusion en utilisant directement l’Albedo. :reflechi:</p>
<p>Ce n’est pas possible directement (on ne peut pas utiliser un AOV dans un autre AOV), mais on peut s’en rapprocher de façon détournée (disons).</p>
<h3>Logique de récupération des shaders dans Guerilla</h3>
<p>Petit rappel au cas où vous ne seriez pas au courant. :mayaProf:</p>
<p>Quand vous assignez un material dans un RenderGraph, Guerilla n’assigne en fait qu’un nom (ici, « Surface2 ») à l’attribut <em>shader.surface</em>. Pour vous donner une idée, sélectionnez un objet, faites « Shift+D » et regardez votre console pour voir la liste des attributs qui seront envoyées au moteur :</p>
<pre>
<code class="language-markdown">...
shade.opacity: 1
shade.opacitybakeres: {256,256}
shader.displacement: ""
shader.surface: "Surface2" << Notre assignation de shader de surface, ici.
shader.volume: ""
shade.scale: 1
shade.subshadersuseexternal: false
...</code></pre>
<p>Au moment de l’envoi au moteur, Guerilla va chercher le material auquel correspond ce nom en suivant une logique assez particulière :</p>
<ul>
<li>Votre scène.</li>
<li>La librairie.</li>
</ul>
<p>Pour faire court, si un material nommé « Surface2 » est présent à la racine de votre scène, il sera utilisé à la place du <em>Surface2</em> de la librairie :</p>
<p><img alt="Guerilla surface2 scene vs library" class="media" height="242" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/guerilla_ao_diffuse_color_001.png" style="margin: 0px auto; display: table;" width="405" /></p>
<p style="text-align: center;"><em>Ici, c’est le Surface2 à gauche qui sera envoyé au moteur, prenant le pas sur celui de la librairie, à droite. </em>:tuComprendRien:</p>
<p>Et comme vous le savez sûrement, il est possible de modifier le material importé dans votre scène. Ces deux particularités permettent, finalement, d’éditer le comportement d’un shader pour toute la scène. :idee:</p>
<p>Donc si on modifie notre <em>Surface2</em> importé localement afin que sa seule sortie soit une <em>occlusion</em> multipliée par son attribut <em>DiffuseColor</em>, le calcul d’illumination de tous les objets sera l’ambiant occlusion utilisant ses propres textures.</p>
<p>Faisons donc ça ! :youplaBoum:</p>
<h3>Méthode avancée</h3>
<p>Créez un shader Surface2 à la racine (« Ctrl+Espace », « surface2 », « Entrée ») :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_004.png" style="margin: 0px auto; display: table; width: 286px; height: 94px;" /></p>
<p>Le shader s’importe à la racine de votre scène :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_005.png" style="margin: 0px auto; display: table; width: 624px; height: 188px;" /></p>
<p>Entrez à l’intérieur et supprimez tout ce que vous y trouvez !</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_006.png" style="margin: 0 auto; display: table;" /></p>
<blockquote>
<p>Notez qu’un bug est présent en version 2.3.0, il faut laisser le nœud « Surface » pour avoir un rendu correct. Ce bug est corrigé en version 2.3.1.</p>
</blockquote>
<p>Ajouter un nœud AOV (« Ctrl+Espace », « aov », « Entrée ») :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_007.png" style="margin: 0px auto; display: table; width: 125px; height: 134px;" />Renommer « Value » par un nom perso « ColoredAO » :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_008.png" style="margin: 0px auto; display: table; width: 446px; height: 251px;" /></p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_009.png" style="margin: 0 auto; display: table;" /></p>
<p>Mettre un nœud « Occlusion » et le connecter à « ColoredAO » :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_010.png" style="margin: 0px auto; display: table; width: 231px; height: 192px;" /></p>
<p>Dans la RenderPass, créez un AOV. Vous pouvez le nommer comme vous voulez :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_011.png" style="margin: 0px auto; display: table; width: 249px; height: 139px;" /></p>
<p>Dans cet AOV, mettez <em>Accepted expression</em> à <em>[Technical] Primary</em> et <em>Shader Color</em> à <em>ColoredAO</em> :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_012.png" style="margin: 0px auto; display: table; width: 439px; height: 277px;" /></p>
<p>Si vous rendez à ce stade, vous aurez une occlusion tout simple :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_013.png" style="margin: 0px auto; display: table; width: 512px; height: 384px;" /></p>
<p>Mais ce qu’on veut, c’est de la couleur ! :perplex:</p>
<p>Pour ça, il faut renommer le paramètre responsable de la couleur (ici, blanche) pour qu’il utilise la « DiffuseColor ». Sélectionnez votre nœud « Occlusion » et renommez l’attribut « SkyColor » en « DiffuseColor » :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_014.png" style="margin: 0px auto; display: table; width: 269px; height: 457px;" /></p>
<p>Puis cochez « Exposed » :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_015.png" style="margin: 0px auto; display: table; width: 320px; height: 138px;" /></p>
<p>Notez que vous pouvez le faire en cliquant sur l’attribut du nœud, directement dans le graph :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_016.png" style="margin: 0px auto; display: table; width: 132px; height: 207px;" />Et sous vos yeux ébahis :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_017.png" style="margin: 0px auto; display: table; width: 512px; height: 384px;" /></p>
<h3>Que pour les « Surface2 » ?</h3>
<p>Si vous n’overridez que le <em>Surface2</em> sur votre scène de production, vous allez vite vous rendre compte que ça ne fonctionne pas sur beaucoup de surfaces. En effet, il faut faire cet override sur tous les types de shader que vous utilisez dans vos scènes. Avec un peu de chance ça devrait se résumer aux <em>Hair</em>, <em>Curve</em> et <em>Eye</em>.</p>
<p>Il faut adapter le nom de l’attribut pour chaque type de shader. Si dans le cas du « Surface2 », l’attribute « DiffuseColor » fera très certainement l’affaire, dans le cas du shader de <em>Hair</em> ou de <em>Curve</em>, vous utiliserez sûrement la « Color » ou la « RootColor », suivant votre workflow. :pasClasse:</p>
<p>Notez que vous pouvez aussi multiplier les couleurs vous-même si le cœur vous en dit (je n’ai jamais testé) :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_019.png" style="margin: 0px auto; display: table; width: 445px; height: 251px;" /></p>
<h3>Le cas du shader de Eye</h3>
<p>Le cas du Eye shader est plus compliqué, car il ne dispose pas d’attribut de shader défini, comme le « DiffuseColor » du « Surface2 ». :bete:</p>
<p>Pour que ça fonctionne, il faut l’évaluer totalement. Pour cela, connectez directement l’Albedo à occlusion, comme ici :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_10_09_ambiant_occlusion_aov_diffuse_color/scene_cube_and_sphere_018.png" style="margin: 0px auto; display: table; width: 405px; height: 251px;" /></p>
<p>Ceci évalue tout le shader des yeux, mais comme ils ne sont pas particulièrement coûteux, on peut se le permettre.</p>
<p>Voilà ! En espérant que ça serve à quelqu’un !</p>
<p>À très bientôt !</p>
<center>:marioCours:</center>Faire un AOV de translucence avec Guerillaurn:md5:593d9f409a9e93b5eef19fae39da14832021-09-19T18:25:00+02:002021-09-20T16:06:01+02:00NarannInfographie 3D - Boulotaovguerillarendutranslucence<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_09_18_guerilla_translucence/guerilla_translucence_tn.png" style="float: left; margin: 0px 1em 1em 0px; width: 150px; height: 150px;" />La <em>translucence</em> est un effet couramment utilisé en rendu pour les surfaces fines ; feuilles, papiers, etc. Il permet de récupérer l’illumination et les ombres projetées d’un côté pour les projeter de l’autre.</p>
<p>Si vous utilisez Guerilla (ce que vous devriez faire… :siffle: ) vous avez peut-être remarqué que la <em>translucence</em> n’est présente dans aucun AOV de base.</p> <h3>Réponse courte</h3>
<p>Vous avez des plans à sortir, pas l’temps d’niaiser. :grenadelauncher:</p>
<ul>
<li>Créez un AOV.</li>
<li>Mettez <strong>C<TD>.*#</strong> dans <em>Accept Expression</em>.</li>
<li>Rendez.</li>
<li>C’est gentil d’être passé. :baffed:</li>
</ul>
<h3>Réponse illustrée</h3>
<p>Si vous regardez du côté de <a href="http://guerillarender.com/doc/2.3/User%20Guide_Rendering_Light%20Path%20Expression.html">la documentation</a> des <em>Light Path Expression</em> (LPE), vous verrez qu’il est explicitement stipulé que la <em>translucence</em> ne fait pas partie de l’AOV de Diffuse :</p>
<blockquote>
<p>Note that this expresion <b>does not</b> include the translucence, as it is categorized as <strong class="lpe_tag"><TD></strong> for Transmitted Diffuse.</p>
</blockquote>
<p>Ça me fait penser qu’il faudra vraiment que je fasse un vrai billet sur les LPE… :pasClasse:</p>
<p>Si votre boulot c’est de sortir des images, je vous invite à regarder et vous familiariser avec ce tableau qui liste ce que les AOVs de base représentent en termes de LPE.</p>
<p>Je vais prendre la scène d’exemple livré avec Guerilla dans : Help/Samples/Surface.</p>
<p>Créez l’AOV. Nommez-le comme vous voulez (Utilisez « Translucence » si vous n’êtes pas inspiré… :jdicajdirien: ) et mettez le <em>light path expression</em> <strong>C<TD>.*#</strong> dans <em>Accept Expression</em> :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_09_18_guerilla_translucence/guerilla_translucence_panel.png" style="margin: 0px auto; display: table; width: 404px; height: 255px;" /></p>
<p>Note : Vous devriez pouvoir mettre « Caustics » dans <em>Ignore Expression</em> pour être cohérent avec les AOVs de base, mais je ne suis pas sûr de moi, à vérifier. :reflexionIntense:</p>
<p>Arrêtons-nous un peu sur cette expression. :reflechi:</p>
<p>Les LPE sont un peu au lancer de rayon ce que <a href="https://fr.wikipedia.org/wiki/Expression_r%C3%A9guli%C3%A8re" hreflang="fr" title="page wikipédia sur les expressions régulières">les expressions régulières</a> (<em>regex</em>) peuvent être aux chaînes de caractères. :redface:</p>
<p>Oui, donc il faut savoir ce que sont les <em>regexs</em>, mais si vous faites du lighting, je pars du principe que vous en avez déjà entendu parler. :youplaBoum:</p>
<p>Il y a trois types de propagation de rayons, chacune représenté par une lettre :</p>
<ul>
<li>Spéculaires « <strong>S</strong> ».</li>
<li>Glossy « <strong>G</strong> ».</li>
<li>Diffuse « <strong>D </strong>».</li>
</ul>
<p>Et quatre types de rayons :</p>
<ul>
<li>Réflexion « <strong>R </strong>» : Les rayons rebondissants sur la surface ; miroirs, parquets, métaux brossés, etc.</li>
<li>Transmission « <strong>T </strong>» : Ou « Réfraction », Les rayons entrants dans la surface ; verre, feuilles fines (nos surfaces translucides, justement).</li>
<li>Volume « <strong>V </strong>» : Les rayons entrants dans un volume ; fumée, nuages, etc.</li>
<li>Intra-objet « <strong>O </strong>» : Les rayons se propageant dans l’objet lui-même (SSS).</li>
</ul>
<p>Note : On pourrait caler un cinquième type pour les rayons de caméras « <strong>C</strong> », mais ce dernier ne peut pas se combiner à un type de propagation (c’est un rayon de caméra, point barre… :redface: ).</p>
<p>Et tout ça peut se mélanger :</p>
<ul>
<li><strong>RS</strong> les réflexions brutes (miroirs).</li>
<li><strong>RG</strong> les réflexions douces (parquets, métaux brossés).</li>
<li><strong>RD</strong> les réflexions de diffuse (illumination indirect).</li>
</ul>
<p>Pareil pour <strong>VS</strong>, <strong>VG</strong>, <strong>VD</strong>, etc. :hehe:</p>
<p>L’expression <strong>C<TD>.*# </strong>prend tous les rayons partant de la caméra (<strong>C</strong>), de type transmission diffuse (<strong>TD</strong>), quel que soit le type de rayon « après » <strong><TD></strong>.</p>
<p>Le « <strong>.*</strong> » est un caractère (le <em>point</em>) et un quantificateur (l’<em>astérisque</em>) :</p>
<ul>
<li>Le <em>point</em> est un caractère spécial voulant dire « n’importe quel rayon ».</li>
<li>L’<em>astérisque</em> est un quantificateur s’appliquant au caractère qu’il précède et veut dire « aucune fois, 1 fois ou plus ».</li>
</ul>
<p>Le dernier caractère « <strong>#</strong> » bloque l’expression qui ne peut aller plus loin (ça ne veut pas dire que le moteur s’arrête, juste que c’est cette partie du rayon qui sera stocké en AOV).</p>
<p>En gros, l’expression <strong>C<TD>.*# </strong>prends n’importe quel rayon venant de la <em>translucence</em>.</p>
<p>On a donc :</p>
<p>La Translucence direct : <strong>C<TD>#</strong><br />
La Translucence indirect : <strong>C<TD>.+#</strong><br />
Les deux (celle qu’on utilise ici) : <strong>C<TD>.*#</strong></p>
<p>Si vous êtes habitué aux regex, vous devriez comprendre ces expressions, mais ça ne nous dit pas vraiment ce qu’il y a dedans…</p>
<p>La « Translucence direct », c’est l’illumination <em>direct</em> sur la surface opposée à ce qu’on voit. C.-à-d. la lumière (direct) et les ombres projetées sur la face opposée à notre regard.</p>
<p>La « Translucence indirect » c’est l’illumination <em>indirect</em> (la diffuse) sur la surface opposée à ce qu’on voit. En gros, l’équivalent à ce que sortirait l’AOV de <em>Diffuse Indirect</em> si on regardait la surface de l’autre côté.</p>
<p>Mettez une couleur de translucence à l’une des sphères (un vert pur, pour montrer que vous avez du goût :vomit: ) :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_09_18_guerilla_translucence/guerilla_translucence_attribute.png" style="margin: 0px auto; display: table; width: 400px; height: 118px;" /></p>
<p>Puis rendez.</p>
<p>La Beauty :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_09_18_guerilla_translucence/guerilla_translucence_result_diffuse.png" style="margin: 0px auto; display: table; width: 241px; height: 160px;" />L’AOV <em>Translucence</em> :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_09_18_guerilla_translucence/guerilla_translucence_result_aov.png" style="margin: 0px auto; display: table; width: 279px; height: 177px;" /></p>
<p>Et voilà ! En espérant que ça serve à quelqu’un !</p>
<p>À très bientôt !</p>
<center>:marioCours:</center>Guerilla, Hair, et Back specularurn:md5:e76a2ab68fe302c89c0cd8f23e5b93582021-06-06T14:34:00+02:002021-09-21T14:41:19+02:00NarannInfographie 3D - Boulotaovguerillapoilrenduspéculaire<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/in_diffuse_wip_tn.png" style="float: left; margin: 0px 1em 1em 0px; width: 150px; height: 150px;" />Aujourd’hui un billet inutile et vraiment spécifique pour vous parler d’un problème que vous ne rencontrerez sûrement jamais. :laClasse: En fait il est probable que vous ne rencontriez ce problème que sur de la série, où la contrainte de la puissance de calcul est importante. :pafOrdi:</p>
<p>Quand on rend des poils avec le shader <em>Hair</em> de Guerilla (et je suppose avec n’importe quel autre moteur de rendu) il peut être intéressant de supprimer les-dit poils du trace set <em>« Diffuse</em> » pour économiser leur coût de calcul dans l’indirect (BIM ! Direct dans le bain sans politesse ni respect pour son lecteur :grenadelauncher: ), mais dans ce cas précis, on risque d’obtenir un effet bizarre, presque esthétique, et je vous propose de voir ce dont il s’agit. :hehe:</p> <h3>Le <em>back</em> dans le shader <em>Hair</em></h3>
<p>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 <a href="https://www.graphics.stanford.edu/papers/hair/hair-sg03final.pdf" hreflang="en">Light Scattering from Human Hair Fibers</a> devrait vous convaincre. <a href="https://www.cemyuksel.com/research/dualscattering/dualscattering.pdf" hreflang="en">Et</a> <a href="https://www.researchgate.net/profile/Eugene-Deon/publication/220506677_An_Energy-Conserving_Hair_Reflectance_Model/links/59dc2874a6fdcc1ec89fb0c0/An-Energy-Conserving-Hair-Reflectance-Model.pdf" hreflang="en">si</a> <a href="https://graphics.pixar.com/library/DataDrivenHairScattering/paper.pdf" hreflang="en">vous</a> <a href="https://benedikt-bitterli.me/pchfm/" hreflang="en">êtes</a> <a href="https://www.pbrt.org/hair.pdf" hreflang="en">motivé</a>…</p>
<p>Au passage, je pense que le rendu temps-réel est complètement à la ramasse sur ce sujet. <em>« Le temps-réel, c’est le futur »</em>, sauf si on a encore des cheveux, sinon : :vomit:</p>
<p>Si vous utilisez le shader <em>Hair</em> de Guerilla, dont la documentation se trouve <a href="https://guerillarender.com/doc/2.3/Library_Materials_Hair.html" hreflang="en" title="Page de documentation du shader Hair de Guerilla">ici</a> (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 ; <em>primary</em>, <em>secondary</em> et <em>back</em> (nous n’aborderons pas les paramètres <em>Multiple Scatter</em> et <em>Diffuse</em> :nannan: ).</p>
<p>Quand on regarde les images de la documentation officielle, on pourrait être tenté de confondre le <em>back</em> avec un effet de <em>rim</em> de light (une light, souvent forte, venant quasiment de derrière un modèle) :</p>
<p><a class="media-link" href="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/marschner.png"><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/guerilla_hair_back.png" style="margin: 0px auto; display: table;" width=200 height=200 /></a></p>
<p>Nous allons voir que le <em>back</em> n’a rien à voir avec une <em>rim</em>.</p>
<p>Cette image dérobée sur <a href="https://guerillarender.com/doc/2.3/Library_Materials_Curves.html" hreflang="en" title="Page de documentation du shader Guerilla Curve">la page de documentation</a> du shader <em>Curve</em> permet de simplifier le comportement qu’on cherche à reproduire avec ces trois composants :</p>
<p><a class="media-link" href="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/marschner.png"><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/.marschner_m.png" style="margin: 0px auto; display: table;" width=680 height=309 /></a></p>
<p>Nous avons donc trois composants :</p>
<ul>
<li>La primaire correspond aux réflexions à la surface du poil (en rouge sur le schéma).</li>
<li>La secondaire correspond aux réflexions internes à l’intérieur du poil (en violet).</li>
<li>Et une dernière, le <em>back</em> correspond à la transmission à travers le poil (en vert).</li>
</ul>
<p>Notez à que le <em>back</em> est dans l’alignement de la <em>light</em>.</p>
<p>C’est ici qu’on comprend quelle différence il y a avec une <em>rim</em> 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 <em>back</em> dépend de la lumière qui se trouve derrière. :reflechi:</p>
<p>En gros : Plus la lumière <em>derrière</em> le poil (donc devant vous) est importante, plus le spéculaire de <em>back</em> 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.</p>
<p><a class="media-link" href="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/maurane_back.jpg"><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/.maurane_back_m.jpg" style="margin: 0px auto; display: table;" width=680 height=255 /></a></p>
<p>Vous l’aurez compris, c’est ce que produit le <em>back</em> qui va nous intéresser.</p>
<h3>Rendu</h3>
<p>Tout ça c’est bien joli, mais ça donne quoi en image ? :petrus:</p>
<p>Voici six AOV d’un rendu :</p>
<p><a class="media-link" href="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/out_diffuse_wip.png"><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/out_diffuse_wip.png" style="margin: 0px auto; display: table;" width=600 height=400 /></a></p>
<p>La scène est composée :</p>
<ul>
<li>D’un plan avec <a href="https://drive.google.com/drive/folders/1K_G_hbFyohR8-xCCAlYx8xhsd_a7Ir7G" hreflang="en">une texture</a> de Maurus Loeffel (merci à lui) en <em>DiffuseColor</em>.</li>
<li>D’une sphère (rouge pur) faisant office de scalp à une procédurale de poils.</li>
<li>Sur les poils, un shader <em>Hair</em> par défaut, avec une <em>DiffuseColor</em> gris fonçé.</li>
<li>Une grosse <em>SquareLight</em> au-dessus (une « douche »).</li>
</ul>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/test_scene_guerilla.png" style="margin: 0px auto; display: table; width: 323px; height: 225px;" /></p>
<p>Dans l’ordre des AOVs, nous avons :</p>
<ul>
<li>Beauty, Albedo, Diffuse.</li>
<li>Specular, Reflection, IndDiffuse.</li>
</ul>
<p>Notez que les poils cachent totalement la sphère rouge (son scalp).</p>
<p>On remarque que le <em>back</em> est sur l’AOV de <em>Reflection</em> et semble visuellement jouer son rôle.</p>
<p>Mais pourquoi l’AOV de <em>Reflection</em> ?</p>
<p>Rappelez-vous : Le <em>back</em> 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 <em>back</em>, tout droit, devant lui (voir schéma). Le <em>back</em> 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 <em>back</em>).</p>
<p>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 <em>back</em>, mais quand on se situe au milieu et qu’on trace le <em>back</em>, on tombe rapidement sur un ou plus de poils, ce qui arrête son tracé. On comprend aussi que par extension, le <em>back</em> a un coup de calcul important, par rapport à ce qu’il apporte ; il est tracé partout, mais n’apparaît que sur les bords.</p>
<p>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:</p>
<p>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).</p>
<p>Maintenant faisons notre super <em>trick</em> 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 <em>« Diffuse »</em> (ici, via le nœud <em>« -Diffuse »</em>) :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/fur_out_diffuse.png" style="margin: 0px auto; display: table; width: 381px; height: 146px;" /></p>
<p>(Au passage, je ne vais pas en discothèque, parce que tout le monde sait bien que<a href="https://youtu.be/antqm4BdEgg?t=4" hreflang="fr">…</a>)</p>
<p>Bref, on vire les poils du trace set <em>« Diffuse »</em> et on rend :</p>
<p><a class="media-link" href="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/in_diffuse_wip.png"><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/in_diffuse_wip.png" style="margin: 0px auto; display: table;" width=600 height=400 /></a></p>
<p>On remarque immédiatement que l’AOV de <em>Reflection</em> 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:</p>
<p>Je vous disais que pour calculer le <em>back</em>, le moteur lance un rayon de réflexion, mais orienté dans son sens original (c’est le spéculaire de <em>back</em> 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.</p>
<p>Sauf qu’ici, il semble que tout le spéculaire de <em>back</em> se soit comporté comme s’il n’avait rencontré aucun poil… Comme si, le trace set utilisé pour tracer le <em>back</em> ne contenait pas les poils… D’ailleurs, il utilise quoi comme trace set Guerilla pour tracer ses poils ? :petrus:</p>
<p>Allez dans <em>« Hair / Advanced / Trace Set »</em> :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/guerilla_hair_trace_set_diffuse.png" style="margin: 0px auto; display: table; width: 405px; height: 226px;" /></p>
<p>Mais, les bras m’en tombent ! :bete:</p>
<p>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:</p>
<p>Vous l’aurez compris, en virant les poils du trace set <em>« Diffuse »</em>, vous avez purement et simplement supprimé les poils de leur propre réflexion… :slow_clap:</p>
<p>On peut se demander ce qu’on y gagne réellement : Après tout, il suffirait de remettre les poils dans le trace set <em>« Diffuse »</em> et on pourrait rendre sa production heureuse… :sourit:</p>
<p>C’est là qu’interviennent les temps de rendu. La dernière image, avec le poil supprimé du trace set <em>« Diffuse »</em> 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.</p>
<p><a class="media-link" href="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/maurane_rendu.jpg"><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/.maurane_rendu_m.jpg" style="margin: 0px auto; display: table;" width=680 height=255 /></a></p>
<h3>Comment on fait ?</h3>
<p>Donc je disais : La Sibérie… :seSentCon:</p>
<p>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 :</p>
<ul>
<li>Soit vous avez une grosse ferme de calcul, vous laisser les poils dans la <em>Diffuse</em>. :grenadelauncher:</li>
<li>Soit vous êtes limité par votre puissance de calcul, vous pouvez proposer à la production de <s>niquer</s> virer l’<em>back</em>. :siffle:</li>
</ul>
<p>Et c’est gentil d’être passé ! :IFuckTheWorld:</p>
<p>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:</p>
<p>En vrai, je taquine, car c’est loin d’être ingérable. :trollface:</p>
<p>En effet, comme le trace set par défaut, <em>« Diffuse »,</em> 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:</p>
<p>On peut imaginer un trace set <em>« Hair »</em> (ou <em>« Char_Hair »</em>, tant qu’à faire) contenant toutes les primitives de poil, et l’ajouter à la liste des trace set tracé par le (ou les) shader de <em>Hair</em> :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_06_guerilla_hair_back_spec_diffuse/trace_set_diffuse_hair.png" style="margin: 0px auto; display: table; width: 379px; height: 89px;" /></p>
<p>Avec une tel approche, les poils sont bien retirés du trace set <em>« Diffuse »</em> (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 <em>Hair</em>, et donc le <em>back</em> est calculé correctement. :papi:</p>
<p>Avec une telle approche le rendu est similaire à la première image (le <em>back</em> 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.</p>
<p>À vous de voir si c’est justifié. :sourit:</p>
<h3>Conclusion</h3>
<p>Comme le disait le poète :</p>
<blockquote>
<p>Sauve ta tournette, créé un trace set.</p>
</blockquote>
<p>À bientôt !</p>
<center>:marioCours:</center>Personnaliser ses AOV dans Guerillaurn:md5:c4b7ef687147cc53a32e497dc6c447462017-05-28T18:20:00+02:002017-06-01T10:56:11+02:00NarannInfographie 3D - Boulotaovguerillarendu<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2017_05_27_aov_personalise_guerilla/guerilla_custom_aov_tn.png" style="float: left; margin: 0 1em 1em 0;" />Ça fait un moment que je n’ai pas fais de tutoriel. En voici un tout petit principalement à destination des étudiants utilisant ou voulant (les biens inspirés :hehe: ) utiliser Guerilla pour leur projet de fin d’année.</p>
<p>L’idée étant de faire un tuto pour sortir un AOV personnalisé assignant une couleur suivant les objets. Nous allons ici utiliser de simples couleurs (rouge et bleu dans le cas d’un masque) mais sachez que vous pouvez remplacer cette couleur par une texture, de l’occlusion ou pleins d’autres choses.</p>
<p>En avant ! :enerve:</p> <p>Ouvrez Guerilla. La première chose à faire c’est une petite scène de test. Un plan, une sphère c’est parfait :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2017_05_27_aov_personalise_guerilla/guerilla_custom_aov_001.png" style="margin: 0 auto; display: table;" /></p>
<p style="text-align: center;">Avec ça, Votre projet de fin d’étude semble bien partis. Encore un peu de boulot et Pixar pleurera devant vos rendus. :gniarkgniark:</p>
<p>Ouvrez le <em>rendergraph</em> par défaut, glissez-déposer la sphère et le plan depuis la <em>Node List</em> pour créer un <em>path</em> puis créez un <em>material override</em> (Ctrl+Espace dans le <em>rendergraph</em>, tapez « mat », puis Entrer). Enfin connectez-moi tout ça sous cette forme :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2017_05_27_aov_personalise_guerilla/guerilla_custom_aov_002.png" style="margin: 0 auto; display: table;" /></p>
<p>Je traduis le graph ci-dessus : L’objet <em>Sphere</em> va se faire <em>overrider</em> un paramètre par le nœud <em>MaterialOverride</em>. Cette opération est ensuite fusionnée aux modifications de la branche principale via un nœud union. Il en va de même pour l’objet <em>Plane</em>. :zinzin:</p>
<p>Ensuite, on clique sur <em>MaterialOverride</em>, on tape le nom de l’<em>override</em> que l’on souhaite créer. Ici (par exemple) « MyMask1 » de type <em>Color</em>. On assigne la couleur rouge. On fait de même pour le <em>MaterialOverride</em> du <em>Plane</em> mais de couleur bleu :</p>
<p><a class="media-link" href="https://www.fevrierdorian.com/blog/public/billets/2017_05_27_aov_personalise_guerilla/guerilla_custom_aov_003.png"><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2017_05_27_aov_personalise_guerilla/.guerilla_custom_aov_003_m.png" style="margin: 0 auto; display: table;" /></a></p>
<p>Information intéressante à cette étape : Si vous cliquez sur le petit « M » à droite, vous pourrez sélectionner un sous-shader, notamment <em>Texture</em>, <em>Occlusion</em> et <a href="http://guerillarender.com/doc/1.4/Library_Attributes_Cloud.html" hreflang="en">Cloud</a>. Si vous êtes joueur et que vous souhaitez rendre des attributs présents dans vos alembic vous pouvez regarder du côté de <em>PrimVar</em> :hehe: ).</p>
<p>Maintenant nous avons des <em>overrides</em> sur des objets. Il faut pouvoir les rendre ! :grenadelauncher:</p>
<p>Créez un nouvel AOV (Cliquez sur le + à cote de l’AOV de <em>Beauty</em>). Renommez-le comme vous le voulez (je l’ai appelé « MyMask1 » mais en fait ce n’est pas important ici):</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2017_05_27_aov_personalise_guerilla/guerilla_custom_aov_004.png" style="margin: 0 auto; display: table;" /></p>
<p>Cliquez dessus puis, dans le champ <em>Shader Color</em>, mettez « MyMask1 » (c’est là qu’il faut mettre le même nom que les noms des <em>overrides</em> créés précédemment):</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2017_05_27_aov_personalise_guerilla/guerilla_custom_aov_005.png" style="margin: 0 auto; display: table;" /></p>
<p>Faites un rendu (Ctrl+R) puis sélectionnez l’AOV « MyMask1 » (dans le menu déroulant en bas à gauche de la <em>RenderView</em>) :</p>
<p><a class="media-link" href="https://www.fevrierdorian.com/blog/public/billets/2017_05_27_aov_personalise_guerilla/guerilla_custom_aov_006.png"><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2017_05_27_aov_personalise_guerilla/.guerilla_custom_aov_006_m.png" style="margin: 0 auto; display: table;" /></a></p>
<p>Et une petite image finale pour avoir une vision d’ensemble. :popcorn:</p>
<p><a class="media-link" href="https://www.fevrierdorian.com/blog/public/billets/2017_05_27_aov_personalise_guerilla/guerilla_custom_aov.png"><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2017_05_27_aov_personalise_guerilla/.guerilla_custom_aov_m.png" style="margin: 0 auto; display: table;" /></a></p>
<p>En espérant que ça vous mette le pied à l’étrier, n’hésitez pas à creuser un peu et à expérimenter. :joue:</p>
<p>À bientôt!</p>
<p>Dorian</p>
<p style="text-align: center;">:marioCours:</p>