« WDR rendering » ou littéralement rendu à grande gamme dynamique…

Voici un petit pas à pas pour tester une méthode qui devrait vous permettre de booster vos rendus et d’approcher plus facilement le photo-réalisme.

Je préviens tout de suite, je débute dans cette méthode de travail, donc je vais éviter de trop rentrer dans le détail et d’écrire des âneries, et considérez ce post comme « en chantier » ou « WIP » si vous préférez.

Toutes mes sources viennent de blender stack, et plus particulièrement de ce post et de discussions avec Troy James Sobotka.

La première chose qu’il faut savoir est que cette méthode va vous amener plusieurs contraintes, des-quelles vous retirerez de nombreux bénéfices :

  • Il faut nécessairement étalonner le rendu à l’aide du node ASC-CDL et vous allez devoir vous fier autant à votre œil qu’aux scopes
  • Vous vous rendrez compte que vos matériaux ne sont pas aussi bons que ce que  vous pensiez, et il vous faudra sans doute les ajuster à nouveau (très souvent baisser les valeurs d’albedo)
  • Il faut revoir sa façon de régler les lampes, penser en terme de stops ou d’exposition, de gris median

Pré-requis : Le stop

En photo, on utilise le stop pour décrire un changement de la quantité de lumière reçue ou l’exposition par rapport à une référence (l’état initial ou la photo précédente…). On modifie l’exposition en jouant sur la vitesse d’obturation, la taille de l’ouverture, la sensibilité du film.

Augmenter d’un stop c’est multiplier la luminosité par 2.

Diminuer d’un stop c’est diviser la luminosité par 2.

En 3D c’est plus simple, on multiplie les valeurs du rendu par un même facteur et cela modifie l’exposition. Dans le panneau Color Management, il est possible de régler l’exposition avec le slider Exposure. Par défaut il est à 0. On souhaite avoir deux fois moins de luminosité ? Il suffit de le passer à -1 stop. Si on en veut 4 fois plus ? On le passe à +2 stops. Le facteur de multiplication de la luminosité s’obtient par 2^n ou n est le nombre de stops.

On utilisera aussi le stop pour mesurer la luminosité par rapport au gris médian, cela nous aidera à éclairer notre scène.

Un résumé du problème et de sa solution

Blender nous donne un rendu brut avec des données linéaires qui ont des valeurs pouvant être très grandes,  mais les affiche dans l’espace colorimétrique sRGB par défaut en plafonnant les valeurs à 1. En baladant la souris tout en maintenant le clic gauche sur le rendu, on voit s’afficher les valeurs RGB du pixel en linéaire à gauche (vert ci-dessous), et celles une fois transposé dans sRGB (rouge). On se rend alors compte que toutes les valeurs supérieures à 1 sont « clampées ».

On perd donc de l’information, certaines zones de l’image sont cramées. Il suffit de baisser l’intensité des lampes et de modifier le gamma me direz-vous ! Oui effectivement, on peut essayer ça. Ce n’est pas très intuitif par contre, et on perdra la dynamique naturelle obtenue avec l’espace colorimétrique que nous utiliserons ensuite. Il sera assez difficile d’arriver à approcher le résultat du WDR (je vous encourage à essayer ceci-dit, c’est assez amusant).

Voici par exemple le résultat d’une scène sRGB obtenue en wysiwyg, c’est à dire au pifomètre et sans chercher à étalonner le rendu :

On observe bien une zone clampée à 1 sur le scope Waveform qui correspond à la zone cramée en bas à droite de l’image.

Ci-dessous le même rendu étalonné via l’ASC-CDL et un node RGB curves, toujours en sRGB :

On peut utiliser d’autres espaces pour le rendu (log, RRT qui  est mon préféré et sans doute le moins pire, et Film) mais d’après Troy aucun n’est implémenté correctement. Du coup, blender utilisant OpencolorIO, il a développé un fichier config.ocio accompagné de quelques LUTs afin d’essayer de corriger ça.

