Mental ray 3.9: L'Unified Sampling, explications
Par Narann le mardi, 10 mai 2011, 22:36 - Infographie 3D - Boulot - Lien permanent
Ce billet est la traduction d'un thread de CGTalk lancé par Bitter ou il explique le principe de la nouvelle technique de sampling utilisé dans mental ray 3.9: L'Unified Samplig.
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.
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.
Sommaire
La méthode de Monte Carlo
Avant de commencer, sachez que ce thread aborde la méthode de Quasi Monte Carlo...
Vu que je suis curieux, j'ai cherché un peu et je vous propose une misérable petite explication.
Je vais modestement tenter de vous éclaircir un peu sur ce qu'est la méthode de Monte Carlo, ainsi que ses variantes.
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:
D'après ce que j'en ai compris, la méthode de Monte Carlo 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".
Dans le cas du sampling, ce qu'on cherche à obtenir ("le résultat") est un endroit ou lancer un sample le plus "utile" possible.
Ce qui fait office de probabilité est "la signature" des samples. (Position+Direction).
Plus cette signature semble aléatoire, plus il faut, à priori, ajouter de sample.
Il existe plusieurs variantes des algorithmes de Monte Carlo (Quasi Monte Carlo, Deterministic Monte Carlo).
La doc officiel sur le DMC Sampler de Vray aborde un peu les différences:
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.
La doc officiel de Blender tente aussi une petite démystification du principe de QMC.
Si je comprend bien:
- MC renvoi toujours un résultat un peu différent, même si les valeurs données en entré (les probabilités) sont identiques.
- DMC renvoie toujours le même résultat si les probabilités données en entré sont identiques. D’où le D pour Deterministic (un peu comme, en Python, si on utilise un random avec un seed).
- QMC est un équivalent à DMC mais avec un méthode différente.
Je serais bien incapable de vous donner plus de détails.
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:
Les traductions
Ndt: Ceci est la traduction du premier post de Bitter
L'Unified Sampling de Maya 2012 dans mental ray
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).
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.
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é.
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.
Il résout également les problèmes de noise en générant son propre grain adaptatif.
Maintenant, le DOF et le Motion Blur raytracé est plus doux et plus rapide à calculer.
Vous pouvez rendre du Motion Blur raytracé. Le Motion Blur est maintenant visually adaptive.
En mode US, vous pouvez ignorer les time samples. Les zones avec peu de détails et/ou ayant des couleurs plates recevront le minimum de sample, indépendamment de leur quantité de Motion Blur.
La quantité de mémoire utilisé par le Motion Blur est maintenant minimal comparé à avant.
Les trois contrôleurs principaux
samples min = 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.
samples max = Le nombre maximum de samples utilisé par pixel.
samples quality = Le potar 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.
Si vous trouvez que le Motion Blur ou le DOF est granuleux, augmenter le samples max.
Mais dans la plupart des cas, vous pouvez augmenter le samples quality et laisser vos valeurs de samples assez large.
Ce potar de qualité est maintenant votre contrôleur de rendu!
Basiquement, la technique consiste à setter un min et un max et à utiliser le potar pour jauger la qualité.
Vous pouvez utiliser les diagnostics pour voir comment/ou vos samples sont envoyés et prendre une décision à partir de là.
Les diagnostiques sont embarquées dans un EXR, dans différents channels (voir plus bas).
Ndt: Le diagnostique joue un role important pour déterminer les valeurs optimales de rendu. On y reviendra.
Autres contrôleurs
sample error cutoff = 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é.
samples per object = 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).
Noter qu'il est fortement conseillé de désactiver le Scanline afin de ne pas diminuer les performances.
Le Scanline ralenti le rendu et ne devrait pas être activé par défaut dans Maya.
Il y a également trois channels intéressants de diagnostiques dans l'EXR quand vous rendez avec l'option diagnose samples.
Ils sont:
- L'error color estimé par pixel.
- Le nombre (absolue) de samples envoyé par pixels.
- Le temps passer à rendre le pixel (en secondes).
Démonstration (Ndt: C'est moi qui ai fait ces images pour rendre le truc plus évident...):
Note: Les points blancs sont surement due à la granularité du temps.
Voici la ligne MEL pour créer les string options:
select miDefaultOptions; int $idx = `getAttr -size miDefaultOptions.stringOptions`; setAttr -type "string" miDefaultOptions.stringOptions[$idx].name "unified sampling"; setAttr -type "string" miDefaultOptions.stringOptions[$idx].value "on"; setAttr -type "string" miDefaultOptions.stringOptions[$idx].type "boolean"; $idx = `getAttr -size miDefaultOptions.stringOptions`; setAttr -type "string" miDefaultOptions.stringOptions[$idx].name "samples min"; setAttr -type "string" miDefaultOptions.stringOptions[$idx].value "1."; setAttr -type "string" miDefaultOptions.stringOptions[$idx].type "float"; $idx = `getAttr -size miDefaultOptions.stringOptions`; setAttr -type "string" miDefaultOptions.stringOptions[$idx].name "samples max"; setAttr -type "string" miDefaultOptions.stringOptions[$idx].value "64."; setAttr -type "string" miDefaultOptions.stringOptions[$idx].type "float"; $idx = `getAttr -size miDefaultOptions.stringOptions`; setAttr -type "string" miDefaultOptions.stringOptions[$idx].name "samples quality"; setAttr -type "string" miDefaultOptions.stringOptions[$idx].value "0.5"; setAttr -type "string" miDefaultOptions.stringOptions[$idx].type "scalar"; $idx = `getAttr -size miDefaultOptions.stringOptions`; setAttr -type "string" miDefaultOptions.stringOptions[$idx].name "sample error cutoff"; setAttr -type "string" miDefaultOptions.stringOptions[$idx].value "0 0 0"; setAttr -type "string" miDefaultOptions.stringOptions[$idx].type "color"; $idx = `getAttr -size miDefaultOptions.stringOptions`; setAttr -type "string" miDefaultOptions.stringOptions[$idx].name "samples per object"; setAttr -type "string" miDefaultOptions.stringOptions[$idx].value "off"; setAttr -type "string" miDefaultOptions.stringOptions[$idx].type "boolean";
Ndt: Pour vous simplifier la vie, je vous invite à utiliser mon outil: enjoyMentalRayStringOptions
Techniquement, sample quality est une couleur. Mais pour pas mal de raisons, on préfèrera combiner les trois valeurs en une seule.
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.
Error Control
Ndt: Ceci est la traduction d'un autre post de Bitter
Voici une explication plus clair de l'error control de l'Unified Sampling
Les images qui suivent ont été générées via des paramètres de qualité graduel: 0.25 -> 0.75 -> 1.5
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).
Vous trouverez le fichier de diagnostic du rendu de qualité 1.5 ici:
Elle contient les 4 layers de diagnostique. Vous pouvez l'ouvrir avec imf_disp pour voir ces layers.
Pour le layer samples, 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.
Le rendu prend tout juste 11 minutes en 1280x720 à une qualité de 1.5 (sans compter le calcul du final gather).
J'utilise des shader BSDF avec du glossiness (visible sur les bureaux).
RC 0.3 info : rendering statistics RC 0.3 info : type number per eye ray RC 0.3 info : eye rays 4618306 1.00 RC 0.3 info : transparent rays 63490 0.01 RC 0.3 info : reflection rays 30493569 6.60 RC 0.3 info : shadow rays 335052362 72.55 RC 0.3 info : fg points interpolated 33898517 7.34 RC 0.3 info : on average 65.38 finalgather points used per interpolation RC 0.3 info : wallclock 0:10:30.95 for rendering RC 0.3 info : allocated 124 MB, max resident 166 MB GAPM 0.3 info : triangle count (including retessellation) : 247606
Le truc qui prend le plus de temps à calculer c'est les shadow rays. 72.55 rayons "eye ray" (Ndt: Sample?)
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.
Undersampling
Ndt: Ceci est la traduction d'un autre post de Bitter
samples min 0.1 samples max 1. samples quality 0.1
Vous pouvez jouer avec comme il vous plait.
Mon paramètre de samples min 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.
Conclusion
J'espère que vous aurez apprécié ces traductions qui m'ont personnelement pas mal éclairées sur le sujet.
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: ).
A bientôt!
Dorian
EDIT 2011 - 11 - 19: Il semble que je n'ai pas bien abordé la theorie qui entour le DMC sampler. Voici ma traduction sur le DMC sampler de Vray. C'est beaucoup plus précis (par un ancien de chez Blur).
Commentaires
Une page qui explique le DMC de Vray :
http://www.interstation3d.com/tutor...
Oui, j'avais oublié de donner le lien. ^^