|
Shader spéculaire Lafortune,anisotropie codée, build + patch dispos |
|
---|---|---|
OverdOzed
![]() ![]() Inscrit:
15/06/2006 10:11 De Rennes
Post(s): 759
|
Salut tout le monde,
ne sachant pas quoi faire de la fin de mes vacances, j'ai décidé de coder un nouveau shader pour Blender. Il s'agit d'un shader spéculaire de type Lafortune, qui permet le rendu de taches spéculaires bien plus crédibles que Phong par exemple... Et je rencontre quelques problèmes ![]() Tout est décrit dans ce "paper" (pas trouvé de traduction adéquate) : www.graphics.cornell.edu/pubs/1997/LFTG97.pdf Pour faire bref, voici le principe (si vous n'avez pas envie de lire le paper ![]() ![]() Ensuite, on éleve ce cosinus à une puissance plus ou moins élevée pour rendre la tache spéculaire plus ou moins découpée (c'est le paramètre "Hardness" dans Blender). On peut aussi multiplier le résultat obtenu par un coefficient multiplicateur entre 0 et 1 -ça correspondrait à l'albedo - dans Blender c'est le paramètre "Spec" (qui va de 0 à 200%...) Ca donne ceci : f(r,v)=albedo*cos(r,v)^n = albedo*(xr*xv + yr*yv+zr*zv)^n Pour calculer r, symétrique de l par rapport à n, on peut utiliser une matrice de householder, comme c'est dit dans le paper (là j'ai pas compris... en terminale on nous apprend même pas ce que c'est qu'une matrice... ![]() La nouveauté, c'est qu'en remplaçant cette matrice par une matrice générale, et quelques calculs plus tard, on tombe sur le produit scalaire l.v mutiplié par une matrice diagonale 3*3 dont on peut choisir les coefficients. Ca revient à pondérer les termes du produit scalaire par des coefficients Cx, Cy, Cz. Les vecteurs l et v doivent être exprimés dans des coordonnées locales, avec l'axe z aligné sur la normale à la surface, et les axes x et y alignés sur les directions principales d'anisotropie (l'anisotropie j'arriverai pas à le coder je crois, ça fait pas mal de géométrie, dans l'espace en plus... ![]() En somme, on a ça : f(r,v)=albedo*(Cx * xl*xv + Cy * yl*yv + Cz * zl*zv)^n (comme je l'ai dit, je laisse tomber pour l'anisotropie, donc Cx = Cy) Cette formule permet d'obtenir un ombrage plus réaliste, surtout aux angles rasants pour lesquels les autres shaders spéculaires ne sont pas très convaincants : ![]() (en haut à gauche, shader spéculaire Phong, en haut à droite, réflexions floues en lancer de rayons, en bas à gauche, shader Lafortune certifié... Y'a pas photo ![]() Voilà pour la théorie, voici mon code, j'ai commenté partout où c'était utile. (je ne montre que la fonction de shading en elle même, le reste, c'est du code par ci par là pour rajouter des boutons dans l'interface, etc)
Voilà, pour résumer, d'abord je cherche l'axe x tel qu'il soit perpendiculaire à la normale, ensuite je cherche l'axe y tel qu'il soit perpendiculaire à x et n (produit vectoriel), ce qui me permet ensuite de projeter les vecteurs l et v sur ces 3 axes locaux. Enfin, il ne reste plus qu'à calculer le produit scalaire l.v, pondéré par Cx=Cy (que j'ai nommé Cxy) et par Cz. J'imagine que mon changement de repère est bricolé bizarrement, mais logiquement c'est bon... ![]() Voici mes problèmes (ouf on y vient ![]() 1- je me demande vraiment comment sont gérés les vecteurs dans blender... Un exemple : je fais une scène avec un Sun parfaitement vertical dirigé vers le bas, et un plan parfaitement horizontal tourné vers le haut, donc sa normale est verticale, tournée vers le haut. Le Sun envoie des rayons depuis une distance supposée infinie, donc tous parallèles, donc le vecteur l est constant. Je décide d'afficher dans la console les vecteurs n et l, et voilà ce que j'obtiens : n(-0.010817, 0.895343, 0.445245) et l(0.010817, -0.895343, -0.445245). Je trouve ça rassurant et alarmant en même temps ![]() ![]() 2- Je me demande si mon bricolage pour le changement de repère est opérationnel... L'intuition me dit que oui, mais le fait est que ce que j'ai pour le moment N'EST PAS un shader Lafortune ![]() Exemple : on est dans un système de coordonnées locales, avec n l'axe z. Autrement dit, en mettant Cxy = -1 et Cz = 1, ça revient à prendre le symétrique de l par rapport à n, c'est-à-dire que choisir ces coefficients précisément devrait me faire retomber sur un ombrage Phong standard. Or, avec ces paramètres, j'ai certes des spéculaires qui ressemblent à quelque chose, mais je n'obtiens pas exactement un ombrage Phong. Et pourtant, certains rendus que j'obtiens me donnent vraiment des choses sympa, qui ressemblent à ce dont est capable un shader Lafortune ![]() ![]() Bref, je me demandais si mon changement de repère est valide. 3- un 3è problème complètement différent des 2 autres : les taches spéculaires refusent de s'additionner. Exemple en images : ![]() Comme on voit, lorsque les ombres sont activées, c'est mieux mais quand même bien bugué ![]() ![]() J'ai au début pensé que ça ne venait pas de la fonction de shading elle-même, mais d'une mauvaise déclaration autre part, ce genre de chose... Mais en fait, il s'avère que c'est bien à l'intérieur de la fonction que ça plante (j'ai copié collé le code du shader Phong à l'intérieur de ma propre fonction, et tout marchait nickel). Je vois vraiment pas d'où pourrait venir ce problème d'addition des spéculaires. Voili voilou, si vous êtes arrivé à la fin de ce post, chapeau... ![]() ... et pour le fun, une petite vidéo stupide : http://www.vimeo.com/1441982
Contribution le : 31/07/2008 14:10
|
|
![]() ![]() |
|
Re: Shader spéculaire Lafortune, quelques questions... |
|
---|---|---|
Ze Grand Manitou
![]() ![]() Inscrit:
24/07/2003 14:50 De la Région Parisienne
Post(s): 21822
|
Waouh le résultat a vraiment du potentiel, c'est vraiment excellent !
![]() Je peux pas beaucoup t'aider pour la technique, mais par contre si tu as besoin de renforts go là : irc.freenode.net #blendercoders Bon courage pour la suite ![]() @+
Contribution le : 31/07/2008 14:24
|
|
_________________
![]() Mickaël Guédon | Site pro : www.mickaelguedon.com | Fondateur du Blender Clan : www.blenderclan.org Auteur de Formations Blender chez Elephorm |
||
![]() ![]() |
|
Re: Shader spéculaire Lafortune, quelques questions... |
|
---|---|---|
Ze Grand Manitou
![]() ![]() Inscrit:
24/07/2003 14:50 De la Région Parisienne
Post(s): 21822
|
Ah ce ne sont pas des forums...
Ce sont des salons de chat IRC. Tu rentres irc.freenode.net en tant que serveur. Et tu mets #blendercoders comme salon. Je partais du postulat que tu connaissais IRC, pardon pour ce manque de délicatesse : http://fr.wikipedia.org/wiki/Irc @+ ![]()
Contribution le : 31/07/2008 14:32
|
|
_________________
![]() Mickaël Guédon | Site pro : www.mickaelguedon.com | Fondateur du Blender Clan : www.blenderclan.org Auteur de Formations Blender chez Elephorm |
||
![]() ![]() |
|
Re: Shader spéculaire Lafortune, quelques questions... |
|
---|---|---|
Ze Grand Manitou
![]() ![]() Inscrit:
24/07/2003 14:50 De la Région Parisienne
Post(s): 21822
|
J'ai trouvé ceci qui est très intéressant :
![]() C'est une implémentation du shader Lafortune dans Maya. A gauche un Phong tout à fait classique, et à droite le Lafortune. Regardez comment la spec est extrêmement bien définie sur l'arrière de la sphère, alors que le phong ne rend presque pas compte de cette subtilité. Franchement j'espère que tu arriveras au bout de ce projet, il me tarde de jouer avec ![]() @+ ![]()
Contribution le : 31/07/2008 14:58
|
|
_________________
![]() Mickaël Guédon | Site pro : www.mickaelguedon.com | Fondateur du Blender Clan : www.blenderclan.org Auteur de Formations Blender chez Elephorm |
||
![]() ![]() |