Un LUT, Look Up Table, est une table de conversion des valeurs de notre rendu. Elles permet de lui donner un look spécifique ou également de transformer les données linéaires dans l’espace colorimétrique ACES (vous pourrez ouvrir un LUT dans un éditeur comme Geany ou Notepad++, ils sont tous dans le dossier LUT de l’archive que nous téléchargerons plus bas). On distingue aussi les 1D LUTs agissant sur la luminosité uniquement, et les 3D LUTs agissant différemment sur les composantes RGB de notre image. En fait ces derniers contiennent trois 1D LUTs, un pour chaque canal, et permettent ici d’effectuer une dérive des couleurs vers le blanc au-delà d’une certaine valeur (à partir de 3 stops). Dans le cas du LUT utilisé pour la conversion dans l’espace ACES, on utilise plutôt le terme shaper, puisqu’il s’agit de mettre en forme les données linéaires de notre rendu sous une forme logarithmique sur un intervalle donné. Cela permet d’avoir un rendu couvrant 16.5 stops, avec 6.5 stops au-dessus du gris médian (contre un peu plus de 8 pour le sRGB, avec 2 stops seulement au-dessus du gris médian). L’objectif de ces valeurs est d’utiliser suffisamment d’informations pour reproduire la réponse d’un film argentique par exemple, avec une large plage dynamique à peine plus grande que ce que permet un reflex numérique (autour de 13 stops). Il suffit alors d’étalonner ce rendu avec le node ASC-CDL et de choisir si l’on veut ou non un look avec désaturation de la couleur sur les hautes lumières…

Ci-dessous à gauche le node ASC-CDL de base fourni par blender, et à droite un groupe disponible sur blendswap ici, ajoutant le paramètre Saturation et palliant à quelques défauts de l’UI.

Le node ASC-CDL est un standard créé par la « American Society of Cinematographers », afin de permettre l’échange entre plusieurs applications des valeurs primaires d’étalonnage d’une image (color grading). C’est la « Color Decision List » ou dit autrement, une liste comprenant les valeurs RGB qui sont passées en entrée d’un petit algo afin de corriger une image brute. Dans notre cas il s’agit d’un rendu avec des données linéaires, en 16 ou 32 bits. L’OpenEXR est parfait pour ce type de fichier. Donc si vous étalonnez votre rendu avec le node ASC-CDL, vous devriez pouvoir obtenir la même image dans Natron par exemple, en entrant exactement les mêmes valeurs pour l’étalonnage de votre rendu enregistré au format OpenEXR.

C’est parti !

1/ Télécharger et installer le pack de Troy

Le pack se télécharge sur GitHub ici.

Localisez le dossier colormanagement dans blender (sous win de mémoire c’est dans C:\Program Files\Blender Foundation\Blender\2.77\datafiles\colormanagement et sous linux c’est généralement dans /usr/share/blender/2.77/datafiles/colormanagement ). Faites une copie préalable de ce dossier en lui donnant le nom old_colormanagement puis vous remplacez son contenu par tout ce qui se trouve dans le pack. Si vous redémarrez blender et allez voir le panneau colormanagement, vous verrez que les render view RRT, Film,… ont été remplacés par Wide Dynamic Range View, Raw,… et que tous les looks films (façon Instagram) ont été remplacés par « Desaturation Basic », « Greyscale on Desaturation », « False Colour Basic »…

2/ Régler l’éclairage

Pour essayer tout ça je vous propose de récupérer la petite scène de test ici. C’est basique et rapide à rendre pour un premier test, mais par la suite empressez-vous de mettre en pratique sur une scène plus évoluée pour vraiment mesurer le gain offert par cette méthode.

Si vous ouvrez le blend, et que vous faites un rendu, vous devriez avoir le même résultat que mon rendu sRGB étalonné. Si vous passez en mode « Wide Dynamic Range View »  dans le panneau de colormanagement et en vue « Rendered » dans le viewport,  votre scène va vous sembler grisâtre et terne. Il faut donc augmenter la puissance des lampes. Multiplier par 4 pour chaque lampe est généralement dans mon cas un bon début.

Vous allez ensuite passer le look en « False Colour Basic ».

C’est ce type de vue qui va nous permettre de régler l’éclairage. Les couleurs correspondent à l’exposition de notre scène. Le gris correspond au gris médian. Le vert nous donne 2 stops au-dessus du gris médian (le problème étant qu’on a du vert sous le gris également, donc a -1 stop). Le jaune 4 stops au-dessus. Le rouge est à 5.5 stops et le blanc correspond à tout ce qui est au-dessus de 6.5 stops. Les couleurs rouges ou blanches sont idéalement à observer uniquement sur ou près des sources lumineuses ou leurs reflets. De l’autre côté, nous avons du bleu, du violet, du noir…

