V-Ray - Le DMC Sampler démystifié (Traduction)

Remerciements

Ceci est la traduction d'un article de Toni Bratincevic: Demystifying V-Ray DMC Sampler.

Je l'ai traduit avec son aimable autorisation.

Introduction

Dans ce tutorial, Je vais vous expliquer les bases de la technique du DMC sample. Mais avant d'entrer dans le moindre détail technique, on va faire le tour du sampler alternatifs de VRay: Adaptive Subdivision.

Je ne mentionnerai pas le Fixed Rate sampling car son fonctionnement est évident.

L'Adaptive Subdivision sampling est utilisée par pratiquement tout les moteurs de rendu biased du marche. C'est une technique relativement vieille qui fonctionne bien dans la plupart des cas. Elle vous donnera des images propre et plutôt bien sample. Son fonctionnement est parfait pour des images fixes, mais compare au DMC sampler il a tendance à oversampler les images à des endroit pour pourriez diminuer le nombre de sample. Comme je l'ai dit, le subdivision sampler est présent dans la plupart des moteurs de rendu biaised du marche. Il semblerait toutefois que, du fait des retours positif des utilisateurs de VRay, ces moteurs passent à des algorithmes de sampling type DMC. Il y a un moteur de rendu, que je connais, qui utilise une technique similaire au DMC et ces deux moteurs (ndt: VRay. Pour le second, l'auteur parle sûrement de Arnold) sont de plus en plus utilisés dans les gros studios, précisément pour ces raisons... DMC est de loin la meilleur technique de raytrace pour obtenir un DOF et un motion blur 3D avec un temps de rendu raisonnables.

Calcul du sampling, l'Adaptive sampling

Le truc commun aux moteurs de rendu biased est qu'il utilisent quasiment tous un sampling adaptatif. Qu'est ce ça signifie?

Pour l'instant, simplifions et considéreront un rendu de 3 pixels sur 3 (3x3).

Quand vous cliquez sur render, VRay, ou n'importe quel autre moteur de rendu, lancera neuf samples (un sample par pixel). Nous allons partir du principe que les samples sont projetés depuis le center des pixels.

Vray_demistyfing_dmc_sampling_01.gif
Sampling initial sur une grille 3x3. 1 sample par pixel.

Pour ceux d'entres vous qui ne savent pas trop comment le raytracing fonctionne, faisons une rapide présentation, c'est très simple. Imaginez que vous ayez une camera et une grille devant la camera représentant la résolution final de votre rendu (3x3 dans notre cas). Disons que vous avez des objets placés dans votre scène. Quand VRay commence son rendu, il dessinera une droite partant du centre de la camera, passant par le milieu du pixel (un des carres de la grille) et finira sur l'objet le plus proche qui intersecte cette droite. Un vector est en fait projeté depuis le centre de la camera et parcours la scène à l'aveuglette jusqu'à ce qu'il frappe quelque chose. Le point d'intersection sur l'objet sert de référence pour calculer les infos de couleur de cet objet en ce point (couleur du material, diffusion, reflection, refraction, etc...) et renverra les informations collectées à VRay en lui disant “voici la couleur de ce pixel”.

Les rayons projetés depuis la camera sont appelés les eye ray our primary ray. Tout autre rayon projeté (depuis un material par exemple) est appelé secondary ray. Retenez ça car nous allons souvent mentionner ces deux types de rayon dans cet article. Voici une illustration simple afin de bien comprendre le principe de fonctionnement du raytracing...

Vray_demistyfing_dmc_raytracing_simplified.gif

Camera Le centre de la camera est traité comme un point dans l'espace a partir duquel les rayons sont projeté dans la scène au travers des pixels. Pixel Les rayons projetés depuis la camera passe a travers les pixels et continue leur chemin dans la scène. Objets de la scène Quand le rayon passe a travers le pixel il parcours la scène jusqu’à intersecter un objet.
Couleur de l'objet Une fois que la couleur est calculée au point d'intersection, elle est renvoyée aux moteur sous forme de valeurs RGB et vous obtenez la première information de couleur pour ce pixel. Un shadow ray est envoyé sur la light pour voir si cet objet est obscurcie par d'autres objets de la scène. Si c'est le cas, le point est considéré comme étant dans l'ombre. Les reflection rays sont projetés dans la scène pour vérifier que d'autres objets sont visibles dans la reflection. Point d'intersection Au point d'intersection du eye ray sur l'objet (géométrie), les materials de cet objet son activés et le moteur de rendu calcul comment ce material réagit aux lights de la scène en envoyant des rayons secondaires.

La même procédure est faite pour chacun des 9 pixels de la grille, et vous avez votre image. Le problème si on s’arrête la c'est que chaque pixel n’aura eu qu'un seul sample, et ce sample ne renvoi qu'une seule couleur parmis le nombre potentiellement infinie de couleur que le pixel peut contenir. Dans la réalité, si vous placez cette grille devant votre camera, vous aurez en fait bien plus qu'une simple couleur, vous aurez une moyenne des milliers de couleurs que le pixel contient. Dans la mesure où c'est quelque chose d'impossible à faire dans un moteur de rendu (vous ne pouvez pas projeter une infinité de rayons car votre temps de rendu serait potentiellement infini...), les développeurs on eux quelques idées pour deviner dans quels pixels relancer les samples. C'est l'adaptive sampling. Le nombre de rayon est adapté en fonction de la complexité de l'image rendu... Donc dans les zones ou il y a un fort contraste de couleur entre les pixels, il projettera plus de sample. On peut imaginer qu'il envoi 25 rayons dans un seul pixel, puis fait une moyenne des valeurs obtenues pour ce pixel alors que les zones ayant une couleur constante ne recevront qu'un seul sample et ne perdront pas de temps à oversampler ces pixels.

