Dorian Fevrier's blog - Mot-clé - samplingJe 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:695d9c73474c33ce3dab043823509c4bDotclearGérer des caméras sur-samplées dans Nukeurn:md5:896c795391d3f25659093390bf31d0482021-12-31T17:31:00+01:002022-01-03T10:49:02+01:00NarannInfographie 3D - Boulotalembiccameranukesampling<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/bad_shake_cam_tn.png" style="float: left; margin: 0px 1em 1em 0px; width: 150px; height: 150px;" />Avez-vous déjà eux des problèmes de rendu dans Nuke en utilisant des caméras ayant des samples entre les frames ? :reflechi:</p>
<p>Non ? Super ! Grace à ce billet, vous allez savoir comment gérer cette situation si un jour ça vous arrive ! :siffle:</p>
<p>On va parler de rendu, de Nuke, de <em>shake cam</em>, d’export Alembic, de sampling temporel, de <em>frame rate</em>, d’expressions, et toutes ses choses qui nous rappellent chaque jour à quel point nos vies sont formidables et méritent d’être vécues ! :petrus:</p> <p>Lors de l’import d’une caméra Alembic, Nuke <em>échantillonne</em> l’animation à la frame. C.à.d qu’il lit les valeurs de l’Alembic à chaque frame. C’est la raison pour laquelle il demande un <em>frame rate</em> :</p>
<p><img alt="Interface Nuke d’import de caméra" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/nuke_cam_abc_import_001.png" style="margin: 0px auto; display: table; width: 597px; height: 224px;" /></p>
<p>C’est parfait dans le cas d’un Alembic de caméra samplées à la frame, car chaque frame Nuke correspondra à un sample de votre Alembic. Il y aura donc une correspondance directe entre les samples de la caméra exportée et ce que Nuke lira.</p>
<p>En pratique on peut travailler comme ça sur la plupart des projets, alors pourquoi s’embêter ? :perplex:</p>
<h3>Pourquoi sur-sampler une caméra ?</h3>
<p>Quand vous avez régulièrement des mouvements de caméras très rapides dans vos plans, le fait de faire un export Alembic à la frame perds la profondeur du mouvement dans le motion blur, au rendu.</p>
<p>L’exemple le plus évident concerne les <em>shake cam</em>. Quand un <em>shake cam</em> un peu ample est samplé à la frame, chaque image se retrouve avec une sorte de flou directionnel dont la direction est aléatoire, ce qui n’est pas du plus bel effet.</p>
<p>Sur-sampler la caméra permet de garder la profondeur du mouvement de <em>shake</em>.</p>
<p>Bien entendu (et c’est trop souvent le cas en production) si la fréquence du <em>shake cam</em> entre les frames est trop importante, vos samples internes seront quasi-aléatoires, et vous aurez l’équivalent de micro-vibrations à la frame, ce qui n’est pas du plus bel effet :</p>
<p><img alt="Courbes de caméras superposées" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/bad_shake_cam_001.png" style="margin: 0px auto; display: table; width: 440px; height: 304px;" /></p>
<p>Ici, la belle courbe verte est le mouvement théorique du shake cam (le résultat de l’expression). On remarque que la fréquence est élevée entre les frames. La courbe orange est la courbe de l’Alembic exporté de cette caméra avec les samples (0, 0.125, 0.25, 0.375, 0.5) marqués en rouge. On remarque que la haute fréquence originale entraîne un sampling foireux du mouvement de caméra.</p>
<p>Par contre, un export de caméra sur-samplé d’un <em>shake cam</em> avec une fréquence faible entre les images (une demie période max) donnera une profondeur au motion blur.</p>
<p>Bref, on sur-sample pour les <em>shake cam</em>, mais uniquement si on arrive à garder leur fréquence a niveau de la frame… :tuComprendRien:</p>
<p>Un autre cas où le sur-sampling est justifié concerne les rotations de caméras rapides (un classique étant un objet qui passe devant la caméra très rapidement). Pour peu que cette rotation soit combinée à un déplacement et soyons fous, un <em>shake cam</em>, si vous ne sur-samplez pas, il y a fort à parier que le mouvement central soit une grosse bouilli, illisible.</p>
<p>Attention toutefois : Comme nous allons le voir, sur-sampler une caméra n’est pas gratuit et implique que tout ce qui utilisera ladite caméra soit capable d’interpréter correctement ces samples. Donc si votre projet n’a ni <em>shake cams</em>, ni mouvements rapides : Laissez tomber. Vous aurez sûrement d’autres problèmes à gérer.</p>
<p>Mais si vous êtes ici, c’est sûrement parce que vous avez déjà rencontré le problème, pas vrai ? :dentcasse:</p>
<h3>Comportement de Nuke</h3>
<p>Quand vous importez votre caméra Alembic dans Nuke avec le bon <em>frame rate</em>, ce dernier va créer une clef à chaque frame. Le comportement de Nuke est très con :</p>
<p>Il avance d’une frame. Prends la valeur des attributs dans l’Alembic, sans interpoler (nous y reviendrons), pose une clef pour ces attributs et passe à la frame suivante. C’est tout. :baffed:</p>
<h3>Le problème</h3>
<p>Une fois qu’on connaît le comportement de Nuke, vous comprenez aussi que si vous avez une caméra avec 5 samples (0, 0.125, 0.25, 0.375, 0.5), il ne lira et ne créera les clefs que sur le premier sample de chaque cycle (t=0). Il ne prendra ainsi pas compte des 4 samples intermédiaires (0.125, 0.25, 0.375, 0.5) ce qui peut être un vrai problème si vous souhaitez faire un rendu 3D dans Nuke, et si vous importez une caméra animée dans Nuke, c’est sûrement pour ça (je pense au <em>matte painting</em>).</p>
<h3>Contourner le problème</h3>
<p>Sachez qu’il existe un moyen détourné de forcer Nuke à lire tous les samples de notre Alembic et obtenir un mouvement de caméra sur-samplé (Merci à Vincent Glaize pour l’astuce). :gne:</p>
<p>Pour cela, il faut jouer sur la valeur de <em>frame rate</em> du nœud Nuke. L’idée est d’augmenter le <em>frame rate</em> de lecture de l’Alembic pour attraper tous les samples, pour ensuite scaler la vitesse de lecture suivant un ratio inverse.</p>
<p>Pas de panique, on va procéder par étapes. :hehe:</p>
<p>On a donc une caméra Alembic exporté en 24 fps, venant d’une scène en 24 fps (si je précise, c’est parce qu’il n’est pas rare de se faire avoir :gniarkgniark: ).</p>
<p>La caméra est exportée avec cette commande MEL :</p>
<pre>
<code class="language-cpp">AbcExport -j "-frameRange 1 2 -frameRelativeSample 0 -frameRelativeSample 0.125 -frameRelativeSample 0.25 -frameRelativeSample 0.375 -frameRelativeSample 0.5 -dataFormat ogawa -root |camera1 -file ma_super_cam.abc";
</code></pre>
<p>Voici la sortie de la commande <em>abcls</em> :</p>
<pre>
<code class="language-bash">$ abcls -t ma_supe_cam.abc
Time Samplings:
0 Uniform Sampling. Start time: 0 Time per cycle: 1
Max Num Samples: 1
1 Cyclic Sampling. Time per cycle:0.0416667
Start cycle times: 0.0416667, 0.046875, 0.0520833, 0.0572917, 0.0625
Max Num Samples: 10</code></pre>
<p>Au passage : Peu de gens le savent, mais un fichier Alembic stock ses samples en secondes, pas en frames.</p>
<p>Multipliez ses valeurs par le <em>frame rate</em> correspondant à votre export de caméra (ici 24) pour obtenir qu’équivalent en frame :</p>
<pre>
<code class="language-python">>>> samples = [0.0416667, 0.046875, 0.0520833, 0.0572917, 0.0625]
>>> [sample * 24 for sample in samples]
[1.0000008, 1.125, 1.2499992, 1.3750008, 1.5]</code></pre>
<p>Si on fait fi des problèmes de précision dûes à la sortie de la commande <em>abcls</em>, on obtient : 1.0, 1.125, 1.25, 1.375, 1.5. On a donc bien nos 5 samples aux bonnes positions.</p>
<p>Voici les courbes d’animation du <em>translate Y</em> de ma caméra original et son équivalent Alembic, en superposées. La courbe verte est l’animation originale de la caméra, la courbe orange, celle de l’Alembic :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/my_super_cam_sample_anim_001.png" style="margin: 0px auto; display: table; width: 513px; height: 284px;" /></p>
<p>Notez que cette animation va de l’image 1 à 1.5, la position des samples est en rouge.</p>
<p>Si on amène ça dans Nuke à un <em>frame rate</em> de 24, on ne verra rien, car la position du sample sur l’image 1 (et 2) est à 0 :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/my_super_cam_sample_nuke_24_001.png" style="margin: 0px auto; display: table; width: 322px; height: 81px;" /></p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/my_super_cam_sample_nuke_24_002.png" style="margin: 0px auto; display: table; width: 231px; height: 129px;" /></p>
<p>Donc quelle valeur de <em>frame rate</em> mettre pour faire correctement apparaître ces samples dans Nuke ? :reflexionIntense:</p>
<p>L’écart entre chaque sample est : 0.125 × la durée d’une image. 1/0.125 = 8, il y a donc 8 samples par image. Il faut donc multiplier le <em>frame rate</em> original par 8 pour avoir tous les samples de façon précise : On va donc entrer une valeur de <em>frame rate</em> de 24 × 8 = 192 dans notre nœud Nuke :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/my_super_cam_sample_nuke_192_001.png" style="margin: 0px auto; display: table; width: 368px; height: 75px;" /></p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/my_super_cam_sample_nuke_192_002.png" style="margin: 0px auto; display: table; width: 402px; height: 146px;" /></p>
<p>Vous l’aurez compris, on dit à Nuke qu’il n’y a pas des samples tous les 1/24 secondes, mais 1/192 secondes. Il va donc aller chercher, dans l’Alembic, la valeur des attributs à ces temps-là en pensant que c’est une frame. :laClasse:</p>
<h4>Aparté sur l’interpolation</h4>
<p>Je vous disais que lorsque Nuke cherchait les valeurs des samples, il n’interpolait pas. Ça veut dire qu’il faut que Nuke tombe à l’endroit exact où vos samples sont placés. Multipliez la valeur de <em>frame rate</em> par 5 (192 × 5 = 960), et regardez la courbe :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/my_super_cam_sample_nuke_960_001.png" style="margin: 0px auto; display: table; width: 288px; height: 59px;" /></p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/my_super_cam_sample_nuke_960_002.png" style="margin: 0px auto; display: table; width: 609px; height: 194px;" /></p>
<p>Explication : Quand Nuke tombe sur un temps qui n’a pas de sample dédié, il remonte au sample précédent, sans interpoler, prends sa valeur, et mets la clef. Il fait une sorte d’écho du sample précédent.</p>
<p>D’où l’importance de tomber exactement sur les samples exportés. :nevroz:</p>
<p>Bon, on a réussi à avoir l’entièreté des sur-samples pris en compte par Nuke, mais notre animation de caméra est maintenant 8x plus lente… Il va falloir scaler le temps. Pour cela, nous allons recréer une caméra identique, mais nous allons reconnecter les attributs via une expression multipliant le temps par 8 pour l’attribut en question :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/nuke_node_setup.png" style="margin: 0px auto; display: table; width: 313px; height: 305px;" /></p>
<p>Ici, <em>Camera_originale</em> est mon nœud de caméra pointant sur l’Alembic et lu à un <em>frame rate</em> de 192.</p>
<p><em>Camera_mirror</em> est une caméra vide créée manuellement avec des expressions pour relier chaque paramètre :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/nuke_cam_mirror_setup.png" style="margin: 0px auto; display: table; width: 400px; height: 66px;" /></p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/nuke_cam_mirror_setup_expr.png" style="margin: 0px auto; display: table; width: 495px; height: 89px;" /></p>
<p>Par exemple :</p>
<pre>
<code>Camera_originale.translate.y(t*8)</code></pre>
<p>Ça fait pas mal de paramètres à reconnecter, mais vous pouvez faire ça via un script où le faire manuellement une fois et garder votre setup.</p>
<p>Une fois cela fait, mettez un nœud de rendu, ajouter quelques samples, calez votre <em>shutter</em> (ici, 0.0 - 0.5) :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/nuke_render_param.png" style="margin: 0px auto; display: table; width: 418px; height: 230px;" /></p>
<p>En enfin, rendez :</p>
<p><img alt="" class="media" src="https://www.fevrierdorian.com/blog/public/billets/2021_12_10_nuke_alembic_cam_subsampling/nuke_render_final.png" style="margin: 0px auto; display: table; width: 383px; height: 209px;" /></p>
<p>Votre motion blur contient bien l’entièreté du mouvement. :banaeyouhou:</p>
<h3>Limitations</h3>
<p>Avant de finir il est important de garder quelques limitations en tête. Il est toujours assez difficile de faire des rendus cohérents à travers différents moteur, du fait des spécificités de chacun. Les moteurs de rendu de Nuke ont bien moins de features que les autres. Par exemple, votre contrôle sur la distribution des samples le long du <em>shutter</em> n’est pas pilotable ; dans la plupart des moteurs on peut alterner entre une distribution uniforme, en triangle, gaussienne, trapèze, etc.</p>
<h3>Conclusion</h3>
<p>Gardez à l’esprit qu’il n’est pas toujours nécessaire de s’embeter avec ça. Mais dès que ça bouge vite et que vous passez dans plusieurs logiciels de rendu pour un seul plan, vous risquez de ne pas pouvoir y couper.</p>
<p>J’espère que ce hack vous permettra de vous dépêtrer de quelques soucis fâcheux. :seSentCon:</p>
<p>À très bientôt !</p>
<center>:marioCours:</center>Mental ray 3.9: L'Unified Sampling, explicationsurn:md5:8d37f8fae77bf65c91dfd3417d89e27d2011-05-10T22:36:00+02:002013-07-26T18:09:55+02:00NarannInfographie 3D - Boulotfrmental raymonte carlorendusamplingtraduction<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/2011_04_23_Unified_Sampling_tn.png" alt="2011_04_23_Unified_Sampling_tn.png" style="float:left; margin: 0 1em 1em 0;" title="2011_04_23_Unified_Sampling_tn.png, mai 2011" height="150" width="150" />Ce billet est la traduction d'<a href="http://forums.cgsociety.org/showthread.php?t=970700">un thread</a> de CGTalk lancé par <a href="http://forums.cgsociety.org/member.php?u=34231">Bitter</a> ou il explique le principe de la nouvelle technique de sampling utilisé dans mental ray 3.9: L'<a href="http://docs.autodesk.com/MENTALRAY/2012/ENU/mental%20ray%203.9%20Help/files/manual/node76.html?highlighting=unified#unified_sampling">Unified Samplig</a>.</p>
<p>Cette nouvelle technique est beaucoup plus efficace car elle prend en compte les samples et leur direction, alors que l'ancienne méthode ne se basait que sur le contraste de la couleur des samples dans l'image finale.</p>
<p>Cette technique est plus ou moins déjà utilisé dans Vray (au d'autres raytracers) mais c'est un vrai plaisir de voir cette nouvelle méthode de sampling dans mental ray.</p> <h3>Sommaire</h3>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/05/10/Mental-ray-3.9-L-Unified-Sampling-explications#la_methode_de_monte_carlo">La méthode de Monte Carlo</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/05/10/Mental-ray-3.9-L-Unified-Sampling-explications#les_traductions">Les traductions</a>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/05/10/Mental-ray-3.9-L-Unified-Sampling-explications#unified_sampling_maya_2012">L'Unified Sampling de Maya 2012 dans mental ray</a>
<ul>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/05/10/Mental-ray-3.9-L-Unified-Sampling-explications#trois_controleur_principaux">Les trois contrôleurs principaux</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/05/10/Mental-ray-3.9-L-Unified-Sampling-explications#autres_controleurs">Autres contrôleurs</a></li>
</ul></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/05/10/Mental-ray-3.9-L-Unified-Sampling-explications#error_control">Error Control</a></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/05/10/Mental-ray-3.9-L-Unified-Sampling-explications#undersampling">Undersampling</a></li>
</ul></li>
<li><a href="https://www.fevrierdorian.com/blog/post/2011/05/10/Mental-ray-3.9-L-Unified-Sampling-explications#conclusion">Conclusion</a></li>
</ul>
<h3>La méthode de Monte Carlo <a name="la_methode_de_monte_carlo"></a></h3>
<p>Avant de commencer, sachez que ce thread aborde la méthode de Quasi Monte Carlo...</p>
<p>Vu que je suis curieux, j'ai cherché un peu et je vous propose une <del>misérable</del> petite explication.</p>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/3020447896_c836a6058f_o.jpg" title="3020447896_c836a6058f_o.jpg"><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/.3020447896_c836a6058f_o_m.jpg" alt="3020447896_c836a6058f_o.jpg" style="display:block; margin:0 auto;" title="3020447896_c836a6058f_o.jpg, avr. 2011" height="373" width="560" /></a></p>
<center><small><i><a href="http://www.flickr.com/photos/harmrhebergen/3020447896/">Photo</a> par <a href="http://www.flickr.com/photos/harmrhebergen/">Harm Rhebergen</a> sous licence Créative <a href="http://creativecommons.org/licenses/by-nc-nd/2.0/deed.fr">by-nc-nd</a>. Merci à lui! :sourit:</i></small></center>
<p>Je vais modestement tenter de vous éclaircir un peu sur ce qu'est la méthode de Monte Carlo, ainsi que ses variantes.</p>
<blockquote><p>Si vous connaissez un site qui parle de la chose de manière clair, sans trop de blah blah mathématique, n'hésitez pas à me laisser un commentaire. Je me ferai un plaisir, si j'arrive à comprendre le truc, à approfondir mon billet. :dentcasse:</p></blockquote>
<p>D'après ce que j'en ai compris, <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/M%C3%A9thode_de_Monte-Carlo">la méthode de Monte Carlo</a> est un moyen d'obtenir un résultat le plus juste possible en se basant sur des probabilités. Normalement, cette méthode ne fait "que ça".</p>
<p>Dans le cas du sampling, ce qu'on cherche à obtenir ("le résultat") est un endroit ou lancer un sample le plus "utile" possible.</p>
<p>Ce qui fait office de probabilité est "la signature" des samples. (Position+Direction).</p>
<p>Plus cette signature semble aléatoire, plus il faut, à priori, ajouter de sample.</p>
<p>Il existe plusieurs variantes des algorithmes de Monte Carlo (Quasi Monte Carlo, Deterministic Monte Carlo).</p>
<p>La doc officiel sur <a href="http://www.spot3d.com/vray/help/150SP1/render_params_dmc.htm">le DMC Sampler de Vray</a> aborde un peu les différences:</p>
<blockquote><p>The difference between pure Monte Carlo sampling and deterministic Monte Carlo is that the first uses pseudo-random numbers which are different for each and every evaluation (and so re-rendering a single image will always produce slightly different results in the noise), while deterministic Monte Carlo uses a pre-defined set of samples (possibly optimized to reduce the noise), which allows re-rendering an image to always produce the exact same result.</p></blockquote>
<p>La doc officiel de Blender tente aussi <a href="http://www.blender.org/development/release-logs/blender-246/qmc-sampling/">une petite démystification</a> du principe de QMC.</p>
<p>Si je comprend bien:</p>
<ul>
<li>MC renvoi toujours un résultat un peu différent, même si les valeurs données en entré (les probabilités) sont identiques.</li>
<li>DMC renvoie toujours le même résultat si les probabilités données en entré sont identiques. D’où le <em>D</em> pour <em>Deterministic</em> (un peu comme, en Python, si on utilise <a href="http://docs.python.org/release/2.6.3/library/random.html">un random avec un seed</a>).</li>
<li>QMC est un équivalent à DMC mais avec un méthode différente.</li>
</ul>
<p>Je serais bien incapable de vous donner plus de détails.</p>
<p>Après ce fiasco d'explication (quoi que j'ai personnellement appris pas mal de choses en cherchant), je vous propose de passer à la traduction! :sourit:</p>
<h3>Les traductions <a name="les_traductions"></a></h3>
<blockquote><p>Ndt: Ceci est la traduction du <a href="http://forums.cgsociety.org/showpost.php?p=6936586">premier post</a> de <a href="http://forums.cgsociety.org/member.php?u=34231">Bitter</a></p></blockquote>
<h4>L'Unified Sampling de Maya 2012 dans mental ray <a name="unified_sampling_maya_2012"></a></h4>
<p>L'Unified Sampling est une méthode de sampling se basant sur des calculs de probabilités (QMC pour Quasi-Monte-Carlo) sur "le plan" de l'image (le plan de la camera ou est rendu l'image en fait).</p>
<p>A la différence de l'Anti-Aliasing classique, qui fonctionne sur la base d'une grille (les pixels) et d'un contraste des couleurs sur cette même grille, l'US (Unified Sampling) est basé, par couche, sur une distance optimale entre les samples, qui sont envoyés en se basant sur des modèles de probabilité (de type QMC), et une estimation de l'erreur.</p>
<p>Ce qui veut dire que vous pouvez calculer de la géométrie fine tel que des hairs et des furs en utilisant le raytrace au lieu du rasterizer, tout en conservant une bonne qualité.</p>
<p>L'US samplera de la géométrie plus petite qu'un pixel tout en nécessitant, généralement, moins de samples en interne.</p>
<p>Il résout également les problèmes de noise en générant son propre grain adaptatif.</p>
<p><strong>Maintenant, le DOF et le Motion Blur raytracé est plus doux et plus rapide à calculer.</strong></p>
<p>Vous pouvez rendre du Motion Blur raytracé. Le Motion Blur est maintenant <em>visually adaptive</em>.</p>
<p>En mode US, vous pouvez ignorer les <em>time samples</em>. Les zones avec peu de détails et/ou ayant des couleurs <em>plates</em> recevront le minimum de sample, indépendamment de leur quantité de Motion Blur.</p>
<p>La quantité de mémoire utilisé par le Motion Blur est maintenant minimal comparé à avant.</p>
<h5>Les trois contrôleurs principaux <a name="trois_controleur_principaux"></a></h5>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/mental_ray_box.png" title="mental_ray_box.png"><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/.mental_ray_box_m.jpg" alt="mental_ray_box.png" style="display:block; margin:0 auto;" title="mental_ray_box.png, mai 2011" height="372" width="560" /></a></p>
<center><small><i><a href="http://www.flickr.com/photos/29745333@N02/2827317485/">Photo originale</a> par <a href="http://www.flickr.com/photos/29745333@N02/">gwenflickr</a> sous licence Créative <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.fr">by-nc-sa</a>. Merci à lui! :sourit:</i></small></center>
<p><em><strong>samples min</strong></em> = Le nombre minimum de samples utilisé par pixels (les valeurs en dessous de 1 sous-sampleront les pixels). Ces valeurs ne seront pas soumis à des puissance comme l'Anti-Aliasing standard. Ce sont des valeurs absolues.</p>
<p><em><strong>samples max</strong></em> = Le nombre maximum de samples utilisé par pixel.</p>
<p><em><strong>samples quality</strong></em> = Le <em>potar</em> principal de l'US. Plus il est grand, meilleur c'est. 1.0 Peut être considéré comme une valeur de production. Il m'arrive de monter ce paramètre plus haut, 2 ou 3, cela dépend de la quantité de noise/petits détails que j'ai. 0.3 est une bonne valeur pour la preview.</p>
<p>Si vous trouvez que le Motion Blur ou le DOF est granuleux, augmenter le <em>samples max</em>.</p>
<p>Mais dans la plupart des cas, vous pouvez augmenter le <em>samples quality</em> et laisser vos valeurs de samples assez large.</p>
<p>Ce potar de qualité est maintenant votre contrôleur de rendu!</p>
<p>Basiquement, la technique consiste à setter un min et un max et à utiliser le potar pour jauger la qualité.</p>
<p>Vous pouvez utiliser les <em>diagnostics</em> pour voir comment/ou vos samples sont envoyés et prendre une décision à partir de là.</p>
<p>Les diagnostiques sont embarquées dans un EXR, dans différents channels (voir plus bas).</p>
<blockquote><p>Ndt: Le diagnostique joue un role important pour déterminer les valeurs optimales de rendu. On y reviendra.</p></blockquote>
<h5>Autres contrôleurs <a name="autres_controleurs"></a></h5>
<p><em><strong>sample error cutoff</strong></em> = Défini quand arrêter de sampler. C'est une tolérance de couleur qui commence "par le bas" (couleur noire). Plus la valeur est haute, plus les zones claires sont ignoré. C'est un paramètre très sensible qui est rarement utilisé.</p>
<p><em><strong>samples per object</strong></em> = Utilise les valeurs de sampling setté "par objet". Au même titre que précédemment, ces valeurs de min et max sample par objet doivent être absolue (et non des puissances de deux).</p>
<p>Noter qu'il est fortement conseillé de désactiver le Scanline afin de ne pas diminuer les performances.</p>
<p>Le Scanline ralenti le rendu et ne devrait pas être activé par défaut dans Maya.</p>
<p>Il y a également trois channels intéressants de diagnostiques dans l'EXR quand vous rendez avec l'option <em>diagnose samples</em>.</p>
<p>Ils sont:</p>
<ul>
<li>L<em>'error color</em> estimé par pixel.</li>
<li>Le nombre (absolue) de samples envoyé par pixels.</li>
<li>Le temps passer à rendre le pixel (en secondes).</li>
</ul>
<p>Démonstration (Ndt: C'est moi qui ai fait ces images pour rendre le truc plus évident...):</p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/2011_04_23_Unified_Sampling_009.png" alt="2011_04_23_Unified_Sampling_009.png" style="display:block; margin:0 auto;" title="2011_04_23_Unified_Sampling_009.png, avr. 2011" height="480" width="640" /></p>
<center><i>L'image originale (Image HDR de <a href="http://smartibl.com/sibl/archive.html">sIBL Archive</a> sous licence <a href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/">Creative by-nc-sa</a>. Merci à eux! :sourit: ).</i></center>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/2011_04_23_Unified_Sampling_001.png" alt="2011_04_23_Unified_Sampling_001.png" style="display:block; margin:0 auto;" title="2011_04_23_Unified_Sampling_001.png, avr. 2011" height="220" width="599" /></p>
<center><i>Le fichier en question</i></center>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/2011_04_23_Unified_Sampling_002.png" alt="2011_04_23_Unified_Sampling_002.png" style="display:block; margin:0 auto;" title="2011_04_23_Unified_Sampling_002.png, avr. 2011" height="360" width="337" /></p>
<center><i>La liste des channels disponibles.</i></center>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/2011_04_23_Unified_Sampling_003.png" alt="2011_04_23_Unified_Sampling_003.png" style="display:block; margin:0 auto;" title="2011_04_23_Unified_Sampling_003.png, avr. 2011" height="223" width="120" /></p>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/2011_04_23_Unified_Sampling_004.png" alt="2011_04_23_Unified_Sampling_004.png" style="display:block; margin:0 auto;" title="2011_04_23_Unified_Sampling_004.png, avr. 2011" height="271" width="457" /></p>
<center><i>Il faut bricoler un peu pour visualiser chaque channel. :hehe:</i></center>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/2011_04_23_Unified_Sampling_006.png" alt="2011_04_23_Unified_Sampling_006.png" style="display:block; margin:0 auto;" title="2011_04_23_Unified_Sampling_006.png, avr. 2011" height="398" width="601" /></p>
<center><i>Le nombre de sample au pixel (Le chiffre en bas à droite. Ici: 13 samples)</i></center>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/2011_04_23_Unified_Sampling_007.png" alt="2011_04_23_Unified_Sampling_007.png" style="display:block; margin:0 auto;" title="2011_04_23_Unified_Sampling_007.png, avr. 2011" height="578" width="711" /></p>
<center><i>Le temps (en secondes) passer par pixel. (Le chiffre en bas à droite. Ici: 0.03 sec). Notez qu'on voit la forme de la bounding box. :sourit:</i></center>
<blockquote><p>Note: Les points blancs sont surement due à la <a href="http://www.siteduzero.com/tutoriel-3-14136-maitrisez-le-temps.html#ss_part_1">granularité du temps</a>.</p></blockquote>
<p><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/2011_04_23_Unified_Sampling_008.png" alt="2011_04_23_Unified_Sampling_008.png" style="display:block; margin:0 auto;" title="2011_04_23_Unified_Sampling_008.png, avr. 2011" height="512" width="677" /></p>
<center><i>L'error color estimé. (Encore un truc de Monte Carlo d'mes fesses :baffed: ).</i></center>
<p>Voici la ligne MEL pour créer les string options:</p>
<pre class="mel mel">select miDefaultOptions<span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> $idx <span style="color: #339933;">=</span> `getAttr <span style="color: #339933;">-</span>size miDefaultOptions.<span style="color: #202020;">stringOptions</span>`<span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">name</span> <span style="color: #ff0000;">"unified sampling"</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">value</span> <span style="color: #ff0000;">"on"</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">type</span> <span style="color: #ff0000;">"boolean"</span><span style="color: #339933;">;</span>
$idx <span style="color: #339933;">=</span> `getAttr <span style="color: #339933;">-</span>size miDefaultOptions.<span style="color: #202020;">stringOptions</span>`<span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">name</span> <span style="color: #ff0000;">"samples min"</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">value</span> <span style="color: #ff0000;">"1."</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">type</span> <span style="color: #ff0000;">"float"</span><span style="color: #339933;">;</span>
$idx <span style="color: #339933;">=</span> `getAttr <span style="color: #339933;">-</span>size miDefaultOptions.<span style="color: #202020;">stringOptions</span>`<span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">name</span> <span style="color: #ff0000;">"samples max"</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">value</span> <span style="color: #ff0000;">"64."</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">type</span> <span style="color: #ff0000;">"float"</span><span style="color: #339933;">;</span>
$idx <span style="color: #339933;">=</span> `getAttr <span style="color: #339933;">-</span>size miDefaultOptions.<span style="color: #202020;">stringOptions</span>`<span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">name</span> <span style="color: #ff0000;">"samples quality"</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">value</span> <span style="color: #ff0000;">"0.5"</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">type</span> <span style="color: #ff0000;">"scalar"</span><span style="color: #339933;">;</span>
$idx <span style="color: #339933;">=</span> `getAttr <span style="color: #339933;">-</span>size miDefaultOptions.<span style="color: #202020;">stringOptions</span>`<span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">name</span> <span style="color: #ff0000;">"sample error cutoff"</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">value</span> <span style="color: #ff0000;">"0 0 0"</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">type</span> <span style="color: #ff0000;">"color"</span><span style="color: #339933;">;</span>
$idx <span style="color: #339933;">=</span> `getAttr <span style="color: #339933;">-</span>size miDefaultOptions.<span style="color: #202020;">stringOptions</span>`<span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">name</span> <span style="color: #ff0000;">"samples per object"</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">value</span> <span style="color: #ff0000;">"off"</span><span style="color: #339933;">;</span>
setAttr <span style="color: #339933;">-</span>type <span style="color: #ff0000;">"string"</span> miDefaultOptions.<span style="color: #202020;">stringOptions</span><span style="color: #009900;">[</span>$idx<span style="color: #009900;">]</span>.<span style="color: #202020;">type</span> <span style="color: #ff0000;">"boolean"</span><span style="color: #339933;">;</span></pre>
<blockquote><p>Ndt: Pour vous simplifier la vie, je vous invite à utiliser mon outil: <a href="http://forums.cgsociety.org/showthread.php?p=6941790">enjoyMentalRayStringOptions</a></p></blockquote>
<p>Techniquement, <em>sample quality</em> est une couleur. Mais pour pas mal de raisons, on préfèrera combiner les trois valeurs en une seule.</p>
<p>A noter: Il s'agit d'une première implémentation et je trouve qu'elle est bonne sur pas mal de points. Vous remarquerez que les hards edges ne sont pas définies du mieux possible (surtout en Arch Viz). C'est un point à améliorer qui a déjà été mentionné. Tout comme le reste, je suppose que cette feature s’améliora dans le temps.</p>
<h4>Error Control <a name="error_control"></a></h4>
<blockquote><p>Ndt: Ceci est la traduction d'un <a href="http://forums.cgsociety.org/showpost.php?p=6964385&postcount=19">autre post</a> de <a href="http://forums.cgsociety.org/member.php?u=34231">Bitter</a></p></blockquote>
<p>Voici une explication plus clair de l'error control de l'Unified Sampling</p>
<p>Les images qui suivent ont été générées via des paramètres de qualité graduel: 0.25 -> 0.75 -> 1.5</p>
<p>Vous remarquerez comment l'erreur perçu diminue à chaque valeur. Les zones ayant le plus d'erreurs sont les plus colorées. Vous pouvez voir les erreurs de chaque couleur en regardant chaque channel (RGB).</p>
<p>0.25
<a href="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/quality0250.jpg" title="quality0250.jpg"><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/.quality0250_m.jpg" alt="quality0250.jpg" style="display:block; margin:0 auto;" title="quality0250.jpg, mai 2011" height="315" width="560" /></a></p>
<p>0.75
<a href="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/quality0750.jpg" title="quality0750.jpg"><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/.quality0750_m.jpg" alt="quality0750.jpg" style="display:block; margin:0 auto;" title="quality0750.jpg, mai 2011" height="315" width="560" /></a></p>
<p>1.5
<a href="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/quality15.jpg" title="quality15.jpg"><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/.quality15_m.jpg" alt="quality15.jpg" style="display:block; margin:0 auto;" title="quality15.jpg, mai 2011" height="315" width="560" /></a></p>
<p>Vous trouverez le fichier de diagnostic du rendu de qualité 1.5 ici:</p>
<p><a href="http://www.mediafire.com/?v2tvv4ja25wark4">diagnostic.exr</a></p>
<p>Elle contient les 4 layers de diagnostique. Vous pouvez l'ouvrir avec imf_disp pour voir ces layers.</p>
<p>Pour le layer <em>samples</em>, vous serez amené à ramener l'exposition à -5.0 pour voir l'image. Placez ensuite votre curseur sur les pixels pour récupérer différentes valeurs.</p>
<p>Le rendu prend tout juste 11 minutes en 1280x720 à une qualité de 1.5 (sans compter le calcul du final gather).</p>
<p>J'utilise des shader BSDF avec du glossiness (visible sur les bureaux).</p>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/quality15beauty.jpg" title="quality15beauty.jpg"><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/.quality15beauty_m.jpg" alt="quality15beauty.jpg" style="display:block; margin:0 auto;" title="quality15beauty.jpg, mai 2011" height="315" width="560" /></a></p>
<pre class="bash bash">RC <span style="color: #000000;">0.3</span> info : rendering statistics
RC <span style="color: #000000;">0.3</span> info : <span style="color: #7a0874; font-weight: bold;">type</span> number per eye ray
RC <span style="color: #000000;">0.3</span> info : eye rays <span style="color: #000000;">4618306</span> <span style="color: #000000;">1.00</span>
RC <span style="color: #000000;">0.3</span> info : transparent rays <span style="color: #000000;">63490</span> <span style="color: #000000;">0.01</span>
RC <span style="color: #000000;">0.3</span> info : reflection rays <span style="color: #000000;">30493569</span> <span style="color: #000000;">6.60</span>
RC <span style="color: #000000;">0.3</span> info : shadow rays <span style="color: #000000;">335052362</span> <span style="color: #000000;">72.55</span>
RC <span style="color: #000000;">0.3</span> info : <span style="color: #7a0874; font-weight: bold;">fg</span> points interpolated <span style="color: #000000;">33898517</span> <span style="color: #000000;">7.34</span>
RC <span style="color: #000000;">0.3</span> info : on average <span style="color: #000000;">65.38</span> finalgather points used per interpolation
RC <span style="color: #000000;">0.3</span> info : wallclock <span style="color: #000000;">0</span>:<span style="color: #000000;">10</span>:<span style="color: #000000;">30.95</span> <span style="color: #000000; font-weight: bold;">for</span> rendering
RC <span style="color: #000000;">0.3</span> info : allocated <span style="color: #000000;">124</span> MB, max resident <span style="color: #000000;">166</span> MB
GAPM <span style="color: #000000;">0.3</span> info : triangle count <span style="color: #7a0874; font-weight: bold;">(</span>including retessellation<span style="color: #7a0874; font-weight: bold;">)</span> : <span style="color: #000000;">247606</span></pre>
<p>Le truc qui prend le plus de temps à calculer c'est les shadow rays. 72.55 rayons "eye ray" (Ndt: Sample?)</p>
<p>J'ai des portal lights sur les fenètres avec un High Samples seulement à 16. Cela dit, j'ai un rendu clean. J'ai quelques artefacts de final gather mais ils ne serait pas difficile de s'en occuper.</p>
<h4>Undersampling <a name="undersampling"></a></h4>
<blockquote><p>Ndt: Ceci est la traduction d'un <a href="http://forums.cgsociety.org/showpost.php?p=6964394&postcount=20">autre post</a> de <a href="http://forums.cgsociety.org/member.php?u=34231">Bitter</a></p></blockquote>
<pre class="bash bash">samples min <span style="color: #000000;">0.1</span>
samples max <span style="color: #000000;">1</span>.
samples quality <span style="color: #000000;">0.1</span></pre>
<p>Vous pouvez jouer avec comme il vous plait.</p>
<p>Mon paramètre de <em>samples min</em> sample maintenant tout les 10 pixels avec un max de 1 sample par pixel. Je pourrai augmenter le maximum mais ça utilisera plus de samples si ma quality augmente aussi.</p>
<p><a href="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/undersample.jpg" title="undersample.jpg"><img src="https://www.fevrierdorian.com/blog/public/billets/2011_04_23_Unified_Sampling/.undersample_m.jpg" alt="undersample.jpg" style="display:block; margin:0 auto;" title="undersample.jpg, mai 2011" height="315" width="560" /></a></p>
<h3>Conclusion <a name="conclusion"></a></h3>
<p>J'espère que vous aurez apprécié ces traductions qui m'ont personnelement pas mal éclairées sur le sujet.</p>
<p>C'est toujours interessant de savoir comment fonctionne une "nouvelle" technique (je met des guillemets car mental ray est surement un des derniers raytracer "high end" qui intègre cette méthode de sampling. Enfin bon... :pasClasse: ).</p>
<p>A bientôt!</p>
<p>Dorian</p>
<p><strong>EDIT 2011 - 11 - 19:</strong>
Il semble que je n'ai pas bien abordé la theorie qui entour le <em>DMC sampler</em>. Voici <a href="http://fevrierdorian.com/wiki/index.php?title=V-Ray_-_Le_DMC_Sampler_d%C3%A9mystifi%C3%A9_%28Traduction%29" hreflang="fr">ma traduction</a> sur le <em>DMC sampler</em> de Vray. C'est beaucoup plus précis (par un ancien de chez <a href="http://www.blur.com/" hreflang="en">Blur</a>).</p>
<center>:marioCours:</center>