Si vous n’utilisez pas l’addon Gaffer, je vous recommande de l’installer tout de suite.

Ma petite recette rapide de grand débutant (et certainement fausse, j’ai prévu quelques tests pour affiner) est de considérer que le World avec une sky texture devrait permettre d’avoir une expo autour de 0 sur notre sujet (donc du gris/vert). Et le sun lui, une expo a +2 /+4 stops (donc du vert et du jaune). Disons que ces valeurs me conviennent pour le moment pour des rendus avec éclairage direct simple. En utilisant Gaffer, on affiche uniquement une des deux lampes et on règle sa puissance en fonction de la couleur dans la vue « False Colour Basic ».

Le World uniquement :

La scène complète :

J’obtiens pour ma part quelque-chose de satisfaisant avec l’area Droite à 11000, la Gauche à 1000 et le World à 1.6. Vous pouvez passer du look false color à None ou à un des autres looks reproduisant grossièrement un étalonnage pour avoir une idée de la répartition de vos données.

3/ Étalonnage

Une fois que vous avez votre rendu, en utilisant le node ASC-CDL on effectue l’étalonnage.

Le node ASC-CDL effectue 4 opérations successives sur notre rendu. Considérons que ce qui entre est In, et que ce qui sort est Out.

Slope : Out = S*In, et ce pour chaque canal RGB. Le Slope multiplie les valeurs de chaque canal par un nombre. Par défaut il est à 1, et généralement on le descend entre 0.2 et 0.5 pour amener nos hautes lumières plus bas. Pour multiplier la luminosité par 4, il suffit de passer le slope à 4. Le Slope a le même effet que l’exposition, il permet de régler la luminosité de l’image (on peut même relier le Slope à l’exposition par une petite formule).

Offset : Out=S*In+O, et ce pour chaque canal RGB. Par défaut il est à 0 et est le seul pouvant prendre des valeurs négatives. L’Offset décale l’ensemble des valeurs vers le haut ou le bas. En pratique il est peu utilisé, puisqu’il fait perdre de l’information. Disons que pour des raisons artistiques il peut-être intéressant, si vous souhaitez bouchez les ombres par exemple.

Power :Out=(S*In+O)^P et ce pour chaque canal. Par défaut à 1, en le passant au-dessus de 1 on augmente le contraste, et entre 0 et 1 on le diminue. C’est en jouant sur ce paramètre que l’on va donner la dynamique à notre image. Généralement il faut le placer entre 1.5 et 2.5

Saturation : Celui-ci est un peu plus compliqué. La désaturation est effectuée en fonction des coefficients de luminance de la Rec. 709.

Y = 0,2126*R + 0,7152*G + 0,0722*B  avec Y la luminance

Dans la pratique, on l’utilise peu, mais sachez simplement que l’on va rarement au-delà de 4.

En utilisant le node ASC-CDL, on baisse le Slope de manière à ramener la grande partie des hautes lumières autour de la ligne des 80 sur le scope (0.4 environ), et ensuite on augmente le Power afin d’améliorer le contraste sans trop boucher les ombres (2 dans mon cas). Il s’agit maintenant de trouver l’équilibre entre une image plaisante et la perte de quelques informations, c’est une décision purement artistique et on peut aller plus loin en entrant des valeurs différentes par canal afin de teinter l’image.

Voici ce que donne la version étalonnée sans émulation de la désaturation :

On obtient déjà quelque-chose de plus naturel.

Comme on souhaite utiliser le 3DLUT pour avoir la désaturation sur les hautes lumières (elle commence de manière imperceptible à partir de 3 stops), nous passons le look à « Desaturation Basic ».

On observe une différence subtile sur les spéculaires du cube bleu, qui se décolorent là où l’exposition est la plus forte, et très visible sur les spéculaires dorées. Si vous jouez un peu avec le Slope tout en gardant un oeil sur le scope, vous remarquerez qu’au dessus de 80 la désaturation augmente de plus en plus.

En utilisant cette technique sur des scènes comprenant des matériaux et des éclairages plus complexes, vous pouvez considérablement améliorer vos rendus.

Mes premiers essais, pas forcément spectaculaires, sont ci-dessous :

N’hésitez pas à partager vos remarques et rendus dans les commentaires !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.