| Linear Workflow avec 3dsmax |
|
| Écrit par Shimrod | |||
| 22-05-2007 | |||
|
Hey ! Ici, un sujet consacré au "Linear Workflow", cette étrange expression que vous avez du lire pas mal de fois sur des forums ou des sites de 3d. Je rassemble ici le résultat de pas mal de recherches. Mon but n'est pas d'aller en profondeur dans les mathématiques (de toutes façons, je ne comprend pas tout et ne risque pas d'en avoir l'usage), mais de tout de même aborder certains points indispensables à la compréhension. Dans tous les cas, j'essaierais d'expliquer en termes simples. Si vous y constatez une erreur ou si avez des précisions à apporter, n'hésitez pas à me les signaler. ;D
Je précise un point : les schémas que vous pouvez y voir sont pas super exacts, ils sont surtout là pour donner une idée.
Avant d'aller plus loin : - Littéralement : Flux linéaire de Travail, ce qui ne veut absolument rien dire donc on s'en fout un peu. Ou alors on peut dire qu'on travaille en Espace Linéaire. C'est bien ca. - Quel est l'avantage de lire ce passionnant et fort bien rédigé article, et de taffer sa 3d en Linear ? D'une façon générale, on obtient des images bien mieux contrastées et une lumière plus subtilement rendue et beaucoup mieux interprétée lors du rendu. Je dirais aussi que respecter manuellement le traitement de la couleur par le soft de 3d (ici 3dsmax) est toujours mieux que de le laisser faire ca automatiquement. D'autant que mental ray accepte des shaders de controle d'exposition, de tone mapping (contraste des couleurs), etc. Donc on peut pousser un peu plus, et si on a compris toutes ces histoires de linear et de gamma, ca facilite la suite ! - Ultime précision : il est pratiquement indispensable d'utiliser un moniteur correctement calibré, points noir et blanc réglé et gamma à 2.2 (pour les LCD). Il existe des utilitaires de calibrage, comme Adobe Gamma, mais il est fortement conseillé de procéder à un calibrage matériel, via une sonde.
Partie 1 : Linear Vs sRGB
Vous n'êtes pas sans savoir qu'un écran affiche les images sous formes de pixels, en RGB (Red-Green-Blue) et à différentes valeurs d'intensité. Prenons comme base de départ l'exemple simple d'un dégradé du noir vers le blanc. On assignera comme valeur 0 pour le noir (pixel à sa plus faible intensité) et 1 pour le blanc pur (pixel au maximum de son intensité). On peut donc dire que par exemple le gris 50% a 0.5 comme valeur. On peut également (et surtout dire) que le gris 50% a une luminosité de l'ordre de la moitié du blanc pur.
La progression du noir vers le blanc est donc constante. Si on transforme ca en fonction mathématique, on obtient une ligne droite. Quelque chose de linéaire quoi ! :D
On dit dans ce cas que le gamma est égal à 1. Pour la culture générale et pour résumer succinctement, le gamma n'est pas tout à fait une valeur associée à la luminosité comme elle l'est souvent. En fait, si on reprend le schéma précédent, on est complètement en face d'une fonction mathématique qui met en relation x (axe horizontal) et y (axe vertical). Comme c'est une ligne droite, on peut dire que y = x. Plus précisément, l'équation exacte est y = xp , où la valeur de P (comme Power, héhé) est le gamma. Ici, le gamma est de 1, donc y = x1 c'est-à-dire y = x. Une ligne droite. (Fin de l'aparté culturel qui fait mal à la tête.)
Le problème rencontré à l'affichage de ce beau dégradé en espace linéaire sur notre beau LCD (ou CRT) est que cet affichage ne correspond pas du tout à la perception de l'oeil humain et qu'on obtient un vieux truc ignoble :
ceci est un vieux truc ignoble Après moult tests, on s'est aperçu que la meilleure valeur pour le gamma était de 2,2. Cette fois, la progression de notre dégardé du noir au blanc n'est plus une ligne droite mais une courbe (au passage, définie par la fonction y = x2.2 qui... nan ok, j'me casse !)
Le schéma est pas exact, mais la courbe ressemble à peu près à ca. L'avantage, donc, c'est que cette fois le moniteur affiche un dégradé qui nous "semble" correct. Mais en fait, il est converti d'un espace linéaire à un espace non-linéaire. Un espace non-linéaire en particulier s'est imposé comme standard principal, et qu'on appelle le sRGB (développé par HP et Microsoft, agréé par le W3C, Pantone, Corel, etc.). Du coup, la très grande majorité des images que vous pouvez avoir dans vos pc (le plus répandu, des jpeg que vous sortez de Photoshop ou provenant d'Internet) sont directement encodées en gamma 2,2. Si elles étaient affichées par un moniteur réglé en gamma 1, elles apparaitraient très sombres.
En résumé, on peut donc dire qu'on a 2 espaces colorimétriques principaux (enfin qui nous intéressent) : - l'Espace Linéaire, dans lequel un dégradé noir vers blanc progresse normalement, c'est à dire de façon constante, mais qui est interprété n'importe comment par nos écrans. - l'Espace sRGB, qui permet de convertir ce dégradé pour l'adapter à la perception humaine quand il est affiché sur l'écran. Du coup, le dégradé ne progresse plus constamment (on ne peut plus dire que le gris 50% a une luminosité égale à la moitié de celle du blanc pur).
Bon, c'est bien beau tout ca, mais en quoi ca nous concerne ? Nous on veut juste faire de belles teapots...
Partie 2 : l'espace colorimétrique dans 3dsmax
Bah justement, le truc c'est que la plupart des softs de 3d fonctionnent en espace linéaire ! Et lors du rendu, hop max convertit le résultat automatiquement pour qu'il colle au sRGB... le vil fennec. Du coup, tout ce qu'on voit pendant la préparation de la scène est systématiquement converti par-derrière, sans vraiment prendre soin des contrastes ou interprétations de la lumière ni sans forcément tenir compte de notre bel écran calibré... En effet, j'ai dit plus haut que le gamma idéal était de 2.2, ce qui mérite en fait d'être nuancé. Oui, pour la video, mais pour les écrans, selon les différences de calibrage, le matériel, son usure, etc. on considère qu'un gamma correct se situe entre 1,5 et 2,2. Arf ! Donc si max fout systématiquement tout en 2.2, c'estpas forcément là qu'on aura le meilleur rendu des couleurs.
Il y a également l'interprétation de la lumière qui est différente. Sans trop rentrer dans les détails, si vous désirez augmenter la luminosité d'une image (dans Photoshop par exemple), le programme va se référer à des tables déjà existantes, des valeurs toutes prêtes en gros. Tu augmentes la luminosité de tant, alors la luminosité de tel pixel qui est à peu près égale à ca va être égale à ca. On perd des informations pendant l'opération (et on a un truc tout pâle). Si on convertit l'image du sRGB vers un linear, qu'on y fait l'opération (la vraie) de multiplication de la luminosité de tous les pixels et qu'on re-convertit en sRGB, on aura un résultat beaucoup plus subtil. Si vous voulez le vérifier, allez voir cette page : http://mysite.verizon.net/spitzak/conversion/multiply.html Plusieurs boutons à cocher, correspondant à une multiplication de la luminosité. La rangée du haut en sRGB, la rangée du dessous en srgb converti en linear pour l'opération, puis retour en sRGB. La différence est assez flagrante.
Un autre exemple, le rendu d'une zone éclairée par plusieurs lights : http://mysite.verizon.net/spitzak/conversion/whylinear.html Image 1 : photo réelle, on voit comment se diffuse la lumière Image 2 : le rendu avec la luminosité calculée en linear puis reconvertie en sRGB. Miam ! Presque pareil ! Image 3 : ce que fait max si on lui dit pas de calculer en linear. On voit bien la superposition de 2 zones de lumière, ce qui laisse plutôt penser à 2 zones d'éclaircissement faites l'une après l'autre. max calcule bien en lineat mais donne la priorité au stockage du rendu dans son pauvre bitmap en 8bit et gamma 2,2.
Donc, on voit bien que l'avantage de bosser en linéaire, c'est tout d'abord des images plus subtiles et plus contrastées.
Mais alors, comment on fait ca, bosser en linéaire dans max ? Heureusement, c'est prévu, grâce au réglage des préférences Gamma/LUT (lookup table). BOn, LUT je sais pas trop ce que c'est, on va plutôt s'intéresser au gamma. Dans max, ouvrez la fenêtre Preferences, onglet Gamma/LUT Cochez "Enable Gamma/LUT Correction" pour activer le contrôle du gamma. Dans le panneau "Display", cochez "Gamma" et réglez la valeur afin que la différence entre le carré gris central et le reste du plus grand carré soit la plus minime possible. Certains auront une valeur de 2.2, d'autres plus basses ou plus élevées. Perso, je suis à 1,6, je trouve que c'est cette valeur qui contraste le mieux les images sur mon écran. Le gamma au rendu sera donc désormais celui-ci. Cochez également "Affect Colors" et "Affect Materials", pour inclure dans ce gamma les couleurs (celles des sélecteurs dans les materiaux) et les swatches, les boules du Material Editor. Vous remarquerez sans doute la différence en ouvrant votre Material Editor, et vous ajusterez certainement le gamma que vous avez précédemment entré. (Pour moi, 2.2 me donnait des boules trop blanches) Ensuite, vous avez le panneau "Bitmap Files". Hé oui, on utilise souvent des bitmaps pour nos textures. Or, ces bitmaps sont déjà converties en 2,2 et je rappelle que lorsque max a fini de calculer la luminosité du rendu, il convertit le tout de l'espace linéaire vers le sRGB. Donc vos bitmaps vont être converties une seconde fois et vous aurez des textures très blanches. Entrez "2,2" dans le champs "Input". Vous indiquez ainsi à max que vos bitmaps sont en sRGB, et qu'il faudra les convertir en linéaire avant de calculer la scène. Vos matériaux seront donc interprétés de façon juste. Entrez également "2,2" dans le champ "Output", pour indiquer à max qu'il doit reconvertir ensuite les bitmaps en sRGB. Ici, j'ai un doute sur la valeur la plus adéquate à entrer. Peut-être vaut-il mieux mettre la valeur du gamma que l'on a entrée auparavant... mais l'aide d emax ne dit pas grand-chose à ce sujet. Si quelqu'un peut répondre, qu'il n'hésite pas !
Il reste un tout dernier détail, détail extrêment important. Vous allez faire votre beau rendu bien "gammaté" comme il faut, il apparait superbement dans la fenêtre de rendu de max, vous sauvegardez l'image et vous vous rendez compte que l'image enregistrée est beaucoup plus pâle que le rendu réellement obtenu. Damn it, encore un coup de ce fennec de max ! En fait, au moment de l'enregistrement, il vous faut décocher "Use system default gamma" dont max ne tient d'ailleurs pas du tout compte et choisir "Override". Dans le champ à droite, entrez la même valeur que celle choisie pour le gamma général (1,6 pour moi, par exemple).
Voilà, à présent vous avez configuré max pour bosser directement en espace linéaire, et profiter au maximum de calculs corrects et surtout correctement interprétés. Toutes ces notions sont je pense assez utiles pour comprendre ce qu'est le Linear Workflow, et pouvoir aboutir à des images plus contrastées et plus subtiles.
Pour essayer de faire une belle transition vers la suite, à savoir le contrôle de l'exposition de l'image, ou son tone mapping via le shader mia_exposure_simple , j'évoquerais rapidement une 3e méthode d'interprétation de notre dégradé du début. Méthode 1 : Linéaire, rendu tout pourri et trop clair sur les écrans. Méthode 2: conversion en sRGB via une fonction dont on ne retiendra que le gamma de 2,2. Affichage correctement perçu à l'écran. Méthode 3 : une conversion calculée de façon logarithmique . Ouais, encore un mot dur à comprendre. Pour faire plaisir à Mhyrdin qui sera sûrement intéressé, j'ai lu qu'au lieu de calculer une nouvelle valeur en la multipliant par une constante, on obtient cette valeur en multipliant la valeur immédiatement précédente par une constante. On obtient à l'arrivée un dégradé plus uniforme que la méthode 2 (et donc plus joli). Par contre, on perd beaucoup en valeur de noir, ce qui donne une image moins contrastée et plus fade. C'est ce calcul qui est utilisé si on contrôle l'exposition et le constraste des couleurs d'une scène via le Logarithmic Exposure Control intégré à max. Heureusement, le shader mia_exposure_simple permet de remplacer ce correcteur de façon plus performante et d'obtenir de meilleurs tons au rendu. :D
Vala pour le Linear Workflow. La suite avec le mia_exposure_simple... ;D
Powered by AkoComment 2.0! |
|||
| Dernière mise à jour : ( 27-11-2008 ) |
| < Précédent | Suivant > |
|---|






.

