ReflectanceFunctions odForce (Traduction)

Note sur la traduction

Cette page est la traduction de la première partie (What is a BRDF?) de la page ReflectanceFunctionsdu wiki de od[force].

Si vous êtes un utilisateur de Houdini, je vous invite fortement a fouiller un peu dans leur wiki qui est bourré d'informations! Merci à eux de partager tout ça.


Si vous avez déjà lu un article ou un tutorial de shading, il y a des chances que vous ayez déjà rencontre le terme BRDF, dans la mesure où cet acronyme représente un élément dont doit tenir compte tout shader (ou futur shader). C'est un de ces nombreux acronymes indéchiffrables mais omniprésents dont connaître le mot qui se cache derrière chaque initial ne vous en dit pas plus sur ce a quoi il est sensé servir.

Les initiales signifient Bidirectional Reflectance Distribution Function... Ok, Ca c'est fait.

“wtf?!?” o_o?

C'est quoi une BRDF?

Le concept de base est en fait assez simple a comprendre, mais les calculs mathématiques définissant sa représentation peuvent vite vous donner la migraine. Mon but ici est d'essayer de la rendre aussi accessible que possible, y compris la partie mathématique. Commençons par disséquer l'acronyme en question.

Function

La première chose a comprendre est que nous parlons bien d'une fonction. En d'autres mots, une expression mathématique qui relie une chose a une autre. Un truc qui nous donnerai une valeur sortante en fonction d'un certain nombre de valeurs en entrés. C'est ce que représente le F de l'acronyme. Dans notre cas, la fonction est sensé nous dire quelle quantité de lumière rebondi sur la surface en direction de nos yeux (c'est l'output). Et pour pouvoir calculer ça, il lui faut quelque chose... Le “quelque chose” dépendra de “comment” la fonction est mis en place.

Cela dit, la fonction devra au minimum connaître (C'est l'input):

Reflectance

Le but de cette fonction est donc de relier les intensités lumineuses entrantes et sortantes. Par intensités lumineuses sortante on veut dire la quantité de lumière réfléchi sur la surface (dans la direction du viewer). Ce phénomène s'appelle la Reflectance et c'est ce que représente le R de l'acronyme.

La Figure 1 montre cette relation (en 2D). Notez qu'une partie de l’intensité entrante peut être absorbée ou éparpillé dans le médium. Mais notre petite fonction ne s'en soucis pas. Elle ne se préoccupe que de l’intensité réfléchi dans une direction donnée.

Mgm_brdf_1.jpg
Figure 1: La quantité de lumière rebondissant sur la surface en direction du viewer. Ici, l’intensité lumineuse est représentée par l’épaisseur du rayon. Notez que le rayon sortant est plus fin que le rayon entrant. L’énergie manquant n'a en fait pas disparu, elle a juste rebondi dans une autre direction.

Bidirectional

Arrivé ici, on peut approfondir et essayer de voir ce qui arriverait si on inversait la position du viewer et la position de la light. Il peut être démontrée que, si votre objet n’émet aucune lumière de lui même, et si notre fonction est physiquement correct, le résultat devrait être exactement le même dans les deux cas. En d'autres mots, notre fonction devrait renvoyer le même résultat dans les deux directions. C'est cette particularité que représente le B, “Bidirectional”: Un résultat identique dans les deux direction, comme montre sur la Figure 2.

Mgm_brdf_2.jpg
Figure 2: Pour que la fonction soit bidirectionnelle, elle doit renvoyer le même résultat, même si nous inversons les directions entrantes et sortantes. Aussi surprenant que cela puisse paraître, certaines BRDF spéculaires ne satisfont pas à cette exigence.

Distribution

Mais que ce passe t'il si le viewer se déplace? Si on imagine une surface brillante éclairé par le soleil, on peut a priori penser que la quantité de lumière réfléchie vers la nouvelle position est différente de celle d'avant. En fait, on peut même affirmer que toute surface “naturelle” réfléchie de la lumière en quantité variable suivant la relation entre les trois composants géométriques principaux:

Parfois la différence est subtile, parfois elle est prononcée, mais il y a, généralement, une différence.

La Figure 3 montre ce que notre hypothétique fonction revoit en fonction de la position du viewer. Le reste (light, surface) est statique.

Mgm_brdf_3.jpg
Figure 3: Ici, nous plaçons le viewer sur plusieurs positions suivant un demi cercle autour de la surface. Pour chaque position nous samplons l’intensité renvoyé par la BRDF. L’intensité est représenté par la taille de chaque rayon réfléchissant (en jaune).

Dans la figure 1, 2 et 3, nous avons choisi de représenter “l’intensité” par la grosseur du rayon (Plus le rayon est épais, plus l’intensité rebondit dans la direction donnée. Mais il y a une infinité de positions possibles pour le viewer pouvant être sur le semi cercle de notre exemple, et si nous voulons tous les dessiner, le résultat pourrait rapidement ne plus ressembler a rien.

Mgm_brdf_4.jpg
Figure 4: Au lieu de visualiser l’intensité via l’épaisseur des rayons réfléchis, nous pouvons choisir de la représenter en utilisant la longueur du vecteur pour chaque direction du viewer.

Au lieux de ça, nous pourrions représenter l’intensité en utilisant la longueur du rayon (Plus le rayon est long plus la reflection est intense). Cette approche donnerait un résultat plus propre et permettrait d'afficher plus de positions de viewer en un seul schéma. La Figure 4 utilise cette méthode.

Finalement, Puisque nous savons déjà que toutes nos lignes commencent a l'endroit ou la lumière entrante touche la surface, nous n'avons pas vraiment besoin de dessiner ces lignes, juste les points finaux. Cela pourrait même être plus propre et nous permettrait de visualiser encore plus de samples. Et pour une petite touche esthétique, nous pouvons joindre tout les points ensembles pour avoir une meilleur idée de la forme globale. Ce que j'ai fait (et qu'on voit sur la Figure 5) c'est créer un tracé polaire de notre fonction.

Mgm_brdf_5.jpg
Figure 5: Dans la mesure où l'origine de tout les samples est le même, nous pouvons masquer les vecteurs et simplement garder les points finaux, que nous pouvons ensuite joindre pour arriver a un tracé polaire de la BRDF (en 2D).

En fonction d'une direction de lumière entrante et de la normale de la surface, nous pouvons constater, en regardant la Figure 5, que ce que notre fonction est en train de faire c'est de calculer une Distribution des intensités réfléchies sur le demi-cercle au-dessus de notre surface. Elle prend une intensité entrante, et la redistribue dans plusieurs directions. D’ailleurs, en vous ayant montré ce phénomène (qui explique le dernier morceau de l'acronyme), je devrait également dire que cette distribution est uniquement applicable a cette combinaison particulière (la direction entrante et de la normale de la surface). Si nous devions changer la relation entre ces deux composants, puis retracer les graphs ci dessus, on peut quasiment garantir d'avoir une distribution différente... Et maintenant, vous devriez commencer à vous familiariser avec ce petit monstre. Ça devrait vous permettre, au moins dans ses grandes lignes, d'avoir une idée de ce que le terme Bidirectional Reflectance Distribution Function veut dire.

Dernière mise à jour : ven. 06 novembre 2020