arkilium ont publié sur leur blog un tuto sur comment générer une « normal pass » dans Blender.
Le but de ce tutoriel est aussi d’ajouter des sources lumineuses sur une image déjà rendu en compositing à partir de la normal pass a l’aide de votre logiciel de retouche d’image favori.
Normal pass dans Blender
C’est un peu bidon. La passe de normal que Blender rend par défaut est correcte et contrairement à ce que dit l’article, les parties noires d’une normal passe ne sont pas noires en réalité car il y a des valeurs négatives qui les rendent seulement invisible. C’est cette image là qu’on utilise avec un logiciel de compositing.
Oui, mais comment tu fait pour utiliser la normal pass brut dans photoshop ? J’ai testé plusieurs format / profondeur d’image, il ne reconnait pas les valeurs négatives
Je ne connais pas assez Photoshop, peut-être qu’il n’en est pas capable mais pour un logiciel de ce prix et de cette renommée, ça serait dommage. Le compositor de Blender et Natron gèrent ça très très bien et sont des logiciels libres.
Je viens de tester un image exr 32 bits sur Krita, et les valeurs négatives sont prises en compte, aucune idée par contre s’il est capable de les gérer correctement.
L’article dit en effet pas mal de bêtises. La passe de normales de Blender est correcte pour un workspace en Z-UP. D’ailleurs, de quelle passe de normales parle-t-on … la World, Local, ScreenSpace, Tangent ou Derivative ? La passe sortie par le compositor de Blender est de type Screenspace. Celle qu’on peut sortir par les nodes de Cycles est de type Worldspace.
Photoshop peut tout à fait gérer les pixels de valeurs négatives. Il suffit de passer le mode, ainsi que le color picker en 32 bpc pour s’en rendre compte.
Par contre, pour faire du relight correct, il faut calculer le Dot Product du vecteur représenté par le pixel de la normal map et du vecteur de la light, pondéré par sa position dans l’espace. Donc pour faire un vrai relight, il faut en plus une position pass (non anti-aliasé), ce que Blender peut tout à fait sortir.
Pour le dot product, Blender dispose dans son module de compo d’un node Vector > Normal avec un sortie Dot. Ça, ça permet de calculer l’ombre en fonction de l’orientation d’une light ciruclaire. Mais cela ne suffit pas pour faire du relight en fonction de la position.
Dans Natron, j’ai codé un truc en SeExpr pour faire du Relight 2,5D qui prend en compte la normal et la position pass. On le fournira avec le package dans pas longtemps.
Dans Photoshop, il n’y rien pour le calcul du Dot Product … parce que c’est pas un soft fait pour ça.
Il est pas non plus capable de calculer un Cosinus sur un angle … donc pas moyen de simuler un DP avec une quelconque bidouille.
A l’époque de la CS4, on avait Pixel Bender pour bidouiller ce genre de chose en GLSL … mais il a été viré deux versions plus tard. Dommage ….
lorsque tu parles de ponderation:
« Par contre, pour faire du relight correct, il faut calculer le Dot Product du vecteur représenté par le pixel de la normal map et du vecteur de la light, pondéré par sa position dans l’espace. Donc pour faire un vrai relight, il faut en plus une position pass (non anti-aliasé), ce que Blender peut tout à fait sortir. »
est ce pour simulér/calculer l’attenuation de la lumiere??
si c’est ce que je crois, j’ai du mal a voir comment calculer une position pass simplement exploitable, de mon point de vue, et encore une fois si j’ai bien capte, il faudrait pour cela sortir une sorte de « z-depth », puis ensuite calculer dans un espace 3d, la position de la light/cam afin de calculer la distance de chaque pixel de la « z-depth »/light. Mathematiquement je comprends le truc, mais la mise en place pour du religth m’a l’air tres « lourd ».
En tout cas merci de l’intervention tres riche en infos.
La « position pass » permet de stocker dans une image RGB la position XYZ d’un pixel dans l’espace, dans un espace linéaire et selon le système de cordonnées de Blender (donc en Z-UP). Il est important de stocker cette info dans une image supportant les données de type float signées (et donc potentiellement négative). L’EXR peut faire ça.
Donc tu as en stock :
– La position d’un pixel dans le worldspace
– La normal de ce pixel dans le worldspace en allant chercher le même pixel dans la normal map.
En définissant ensuite une lumière virtuelle de position X’Y’Z’, tu peux calculer un vecteur allant de la light au pixel. Ce vecteur et celui de la normal servent à calculer le produit scalaire (dot product) donnant ainsi l’atténuation de la light en fonction de l’angle.
Ca c’est si tu as une lumière de type Omni, met il ets possible de simuler une lumière conique ou directionnelle en tenant compte du vecteur d’orientation de la light. On peut ainsi calculer un coefficient de diffuse et un de spéculaire pour reproduire un modèle blinn/phong en « 2D » dans le screenspace. On peut même calculer de la lumière indirecte de la même manière en calculant du scattering ou de l’ambient occlusion dans le screenspace.
Ensuite, tu calcules la distance Light–>Pixel, et remap cette distance dans une fonction inverse quadratique pour plus de réalisme sur le decay.
Tu multliplies le résultat par la couleur que tu peux trouver dans la passe de color … et tu as fais du relight. 🙂
Merci pour les « eclaircissements »,
je voyais le fonctionnement, mais j’etais loin d’imaginer que le process pouvait etre mis en place facilement, parce que j’ai l’impression qu’ont doit un peu bidouiller avec les vector nodes pour simuler les position de la light.. a l’epoque ou j’ai appris blender je cherchais des parallèles avec maya et j’ai souvenir que le « lightinfo » node manquait dans blender, peut etre n’est ce plus le cas aujourd’hui.
Encore une fois merci pour les explications.
Bonjour à tous !
Je suis l’auteur de l’article en question. Tout d’abord, je remercie les modérateurs d’avoir relayé notre article ainsi que les personnes qui l’ont commenté.
En effet, le tutoriel comprend pas mal de raccourcis (d’erreurs…) et je m’en excuse. Notre intention première était de partager nos découvertes et recherches sur Blender/Cycles (que nous utilisons depuis 1 année maintenant). Le vocabulaire employé dans l’article et notre volonté de ne pas entrer trop dans les détails techniques étaient avant tout pour que le tutoriel soit ouvert au plus grand nombre d’utilisateurs. Ce tuto a été fait en toute modestie et ne comprenait que les connaissances que nous avions à l’époque sur le logiciel. Rédiger un tutoriel ouvert à tous n’est pas une chose simple et nous demandera encore quelque temps.
Nous entendons vos critiques et nous en prendrons compte pour la prochaine fois que nous aura un article à rédiger.
Après lecture de vos commentaires, nous changerons quelques termes dans l’article.
Il faut prendre cet article pour une méthode de relighting mais pas pour LA méthode.
Merci à François Grassard pour tout ces renseignements, nous en avons encore appris beaucoup ! 🙂
Bonjour Alex,
J’espère que vous n’avez pas pris ombrage du terme « bêtises » qui peut paraitre un peu fort. Je n’avais pour intention de blesser personne. Je pense en effet que c’est plus un problème de terminologie (on est un peu monomaniaques parfois) plus qu’un problème de volonté d’affirmer que c’est LA technique comme vous le précisiez. 🙂
Merci à vous d’avoir partagé vos recherches, qui de toute façon peuvent servir dans bien des cas. Étant un partisan des méthodes « c’est pas propre mais ça peut servir », je ne peux que saluer ce genre de techniques 🙂
Je suis content d’avoir pu vous éclairer sur le sujet. La 3D dans Photoshop a toujours été un sujet un peu délicat. Depuis le rachat de Mixamo par Adobe et l’intégration de Fuse CC, on voit apparaitre un import 3D supportant les squelettes … mais pour ce qui est de la retouche dans l’esprit de ce que vous montrez, ben on peut encore attendre.
Un language de shading intégré à Photoshop tel que l’a été Pixel Bender pourrait permettre de développer facilement ce genre d’effets, mais son retrait oblige maintenant à passer par l’API C++. Et mettant souvent les mains dedans … je peux vous dire que c’est pas la chose le plus facile du monde. 🙂
Encore merci à vous !