Dorian Fevrier's blog - Mot-clé - ambientJe 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>