Vray_demistyfing_dmc_sampling03a.gif Vray_demistyfing_dmc_sampling03b.gif
La grille après le rendu des samples initiaux. Renverra une couleur par pixel. En se basant sur une tolérances des différences de couleur des pixels, le rendu projettera plus de samples sur certains pixels pour affiner la couleur.
Vray_demistyfing_dmc_smp_01.jpg Vray_demistyfing_dmc_smp_02.jpg Vray_demistyfing_dmc_smp_03.jpg
Fixed Sampling 1 sample par pixel Temps de rendu: 1.9 sec Fixed Sampling 100 samples par pixel Temps de rendu: 2 min 55 sec Adaptive Sampling Min 1 Max 100 samples Temps de rendu: 1 min 1 sec

La particularité commune entre l'Adaptive Subdivision et le DMC samplers est qu'ils sont tout les deux adaptive, mais ils fonctionnent d'une manière totalement différente. Commençons avec le subdivision sampling car c'est la plus vieille des techniques et il est bon de la connaître pour pouvoir comprendre l'avantage qu'il y a à utiliser le DMC.

Le Subdivision sampler

Quand je parlais de sampling dans le paragraphe précédant, j'ai mentionné comment les samples initiaux sont projetés depuis le centre du pixel. Le Subdivision sampler fonctionne en fait un peu différemment. Les samples ne sont pas placés sur le centre des pixels mais dans les coins, comme sur cette image:

Vray_demistyfing_dmc_sampling_02.gif
Le Subdivision Sampler place les samples initiaux dans les coins des pixels.

Une fois que les rayons initiaux sont projetés dans la scène et que les informations sont collectées, le subdivision sampler analyse ces informations et décide quels pixels nécessitent plus de samples. Pour chaque pixel, les samples pris dans les coins sont comparés... Si la différence de couleur est plus grande que le color threshold des paramètres de rendu (voir image), VRay subdivisera ce pixel une fois de plus et projettera plus de samples dans ce pixel.

Vray_demistyfing_dmc_dec_01.gif
En se basant sur le paramètre Clr Thresh des options de rendu, VRay va comparer la différence de couleur entre les samples des bords des pixels. Si la différence est plus grande que la valeur de threshold, il projettera plus de samples dans ce pixel. Si ce n'est pas le cas, il arrêtera de sampler le pixel et renverra la couleur final de ce pixel.
Example A Example B
Vray_demistyfing_dmc_dec_02.gif Vray_demistyfing_dmc_dec_03.gif
Les samples initiaux sont projetés sur les bords de chaque pixel, les informations de couleur sont récupérées. La couleur du premier pixel est très proche de celle du second pixel. Puisque cette différence de couleur est en dessous de la tolérance définie dans les paramètres de rendu, VRay décidera de ne plus projeter de samples pour ce pixel. La différence de couleur entre le premier pixel est le second est importante. Bien au dessus de la valeur de tolérance, ce qui veut dire que VRay enverra plus de samples dans ce pixel. Le nombre maximum de samples pour un pixel est défini par le paramètre Max. rate. 2, dans notre cas, spécifie un maximum de 16 samples supplémentaires par pixel. Vray_demistyfing_dmc_dec_04.gif

Ce procédé est exécuté un certain nombre de fois jusqu’à ce que le color threshold soit bon ou que le nombre maximum de samples par pixel défini par Max. rate soit atteint. Retenez bien que la valeur de subdivision maximum définit dans le Subdivision sampler ne représente pas le nombre maximum de samples récupéré par pixel. Il représente combien de fois le pixel sera subdivisé, soit:

Max. rate Samples
0 1
1 4
2 16
3 64
4 128

Rappelez vous que certains samples sont partagés entre les pixels (dans les coins) donc basiquement, si vous settez un Max Rate à 2, VRay utilisera en fait 25 samples maximum au total (9 samples à l’intérieur du pixel + 16 samples sur les bords, utilisés par les autres pixels). Pour un Max Rate à 1, un seul sample sera projeté dans le pixel mais 8 autres samples (partagés avec les autres pixels) seront projetés sur les bords. Voyez l'image suivante pour plus d'explications:

Adaptive Subdivision Sampler
Vray_demistyfing_dmc_dec_05.gif
...pour certains pixels, plus de samples sont projetés, pour d'autre moins. Cela dépend de la différence de contraste entre les samples à l’intérieur et sur les bords du pixel. Cet exemple a un subdivision sampler setté à Min 0 et Max 2, ce qui veut dire qu'un sample initial est envoyé par pixel dans les coins supérieurs gauches (donc partagés avec les autres pixels). En fonction de la différence de couleurs, l'oversampling peut monter jusqu’à 16 samples supplémentaires par pixel.

Maintenant, le principal problème avec le subdivision sampler c'est qu'il ne base sa décision de lancer plus ou moins de samples dans le pixel qu'en fonction des infos qu'il récupère sur les bords des pixels. Il n'a pas connaissance des informations de couleur qui entourent le pixel. Il ne sait que ce qui ce passe sur les bords. Cela fonctionne sur certaines scènes, mais quand il y a un grand nombre de petits objets ayant des textures détaillées, les informations de couleur des samples venant des bords du pixel ne suffisent plus. Ce qu'il faut pour prendre la bonne décision quand à oversampler le pixel, c'est toutes les informations de couleur des pixels autour. C'est exactement ce que le DMC sampler fait. C'est pour ça que dans le cas d'une scène très détaillé contenant beaucoup de lignes fines (par exemple), le DMC sampler' prendra une bien meilleur décision sur ou placer des samples supplémentaires dans la scène et dans l'image, spécialement si on parle d'une animation. Elle sera plus propre, plus stable, sans changement net entre les frames. L'image qui suit montre le principe:

