Voici l'image qui m'a interpellé:

Elle était sensé montrer une passe d'ambiant occlusion avec du bump sur un cube. On y voit assez clairement que le cube à droite régit mal à la la lumière. En effet, l'erreur classique est de casé l'ambiant occlusion dans la color ou dans l'ambiant du shader (ça pourrait être logique vu le nom...). Pourtant l'erreur est énorme.

Je rentrerai dans les détails plus bas. Pour l'instant je vais expliquer brièvement comment fonctionne le shader "lambert" de Maya et également pourquoi est ce que ce n'est pas si évident d'utiliser du bump avec son ambiant occlusion.

Un peu d'histoire

Il faut savoir que quand Alias (à l'époque) à décider d'intégrer Mental Ray à Maya, ce dernier en était déjà à la version 4 de son logiciel (La première version contenant Mental Ray fut la version 5). La représentation (n'entendez pas par là "visuelle" mais plutôt "conceptuelle") et le fonctionnement de sont moteur de rendu (Maya Software) était déjà "ancré" dans le logiciel et son interface. Seulement voila, Alias voulais une intégration transparente pour l'utilisateur (sik!) et y travailla d'arrache pied pendant pas mal de temps... Et on ne peut pas dire que ce fut glorieux (ceux qui se rappel des début de Mental Ray dans Maya vous le diront). Les philosophies de ces deux moteurs ne "concordaient" pas. Il en résultat une version 5 qui intégrait des tas de nodes qui s'interconnectaient très mal entre eux (la fameuse connections ".message" qui est complètement abstraite pour qui ne connais pas le fonctionnement de Mental Ray) et dont certains étaient présent en vu d'une exploitation ultérieur. La palme d'or des nodes Mental Ray inutiles intégrés à Maya revient au geometry shaders qui, même si ils fonctionnent (pour faire des torus, des spheres, des cubes etc...) n'est pas exploité pour faire ce qu'on attend de lui, de la géométrie instancié) . Encore aujourd'hui, si vous connectez tout et n'importe quoi vous vous retrouvez avec un retour sur le bureau sans un seul message d'erreur.
Il résultat de cette version 5 une sorte de "Mental-Ray-Node-Box" que des passionnés s'amuse à trifouiller.

C'est donc dans ce contexte que l'intégration c'est fait. Vous comprendrez donc que l'utilisation de Mental Ray demande un minimum de compréhension si on veux rester techniquement cohérent (Et faire des passes, ça parait tout simple, mais c'est assez technique au final).

Et l'ambiant occlusion bumpé dans tout ça?

On y arrive. :)

Le premier réflexe quand on veux faire une passe d'ambiant occlusion est d'utiliser un surface shader. C'est en effet la méthode la plus, "simple". Seulement voila: Le surface shader de Maya n'a pas de connections de bump disponible. Et pour cause, il n'a pas d'informations de normal, vous ne pouvez les faire varier (et donc réorienter le rayon de l'Ambient Occlusion). Alias, lors de l'écriture de Maya Software, devait considérer que les variations de normal se résumaient à du bump et n'était utile qu'en cas d'illumination. Il vous faut donc récupérer un shader qui dispose d'une connections permettant de faire varier sa normal. On vois que rolos à eu quelques soucis, il a du changer de shader et utiliser un Lambert. C'est en effet une des solutions (la plus simple je pense).

Mais!

Et oui, ce n'est pas aussi simple car ce genre de manipulation est assez peu documenté (normal, elle n'est pas très rigoureuse et son utilisation assez rare). (Pseudo)Explication:
Dans Maya, il y a plusieurs paramètres qui régisse la couleur final. Nous allons cependant nous focaliser sur les plus importants:

  • Color (La couleur)
  • Ambiant Color (Un "multiplicateur" de la couleur)
  • Incandescence (Une "addition" de la couleur)
  • Diffuse (Un "multiplicateur" de l'illumination, "l'impact" du shader en fait)

Je commence par le plus simple: Le Diffuse. C'est en quelque sorte un coefficient d'absorption (1 - kDiffuse = kAbsorbtion, désolé je ne me souvient plus du terme mathématique ^^ ). Donc pour une passe d'illumination ("Lamberiaine" par exemple), cette valeur doit être à 1. Ici, vous allez voir qu'on s'en fout un peu mais je voulais quand même en parler pour vous montrer que j'ai fait des math en 3ème car certains soft 3d n'ont pas ce coefficient là.

Le suivant est la couleur. Ici, rien de bien folichon, c'est la couleur de base mais ce n'est pas ici qu'on connecte notre node d'occlusion.

Next is the Ambiant Color (Notez l'accent :D ). Quand on joue avec, la première impression est: "ouaaah, ça éclaircie!"... Pas tout à fait. Ce paramètre n'éclaircis pas, il récupère la valeur de la couleur multiplié par sa propre valeur et l'additionne (enfin ça c'est à vérifier): Color * Ambiant Color + Color.

Le dernier est l'Incandescence. Au feeling l'équation pourrai donner ça: (1 - Couleur Total) * Incandescence. En gros, si la "Couleur Total" (le résultat de tout le reste) est comprise entre 0 et 1 et que l'Incandescence est égale à 1, le resultat sera toujours 1.

Bon, c'est vrai que les maths me manque un peu (d'ailleurs, si quelqu'un à une meilleur interprétation de ce problème, qu'il n'hésite pas à me laisser un commentaire). Mais pour faire simple, disons que:

  • Quand l'Incandescence = 0, le résultat de sortie du shader est égale aux résultats d'opérations utilisant les paramètres Diffuse, Color et Ambiant Color (entre autres)
  • Quand l'Incandescence = 1, le résultat de sortie du shader est 1

En Gros, si tous les paramètres sont à zero, la sortie du shader est égale à la valeur de l'Incandescence. :)

Super! On vient de créer un surface shader! Et... mais...

Et oui, :) maintenant nous avons une sorte de "surface shader" avec la possibilité de lui connecter un node de bump pour faire varier sa normal :D. C'est donc dans l'incandescence que nous connecterons l'Ambiant Occlusion, les autres valeurs devant êtres égales à zéro. Je reprend les images que j'avais créer pour le thread avec les explications.

1) Surface Shader avec Occlu dans la color
2) Lambert avec bump, color noir, ambient noir, occlu dans incandescence
3) Lambert color noir, ambient noir, occlu dans incandescence et displace dans le shading group
4) Lambert color gris de base, occlu dans ambient, incandescence noir
5) Lambert color gris de base, occlu dans ambient, incandescence noir, bump
6) Lambert color gris de base, occlu dans ambient, incandescence noir, displace
7) Lambert occlu dans color, ambient noir, incandescence noir
8) Lambert occlu dans color, ambient noir, incandescence noir, bump
9) Lambert occlu dans color, ambient noir, incandescence noir, displace

Et pour bien montrer que dans les deux dernière rangée nous avons des informations d'illumination et que donc, il ne s'agit pas de "passe d'occlusion" à proprement parler, j'ai désactivé la case: "illuminate by default" (qui créer une lumière à la position de la camera qui prend l'image lors ce qu'il n'y a aucune lumière dans la scène).

On vois bien que les deux dernière rangé on changé, elle on réagis à la présence (ici on parlerait plutôt d'absence) de lumière dans la scene. La seul qui n'a pas bougé est la première rangée (qui je le rappel n'utilise que l'incandescence). Ça démontre bien qu'il faut faire attention à la méthode utilisé car on peut se retrouver à calculer une prétendu "passe d'ambient occlusion" mais qui répond à l'éclairage de la scène.

J'espere que ce billet vous aura éclairci voir même aider à combiner le bump et l'Ambiant Occlusion de manière faire varier l'orientation de la normale pour calculer l'Occlu .