Caster ou pas caster?...
Vray_demistyfing_dmc_dec_06.gif
La décision de caster ou non les rayons dans le pixel est basée sur les informations des couleurs qui sont sur les bords des pixels. C'est une spécificité de l'Adaptive Subdivision sampler qui peut causer des problèmes sur des scènes très détaillées ou connaitre les infos de couleur des pixels environnant pourrait être plus efficace.
Adaptive Subdivision Sampler DMC sampler
Vray_demistyfing_dmc_thin_01.gif Vray_demistyfing_dmc_thin_02.gif
Cette technique pose de gros problèmes pour sampler les objets fins de la scène. Dans cet exemple simple, vous pouvez constater que les lignes sont cassées. Il n'y a pas assez de samples envoyés dans les zones ou il devrait y en avoir. Ce problème est uniquement lié au fait que l'adaptive subdivision sampler se base sur les informations dont il dispose sur les bords des pixels pour sampler ou non. Dans cet exemple, j'ai setté le Color Threshold à 0.01, le Min Subdivs à 0 (ce qui correspond, rappelez vous, à 1 sample par pixel), et un Max Subdivs à 3 ce qui correspond à une subdivision du pixel en trois temps soit 64 samples supplémentaires au maximum. 64 samples par pixel est largement suffisant pour obtenir de jolies lignes mais le soucis est que VRay n’atteint tout simplement pas cette limite. Le DMC sampler n'a pas ce genre de soucis car il base sa décision sur les informations de couleur des pixels autour du pixel en cours de sampling. Grâce à ça, il peut détecter les très fines variations et sampler efficacement, diminuant les artefacts. Tout comme le subdivision sampler, le DMC est setté à Min 1 et Max 8 ce qui, dans notre cas, veut dire qu'il castera 1 sample initial par pixel, et ira jusqu’à 64 samples si nécessaire. Le paramètre Color threshold et setté à 0.01 comme l'exemple précédant.

Quand le subdivision sampler est utilisé, chaque zone de la scène nécessitant d’être oversampler pour avoir un résultat propre (glossy reflection, refraction, brute force GI, DOF et motion blur) enverra quasiment le nombre de samples défini dans ces options (subdivs). Le tout sera combiné pour donner une couleur moyenne, et cette couleur sera comparée aux samples des alentours, puis la décision d'oversampler ou non ces pixels sera prise. Ce qui veut dire que si vous avez 20 samples disponibles pour sampler le DOF, 10 pour le motion blur et 100 pour la reflection gloss des objets de votre scène, il est possible que vous calculiez un très grand nombre de sample pour un pixel. Ceci produira un résultat propre au prix d'un temps de rendu allongé car pour chaque sample supplémentaire de l'image pris dans un pixel, vous allez projeter X samples supplémentaire (pour le motion blur, DOF, gloss, etc...), et ce, même si vous n'avez pas besoin d'un tel nombre de rayons secondaires (reflection, refraction, shadow, etc...) pour obtenir un joli sampling de votre image... C'est à ce moment la que des algorithmes centralized adaptive tel que le DMC entrent en jeux... Effectivement ce système contrôle chaque zone de la scène ou plus d'un sample est nécessaire pour obtenir des infos propres (tel que les reflection gloss).

Mais avant de sauter à pieds joints dans des exemples utilisant le DMC sampler, regardons l'onglet en question et essayons de comprendre comment ses différentes options peuvent influencer sur le rendu. Rappelez vous que cet onglet n'est pas utilisé que quand le DMC sampler est activé mais aussi quand Adaptive Subdivision sampling et Fixed sampling sont actifs. La seule différence est que quand on utilise l'Adaptive Subdivision sampler, le calcul des primary rays est détaché de celui des secondary rays dans les materials comme le glossy reflection, alors qu'avec le DMC tout est combiné dans ces options (primary + secondary + motion blur + dof).

DMC Sampler options

Regardons ces options une à une... Vous pouvez également utiliser l'aide VRay, mais les explications qui suivent seront peut être plus simple. Je vais prendre le cas ou un nombre X de rayons de reflection glossy est projeté depuis le material... Ce qui arrive une fois que le sample de l'image est projeté depuis un pixel de la caméra et quand ce rayon touche des objets et qu'un material nécessitant de la reflection glossy est appelé. Gardez en tête que c'est un cas extrême pour bien visualiser les différences, mais en pratique, changer ces options produira des différences plus subtiles.

Adaptive amount

Exemple: Si, dans un material, vous avez 100 samples (10 subdivs) disponibles pour sampler des reflection glossy, setter l'Adaptive amount à 0.5 obligera VRay à n'utiliser que 50% des samples (50 samples dans notre cas). Il décidera ensuite si vous avez besoin de plus de sample. En fait, une fois ces 50 samples initiaux lancé, d'autres le sont, un par un et chaque fois qu'un nouveau sample est calculé, VRay le compare à la moyenne des samples déjà calculés. Si sa contribution à cette moyenne n'est pas assez élevé, il ne projettera plus de samples car il considérera que récupérer plus de samples n'est pas pertinent (car ne contribuant pas suffisamment à ceux déjà calculés).

Si l'Adaptive amount est setté à 0.7, vous enverrez 30% des 100 samples. 0.0 projettera les 100 samples et 1 (fully adaptive) projettera le nombre de sample définit dans le paramètre Min Samples. Après ça, il sera adaptive et ne prendra uniquement que les samples nécessaire au rendu de la reflection glossy. Min samples définit une “sécurité” car si Adaptive amount est définit sur 1, VRay ne peut pas prendre de décisions intelligente sur si il est nécessite d'utiliser plus de samples de reflection car il devra se baser uniquement sur les deux samples initiaux pris pour les reflection glossy... Donc dans notre example, avec Min samples à 8, vous faites en sorte que quelle que soit la valeur définit dans Adaptive amount, le nombre minimum de sample récupéré sur les reflection glossy (ou refraction, shadow, etc...) sera de 8, après quoi il commencera à être adaptive.

Vray_demistyfing_dmc_dmc_sampler_options_adaptivness_01.gif

Vray_demistyfing_dmc_dmc_sampler_options_adaptivness_01.jpg Vray_demistyfing_dmc_dmc_sampler_options_adaptivness_02.jpg Vray_demistyfing_dmc_dmc_sampler_options_adaptivness_03.jpg
Adaptive amount 0 Tout les samples de reflection du material sont pris pour chaque rayon touchant le sol. Adaptive amount 0.5 50% des samples de la reflection glossy sont pris. Après quoi, le calcul de la reflection glossy devient adaptive, ne récupérant que le nombre de rayon nécessaire pour satisfaire le Noise threshold. Adaptive amount 1.0 Dans la mesure où cet valeur est à 1, Min samples est activé, ce qui veut dire que 8 samples de reflection glossy initiaux sont pris. Après quoi, le calcul des relfection glossy devient adaptive, ne récupérant que le nombre de rayon nécessaire pour satisfaire le Noise threshold.

Revoyons mon explication visuelle du raytracing:

Vray_demistyfing_dmc_dmc_sampler_options_adaptivness_concept.gif

Premier shéma

Quand un primary ray (eye ray) est projeté dans la scène au travers du pixel, il touche un objet. Une fois que ces objet est intersecté, son material est appelé et, dans la mesure où ce material a de la relfection glossy, il va essayer de projeter le nombre de rayons défini dans les propriétés du material. Gardez à l'esprit que ce nombre est un carré ce qui veut dire que 10 subdivs produiront 100 rayons au maximum pour sampler la reflection glossy.

Second shéma

La reflection glossy défini dans le material projettera un nombre X de rayons de reflection (en rouge dans l'image en bas à gauche). Le nombre setté dans Adaptive amount définie combien de reflection rays seront envoyés dans la scène avant que le calcul de la reflection glossy ne passe en adaptive. Ce qui veut dire que si le paramètre Subdivs de l'onglet Reflection du material est setté à 10, le nombre maximum de reflection rays projeté depuis le material peut être 100. Mais en settant l'Adaptive amount à 0.5, VRay ne projettera que 50 rayons initiaux. Après ça, il lancera un seul rayon, vérifiera que ce rayon contribue suffisamment à la couleur de reflection. Si ce n'est pas le cas, il arrête de sampler la reflection. Si c'est le cas, il continue à envoyer plus de samples de reflection jusqu’à ce qu'il atteigne une valeur donnant une couleur de relfection propre (limité par le Noise threshold). Si il atteint le nombre maximum de subdivision (100 dans notre cas), il s’arrête immédiatement.

Noise threshold

Si l'Adaptive amount est setté à 0.5 et si, imaginons qu'on ait une scène avec des materials avec de la reflection glossy avec 100 samples possibles (subdivs 10), VRay projettera 50 samples puis deviendra adaptive en se basant sur le Noise threshold. Ce qui veut dire que tout nouveau sample pris après les 50 samples initiaux sera moyenné avec les samples déjà existant (les 50 samples initiaux donc) et si sa contribution (ce sample fait t'il suffisamment varier la couleur du pixel?) est plus grande que la valeur définit par le paramètre Noise threshold, VRay enverra un sample supplémentaire jusqu'à ce qu'il atteigne la valeur de Noise threshold. A l'inverse, si sa contribution n'est pas suffisante et est en dessous de Noise threshold, VRay arrêtera de sampler cette reflection et terminera le calcul de la reflection glossy pour ce material.

Voici quelques exemples pour vous montrer comment le paramètre Noise threshold influence la qualité des reflections. C'est un paramètre très important qui, dans le cas d'un rendu de prod, doit rester compris entre 0.005 et 0.01.

Vray_demistyfing_dmc_dmc_sampler_options_noise_01.gif

Vray_demistyfing_dmc_dmc_sampler_options_noise_01.jpg Vray_demistyfing_dmc_dmc_sampler_options_noise_02.jpg Vray_demistyfing_dmc_dmc_sampler_options_noise_03.jpg
Noise threshold 0.01 Noise threshold 0.1 Noise threshold 1.0

Min Samples

Même si vous avez 100 samples de reflection possible pour sampler la reflection glossy, si l'Adaptive amount est setté à 1 (fully adaptive), VRay ne projettera que 1 ou 2 samples de reflection et il ne sera pas capable de prendre une décision intelligente pour savoir si il doit projeter ou non, d'autres samples.

Pour éviter ça, Min Samples définit le nombre minimum de samples à calculer avant que l'Adaptive amount entre en jeu. VRay projettera toujours ces samples (8 dans notre cas) pour chaque valeur de reflection glossy d'un material avant de commencer à être adaptive.

Vray_demistyfing_dmc_dmc_sampler_options_minimum_01.gif

Vray_demistyfing_dmc_dmc_sampler_options_minimum_01.jpg Vray_demistyfing_dmc_dmc_sampler_options_minimum_02.jpg Vray_demistyfing_dmc_dmc_sampler_options_minimum_03.jpg
Min samples 50 Min samples 8 Min samples 2

Global subdivs multiplier

C'est un multiplicateur pour chaque valeur de la scène qui nécessite de la subdivision (multisampling) afin d’affiner le résultat. Cela peut concerner les subdivs des area shadows des area light, les subdivs des reflection glossy ou la refraction, les subdivs du motion blur, les subdivs du DOF, etc...

Donc par exemple, si vous settez la reflection glossy d'un material à 10 et Global Subdivs à 2, la subdivision du material sera en fait de 20 (10x2). Si il est setté à 0.2, cela diminuera les subdivisions de la reflection et vous aurez une subdivision de 2. Augmenter cette valeur donnera un meilleur résultat mais au prix d'un temps de rendu plus lent. Rappelez vous que ce paramètre influence toutes les valeurs de subdivision dans la scène, et si vous rencontrez des soucis de sampling, je vous recommande vivement d'aller chercher, directement sur le material posant problème, la valeur de subdivision à modifier plutôt que de passer par ce paramètre qui augmente le sampling de la scène dans son ensemble.

Vray_demistyfing_dmc_dmc_sampler_options_global_sdmult.gif

Vray_demistyfing_dmc_dmc_sampler_options_global_sdmult_01.jpg Vray_demistyfing_dmc_dmc_sampler_options_global_sdmult_02.jpg Vray_demistyfing_dmc_dmc_sampler_options_global_sdmult_03.jpg
Global subdivs multiplier 10 Global subdivs multiplier 1 Global subdivs multiplier 0.1

Bienvenue dans le monde magique et pas intuitif du DMC sampler

Avec ce qu'on vient d'apprendre plus haut, il va être facile de comprendre comment le DMC sampler fonctionne. La première chose que nous devons savoir (et c'est une point très important du DMC sampler) c'est que la totalité des informations des pixels environnants que VRay a samplé est pris en considération quand il décide d'oversampler ou non un pixel en cours de calcul. Nous avons déjà vu le résultat sur une image ou je vous montrai une teapot en wireframe. Mais voyons plus précisément ce qu'il se passe.

Vray_demistyfing_dmc_dmc_subdiv_02.gif Vray_demistyfing_dmc_dmc_subdiv_01.gif
Adaptive subdivision sampler Avec ce sampler seul les samples sur les bords des pixels sont pris en compte pour décider si un pixel nécessite plus de samples. DMC sampler Avec ce sampler, toutes les informations de couleur des pixels environnant sont utilisées pour décider si un pixel nécessite plus de samples ou non.

Ça ne semble peut-être pas important mais ça l'est dans la mesure où ça aide vraiment à bien saisir toute les variations de couleur de la scène. Comparé à l'Adaptive subdivision sampler, ou les samples initiaux sont pris sur les bords des pixels, le DMC sampler projette les premiers samples aléatoirement dans chaque pixel, et si il décide d'oversampler un pixel, il ne le fera pas en suivant une grille comme l'Adaptive subdivision sampler. En effet, la distribution des samples en DMC est aléatoire, sans modèle prédéfini. Cela dit, le D de DMC correspond à deterministic cela veut dire qu'il suivra un modèle (deux rendus d'un même cadrage sont complètement identiques) mais il sera basé sur des nombres à faibles écarts ce qui le différencie du QMC, qui était utilisé dans les premières version de VRay.

Les gens se demande souvent quel est la raison pour laquelle le DMC sampler peut gérer le motion blur et le DOF plus rapidement que le Subdiv sampler. La réponse réside dans la façon dont le DMC sampler contrôle et influence chaque zone de la scène ou il faut oversampler (subdiviser), et c'est pour cette raison que vous allez projeter moins de samples pour obtenir un résultat fin, sans avoir à oversampler certaines zones de la scène qui ne jouent pas sur la qualité du pixel final.

D'un point de vu technique, cela veut dire que le DMC sampler (en se basant sur le nombre maximum de sample définit dans ses paramètres) va subdiviser toute les valeurs de subdivision de la scène (material, ligth, etc...). Ceci n'arrive pas avec le subdivision sampler et c'est la principale différence entre ces deux samplers:

Vray_demistyfing_dmc_dmc_subdivision_process.gif

DMC sampler - Premier shéma

En se basant sur le paramètre de Max subdivs définit dans le DMC sampler, la valeur maximum de subdivision de reflection au point d'intersection entre l'eye ray et la sphère ne sera pas de 50 comme spécifié dans le material (en haut à droite) mais de 10 (voir tableau). La raison est que Vray sait que si il le souhaite, il peut oversampler le pixel avec 25 samples supplémentaires (5 Max subdivs DMC), ce qui veut dire qu'il sera autorisé à sampler la reflection gloss plusieurs fois.

Pour simplifier, le paramètre Subdiv (de Reflection) définit dans le material est le nombre maximum de reflection ray pouvant être projeté par pixel.

La formule est très simple. Chaque valeur de subdiv dans la scène (dans les materials, lights, etc...) sera subdivise par la valeur Max subdiv définit dans le DMC image sampler.

Exemple (Pour un seul rayon projeté):

DMC Max subdiv Reflection Subdivs DOF Subdivs Motion Blur subdivs
1 50 20 10
5 10 4 2
10 5 2 1

Pour faire simple: Si vous donnez suffisamment de samples dans le DMC image sampler, VRay ne prendra que quelques samples des valeurs de subdiv dans la scène (materials, lights, etc..) car il sait qu'il peut tout gérer avec l'image sampler et qu'au pire il pourra en reprendre encore. C'est très important de savoir ça car certains points seront plus intuitif à setter plus tard.

Adaptive subdivision sampler - Second shéma

Utiliser le subdivision sampler desactive le sampling unifie (DMC sampler). L\'Adaptive subdivision sampler est totalement independant des parametres de sampling dans la scene (area shadows, reflection, refraction, etc...). Il ne se focalise que sur le color threshold et envoit betement autant de samples que les parametres de subdiv des elements de la scene lui disent d\'envoyer (50 pour le material de notre exemple). De ce fait, il peut envoyer beaucoup plus de rayons que necessaire.

Revenons à nos moutons

Si, par exemple, un material X dans notre scène a une reflection gloss subdivisée à 40, et que la light utilisée dans notre scène a des ombres douces subdivisées à 10, en settant le DMC Max subdivs à 5, le nombre de subdiv glossy prise sur le material pour un seul sample sera de 8 (40/5=8 subdivs, soit 8^2=64 samples) et le nombre maximum de subdivision disponible pour les ombres de la light sera de 2 subdivs (10/5). Gardez à l'esprit que nous parlons du nombre de sample par eye ray. Si le pixel en cours de sampling a besoin de plus d'un eye ray (disont qu'on a besoin du nombre maximum de sample de DMC qui est de 5 subdivs, soit 5^2=25 samples), il est toujours possible pour VRay d'utiliser les 40 subdivs de relfection glossy definit dans ce material car pour chacun des eye ray d'un pixel, VRay projettera 8 subdivs (8^2=64 samples), et dans la mesure où il est limité à un maximum de 5 DMC subdivs (25 samples), 5x8 fera 40 subdivs de reflection gloss. On retombe sur nos pattes! Difficile à comprendre?... Peut être, cela m'a pris quelques jours car ce n'est pas expliqué dans la documentation de Vray.

Vray_demistyfing_dmc_dmc_distib.gif
Ce schéma représente la façon dont le DMC sampler gère les subdivisions des reflections glossy de la scène. la relfection gloss par défaut dans les materials est de 100 subdivs. Dans le premier cas, le DMC sampler a un Max subdivs de 5 par eye ray. Sachant ça, VRay va rabaisser le nombre de subdiv du material à 20 (100/5). Dans le dernier cas, le DMC sait qu'il peut subdiviser un pixel 50 fois, projetant 2500 samples eye rays... Ducoup, il va oversampler le pixel en ne prenant seulement que 2 reflection subdivs (car 100/50=2) pour chaque eye ray envoyé depuis le pixel.

Bon, maintenant que nous avons vue comment le DMC sampler gère et divise chaque valeur de subdiv dans la scène, nous pouvons voir comment les valeurs de subdiv de la scène sont adaptées. C’était assez basique avec l\'Adaptive subdivision sampler dans la mesure où ce sampler n'influence pas (ne divise pas) les valeurs de subdiv dans la scène (Il est bête et méchant).

De part la manière dont le DMC sampler fonctionne, et de comment il divise chaque valeur de subdiv dans la scène sur les pixels nécessitant d’être oversamplés, les valeurs de subdiv seront privilégiées (et quasiment inchangées) si vous mettez un paramètre de DMC Max subdivs très faible. Si vous mettez le paramètre de DMC Max subdivs à 1, vous aurez grosso modo le même effet qu'avec l\'Adaptive subdivision sampler en terme de “combien de rayons secondaires seront nécessaire pour calculer la relfection refractionm area shadows, etc...”. Mais, de par la nature de l'algorithme DMC, augmenter le Max subdivs trop haut (disons 50) diminuera (voir, fera disparaître) l'impact de l’adaptabilité.

La raison à ça est que si vous settez un DMC Max subdivs à 50 (par exemple), VRay ramènera chaque valeur de subdiv dans la scène à 1, ce qui veut dire que pour chaque sample envoyé dans la scène (eye ray), il n'enverra qu'un seul sample de glossy (secondary ray) pour la reflection, un pour la refraction, un pour l'area light, un pour le motion blur, etc... La raison pour laquelle VRay fait ça est qu'il sait qu'il peut projeter 50 subdivs de eye sample (50^2=2500 samples) dans la scène et qu'il aura toujours de belles reflections pour le material même si pour chaque rayon lancé (en eye ray) il ne projette qu'un seul sample de reflection glossy (secondary ray).

Vray_demistyfing_dmc_dmc_adaptive_compare01.jpg Vray_demistyfing_dmc_dmc_adaptive_compare02.jpg
Motion Blur 3D DMC Sampler Motion Blur 3D Adaptive subdivision sampler

Exemple 01: Les hairs

Les hairs peuvent s’avérer très difficile à sampler correctement. Ils génèrent une grande quantité de petits détails et la plupart des raytracers ne peuvent pas gérer le sampling des hairs d'une manière à la fois efficace et rapide.

L'Adaptive subdivision sampler donne de très mauvais résultats avec les hairs car il n'arrive tout simplement pas à définir quelles sont les zones à oversampler.

D'un autre cote, le DMC sampler donne de très bons résultats et peut sampler les hairs rapidement sans les artefacts qu'on obtient généralement avec l'Adaptive subdivision sampler (morceaux de hair “coupées”, flicking, etc...).

A temps équivalents, le DMC surpassera l'Adaptive subdivision sampler comme vous pouvez le constater sur les images qui suivent.

Les paramètres utilisées étaient:

J'ai utilisée une valeur de contraste très élevée pour l'Adaptive subdivision sampler car quand j'utilisais des valeurs à 0.1 ou 0.05 (qui sont des valeurs qui devrait être utilisées pour des animations), le temps de rendu passait à 20 minutes...

Adaptive Subdivision Sampler DMC Sampler
Vray_demistyfing_dmc_hair_dmc_sub_01.jpg Vray_demistyfing_dmc_hair_dmc_sub_02.jpg
Vray_demistyfing_dmc_hair_dmc_sub_03.jpg Vray_demistyfing_dmc_hair_dmc_sub_04.jpg

Maintenant se pose la question de quels paramètres doit on setter pour les hairs. Je set en général le DMC Min subdivs à 1 ou 2 et le DMC Maxn subdivs à 50. Si vous rencontrez des soucis pour sampler des petits détails dans un animation, mettre le DMC Min subdivs à 2 devrait résoudre le problème. Color threshold peut être très bas (0.02 ou 0.005). Ne tenez pas compte des options du DMC sampler de l'onglet Setting car l'adaptabilité est généralement ignoré. En effet, le fait d'avoir un DMC Max subdivs à 50 ramène (par division rappelez vous) pratiquement chaque valeur de subdiv de votre scène à 1... Ce qui veut dire que pour chaque eye ray, VRay projettera un seul sample pour calculer les areas shadows, un sample pour les reflection gloss etc... Dans notre cas, ça fonctionne très bien dans la mesure où vous savez qu'a cause de la complexité des hairs, le nombre de eye ray a besoins d’être très élevé (parfois plus de 100-300).

Vray_demistyfing_dmc_hair_dmc_set_a01.jpg Vray_demistyfing_dmc_hair_dmc_set_a02.jpg Vray_demistyfing_dmc_hair_dmc_set_a03.jpg
Min 1 Max 4 Min 1 Max 10 Min 1 Max 50

Comme vous pouvez le constater, la troisième image est la meilleure. L'ensemble parait plus doux et je peux vous assurer que vous ne verrez pas beaucoup de flicking, même en animation.

Quand je travaillais à Blur, je rendais les hairs dans une passe séparée avec Min subdivs 1 et Max subdivs 50 et le reste de la géométrie settée en matte (via les VRay properties) et je compositais ensuite les hairs en postprocess. Dans la plupart des cas, il n'y avait pas de raison d'utiliser un DMC Max subdivs à 50 pour le calcul du reste de la scène.

Exemple 02: Surfaces plates et reflection glossy

Le truc marrant est que dans certaines situations, avoir un DMC Max subdivs à 4 peut vous donner des images plus propre en moins de temps. C'est particulièrement vrai sur des images ou vous avez des surfaces plates avec de la reflection glossy, sans (ou avec peu) de détails. Du coup on est plus concentré sur le fait de sampler le material plutôt que la géométrie:

Vray_demistyfing_dmc_flat_surfaces_01.jpg Vray_demistyfing_dmc_flat_surfaces_02.jpg Vray_demistyfing_dmc_flat_surfaces_03.jpg
Min 1 Max 5 Reflection Subdiv 50 Min 1 Max 10 Reflection Subdiv 50 Min 1 Max 50 Reflection Subdiv 50
Vray_demistyfing_dmc_flat_surfaces_04.jpg Vray_demistyfing_dmc_flat_surfaces_05.jpg Vray_demistyfing_dmc_flat_surfaces_06.jpg
Min 1 Max 50 Reflection Subdiv 100 Min 1 Max 50 Reflection Subdiv 300 Min 1 Max 50 Reflection Subdiv 1000

Voyons ce qui ce passe avec le sampler et comment, quand on passe le DMC Max subdivs de 5 à 50, VRay projette plus de eye samples dans la scène.

Vray_demistyfing_dmc_flat_surfaces_samples_01.gif Vray_demistyfing_dmc_flat_surfaces_samples_02.gif Vray_demistyfing_dmc_flat_surfaces_samples_03.gif
Min 1 Max 5 Reflection Subdiv 50 Min 1 Max 10 Reflection Subdiv 50 Min 1 Max 50 Reflection Subdiv 50
Vray_demistyfing_dmc_flat_surfaces_samples_04.gif Vray_demistyfing_dmc_flat_surfaces_samples_05.gif Vray_demistyfing_dmc_flat_surfaces_samples_06.gif
Min 1 Max 50 Reflection Subdiv 100 Min 1 Max 50 Reflection Subdiv 300 Min 1 Max 50 Reflection Subdiv 1000

Étrange n'est ce pas? La première image ou le DMC Max subdivs est setté à 5 n'a qu'une fraction de samples comparer à celle faite avec un DMC Max subdivs à 50. Rappelez vous quand j'expliquais comment la DMC Max subdivs divisait chaque valeur de gloss dans la scène. Et bien c'est exactement ce qui ce passe ici.

Je mets la valeur de Subdiv des reflection glossy des materials à 50, ce qui revient, dans le cas ou DMC Max subdivs est setté à 5 (premier cas), à ce que chaque eye ray touchant la surface gloss projette un maximum de 100 samples de reflection (50/5=10 subdivs), mais quand le DMC Max subdivs est setté à 50, la reflection gloss de projettera que 1 sample. Ce qui veut dire que, si le DMC Max subdivs est setté à 50, VRay ne sera pas capable d'obtenir une reflection clean avec peu de eye rays. Il aura besoin d'envoyer plus de eye ray par pixel, même si nous n'avons pas besoin de rayons supplémentaires car la plupart des éléments de la scène ne sont que des surfaces plates avec de la reflection.

La seconde colonne utilise un DMC Max subdivs à 50 mais on fait varier la reflection subdiv du material utilisé sur le sol et les murs. Vous pouvez clairement voir qu'en changeant la Refl Subdiv vous faite varier la charge du DMC sampler (eye rays)... Donc dans une telle situation n'ayez pas peur d'augmenter la Refl Subdiv à 300 car quand vous divisez par le DMC Max subdivs 50, vous n'obtenez que 6 subdivs par eye ray, et ceci va en fait accélérer votre rendu et vous obtiendrez une reflection plus douce.

Exemple 03: Subpixel mapping (Onglet VRay: Color mapping)

La plupart du temps, j'utilise le subpixel mapping pour rendre mes scènes animées. Si vous faites des images fixes, vous pouvez désactiver cette option pour obtenir un résultat plus réaliste, mais dans des animations ou vous utilisez du motion blur 3D et du DOF, il peut être intéressant de l'activer car vos temps de rendu diminueront et vous aurez besoin de beaucoup moins de samples pour obtenir un motion blur 3D et un DOF clean.

Le procédé est expliqué dans les images qui suivent:

Subpixel Mapping On
Vray_demistyfing_dmc_subpix_01.gif
Quand le Subpixel mapping est activé, chacun des nouveaux samples pris dans un pixel est dans un premier temps “tonemappé” (compressé à l’échelle colorimétrique définit dans l'onglet Color Mapping ou Camera exposure) puis mergé avec la couleur du pixel existant.
Subpixel Mapping Off
Vray_demistyfing_dmc_subpix_02.gif
Quand le Subpixel mapping est désactivé, chaque sample est calculé et mergé avec les autres, puis, quand le pixel est complètement samplé, sa couleur est “tonemappé” pour former la couleur final du pixel. Ceci produit un résultat plus réaliste mais introduit un certain noise dans l'image, particulièrement quand on utiliser du motion blur 3D et/ou du DOF.

En pratique, ça ressemble à ça:

Vray_demistyfing_dmc_subpix_01.jpg Vray_demistyfing_dmc_subpix_02.jpg
Subpixel Off DMC Min 1 Max 50 Subpixel On DMC Min 1 Max 50
On voit clairement les répercussions sur l'image finale. L'image de droite (Subpixel mapping On) donne un meilleur résultat, se rend plus vite, mais perd un peu de luminosité et ne produit pas un rendu si réaliste que ça.
Vray_demistyfing_dmc_subpix_03.jpg Vray_demistyfing_dmc_subpix_04.jpg
Subpixel Off DMC Min 1 Max 1 Subpixel On DMC Min 1 Max 1
En ne changeant que la DMC Max subdivs à 1 (ce qui veut dire que le paramètre Subdivs des reflection gloss ne sera pas réduit à chaque eye ray projeté), nous obtenons le même résultat avec Subpixel mapping en On ou Off.

Voici la raison pour laquelle nous obtenons cette différence:

Si le DMC Max Subdivs est setté à 50, VRay enverra beaucoup plus de eye rays dans la scène mais beaucoup moins de samples de reflection par eye ray.

Ceci peut être compensé en augmentant le nombre de sample de reflection gloss dans le material perdant sa couleur initiale.

Personnellement, si j'ai un DMC Max Subdivs à 50, je peux setter la reflection subdivs du material à quelque chose comme 500, ce qui veut dire (rappelez vous du tableau) que pour chaque eye ray que VRay enverra, 10 sample de reflection seront projette dans la scène. Cette approche conservera la reflection aussi claire qu'elle aurait été avec Subpixel Mapping On.

Exemple 04: Plus de dix Area Lights dans une scene

Pour les scenes avec un grand nombre d'area lights, utiliser le DMC sampler peut enormement aider, en particulier si vous utilisez du motion blur et du DOF.

Les deux prochaines images le montrent. J'utilise environ 100 area lights et pouvez constater que le DMC sampler surpasse l'Adaptive Subdivision sampler. La quantite de grain dans l'image est pratiquement la meme. En DMC sampler, certaines zones de l'image sont plus propres ou granuleuses qu'en Adaptive Subdivision sampler mais gardez à l'esprit que j'ai utilisé un DMC Max subdivs à 50 ce qui est un peu elevé.

Activer Use light cache for glossy rays dans une scene avec autant de details peut egalement beaucoup aider, donc garder ça à l'esprit quand vout rendez ce genre de scene.

Vray_demistyfing_dmc_lights_01.jpg Vray_demistyfing_dmc_lights_02.jpg
Adaptive Subdivision Sampler Min 0 Max 2 Clr THRESHOLD 0.05 DMC Sampler Min 1 Max 50 Clr THRESHOLD 0.02

Exemple 05: l'Irradiance GI Quality est controlle par le DMC sampler

Une chose à savoir quand on essaye de faire disparaître le noise et/ou flicking des Irradiance Map c'est que les IR Map sont également contrôlées par les paramètres du DMC Sampler (onglet Settings).

Vray_demistyfing_dmc_ir_map01.jpg Vray_demistyfing_dmc_ir_map02.jpg Vray_demistyfing_dmc_ir_map03.jpg
Adaptive Amount 1 Noise Threshold 0.01 Min Sampler 8 Adaptive Amount 0.5 Noise Threshold 0.01 Min Sampler 8 Adaptive Amount 1 Noise Threshold 0.01 Min Sampler 128

Le problème apparaît en général quand l'Adaptive amount est setté à 1. Je suppose que l' IR map ne reçoit pas suffisamment de samples initiaux de GI... Donc il ne sera pas en mesure de décider efficacement si il doit envoyer plus de rayons ou non.

Ceci peut être compensé en diminuant l'Adaptive amount à une valeur plus basse que 1. Dans la seconde image, cette valeur est settée à 0.5 et vous pouvez clairement voir la différence.

Une solution plus radicale peut aussi être de setter un DMC Min subdivs à une valeur plus élevée, comme 128.

Conclusion

J’espère que tout ce j'ai écrit était facile à comprendre même si cela peut s’avérer confus au début. J'ai vu des gens avoir un peu de mal avec le DMC sampler car il unifie le traitement de l'antialiasing (unified core) et revenir à l'Adaptive Subdivision sampler au comportement plus prévisible.

Mais croyez moi: Une fois que vous arrivez à comprendre son fonctionnement, vous l'adopterez rapidement car il vous permet d'avoir un contrôle à la fois complet et global sur l’algorithme de sample de votre raytracer favori. Une fois maîtrisé, vous serrez en mesure de libérer le pouvoir de l'unified sampling et obtiendrez des temps de rendu plus court et des résultats plus propres.

Happy rendering!

Dernière mise à jour : ven. 08 mai 2020