Connexion
Menu Principal
Recherche
Menu secondaire
Image Aléatoire
Porshe 911-06.jpg
Publicité
Formation Blender ElephormBlender 3d Elephorm


     




(1) 2 3 4 ... 11 »


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 ) : le shader spéculaire Phong calcule le cosinus de l'angle entre le vecteur dirigé vers la caméra et le symétrique du vecteur direction de la lumière par rapport à la normale, ce qui revient à calculer le produit scalaire entre ces 2 vecteurs r et v, à condition que les vecteurs sur lesquels on travaille soient unitaires ("normalized" en anglais)



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)


/* Lafortune isotropic spec */
static float Lafortune_Spec( float *n, float *l, float *v, int hard , int tangent, float Cxy, float Cz )
{
	float rslt ;
	float x[3] ;
	float y[3] ;
	
	//find x axis perpendicular to surface normal : x[0]*n[0]+x[1]*n[1]+x[2]*n[2]=0 //
	if (n[0] == 0.0)
	{
		x[0] = 0.0 ;
		x[1] = n[2] ;
		x[2] = -n[1] ;
	}
	else if (n[1] == 0.0)
	{
		x[0] = n[2] ;
		x[1] = 0.0 ;
		x[2] = -n[0] ;
	}
	else
	{
		x[0] = n[1] ;
		x[1] = -n[0] ;
		x[2] = 0.0 ;
	}
	Normalize (x);
	
	//find y axis perpendicular to x axis and surface normal, with cross product between n and x//
	y[0] = n[1] * x[2] - n[2] * x[1] ;
	y[1] = n[2] * x[0] - n[0] * x[2] ;
	y[2] = n[0] * x[1] - n[1] * x[0] ;
	Normalize (y) ;
		
	//get view vector in new local coordinates system//
	v[0] = v[0]*x[0] + v[1]*x[1] + v[2]*x[2] ; // = v.x = cos (v, x) since x and v are normalized
	v[1] = v[0]*y[0] + v[1]*y[1] + v[2]*y[2] ; // = v.y = cos (v, y)
	v[2] = v[0]*n[0] + v[1]*n[1] + v[2]*n[2] ; // = v.n = cos (v, n)
	Normalize (v) ;
	
	//get light vector in new local coordinates system//
	l[0] = x[0]*l[0] + x[1]*l[1] + x[2]*l[2] ; // = l.x = cos (l, x) since x and l are normalized.
	l[1] = y[0]*l[0] + y[1]*l[1] + y[2]*l[2] ; // = l.y = cos (l, y)
	l[2] = n[0]*l[0] + n[1]*l[1] + n[2]*l[2] ; // = l.n = cos (l, n)
	Normalize (l) ;
	
	rslt = Cxy*l[0]*v[0] + Cxy*l[1]*v[1] + Cz*l[2]*v[2] ;
	// weighted dot product between light vector and view vector //
	if (tangent) rslt = sasqrt( 1.0f - rslt*rslt ) ; // in case tangent shading is turned on
	if( rslt > 0.0f ) rslt= spec(rslt, hard); // take the hardness parameter into account
	else rslt = 0.0f; // clamp negative values to 0
	return rslt;
	
}


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 ) Pour classifier, j'en vois 3, et j'imagine qu'ils sont liés (du moins pour les 2 premiers).

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 Rassurant parce que les vecteurs sont bien de sens opposé, mais alarmant parce que j'ai du mal à imaginer que des vecteurs supposés verticaux aient des composantes xyz aussi étranges...
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 Ca doit être lié au problème #1 aussi...
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é Lorsqu'une zone est dans l'ombre, il doit considérer que les spéculaires ne sont pas visibles, et donc ça permet de faire apparaitre d'autres taches spéculaires. En revanche, lorsque les ombres sont désactivées, même l'intensité 0 d'une tache spéculaire suffit à écraser l'autre (je doute que ça soit clair là... D'où les images à l'appui) (au passage, on constate sur ces images que le shading lui-même est pas au point : la tache spéculaire provenant de la lampe de gauche est étirée bizarrement, comme si l'ombrage tangent était activé...)
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... J'espère trouver réponse à mes questions, parce que les quelques résultats prometteurs obtenus ne me donnent pas envie de m'arrêter là...

...

et pour le fun, une petite vidéo stupide : http://www.vimeo.com/1441982

Contribution le : 31/07/2008 14:10
Créer un fichier PDF de la contribution Imprimer


Re: Shader spéculaire Lafortune, quelques questions...
Ze Grand Manitou
Inscrit:
24/07/2003 14:50
De la Région Parisienne
Post(s): 21787
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
Créer un fichier PDF de la contribution Imprimer


Re: Shader spéculaire Lafortune, quelques questions...
OverdOzed
Inscrit:
15/06/2006 10:11
De Rennes
Post(s): 759
Cool, merci pour le compliment, et merci pour les liens Je manquerai pas d'aller faire un tour sur ces forums, vu que mes problèmes sont plutôt ciblés faut avouer...
[edit] sur ce chat irc pardon

Contribution le : 31/07/2008 14:29
Créer un fichier PDF de la contribution Imprimer


Re: Shader spéculaire Lafortune, quelques questions...
Ze Grand Manitou
Inscrit:
24/07/2003 14:50
De la Région Parisienne
Post(s): 21787
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
Créer un fichier PDF de la contribution Imprimer


Re: Shader spéculaire Lafortune, quelques questions...
OverdOzed
Inscrit:
15/06/2006 10:11
De Rennes
Post(s): 759
J'avais lu trop vite IRC je connaissais juste de nom... L'article sur wiki explique bien, c'est plus clair maintenant

Contribution le : 31/07/2008 14:38
Créer un fichier PDF de la contribution Imprimer


Re: Shader spéculaire Lafortune, quelques questions...
RegulatorZ
Inscrit:
23/05/2004 07:11
De Metz
Post(s): 11299
Waouh. Je ne peux pas t'aider la dessus, mais je t'encourage vivement

Contribution le : 31/07/2008 14:41
_________________
Portfolio
Créer un fichier PDF de la contribution Imprimer


Re: Shader spéculaire Lafortune, quelques questions...
OverdOzed
Inscrit:
15/06/2006 10:11
De Rennes
Post(s): 759
Merci ! Je posterai mes avancées au fur et à mesure, si avancées il y a
[edit] et puis si je bloque vraiment, au moins en postant ça j'aurai peut-être donné envie à quelqu'un plus calé que moi en maths et en prog de prendre le relais

Contribution le : 31/07/2008 14:47
Créer un fichier PDF de la contribution Imprimer


Re: Shader spéculaire Lafortune, quelques questions...
Ze Grand Manitou
Inscrit:
24/07/2003 14:50
De la Région Parisienne
Post(s): 21787
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
Créer un fichier PDF de la contribution Imprimer


Re: Shader spéculaire Lafortune, quelques questions...
OverdOzed
Inscrit:
15/06/2006 10:11
De Rennes
Post(s): 759
Héhé moi aussi. J'avais déjà vu cette page en fait, à vrai dire je m'en suis farci plusieurs J'ai même trouvé une page où un type montre son code source, mais pour changer le repère il fait ça en 2 lignes... J'ai l'impression que c'est des fonctions préfaites.

Contribution le : 31/07/2008 15:06
Créer un fichier PDF de la contribution Imprimer


Re: Shader spéculaire Lafortune, quelques questions...
OverdOzed
Inscrit:
15/06/2006 10:11
De Rennes
Post(s): 759
En fait, ce qui m'étonne le plus c'est que personne ne l'ai fait avant moi. Parce que honnêtement, c'est assez accessible ; pas de maths vraiment compliquées, je ne suis qu'en Terminale après tout. Les opérations sont simples à coder... D'ailleurs, c'est bête à dire, les seuls problèmes que je rencontre sont liés au code de blender...
Qui plus est, ce modèle de shading n'est pas récent, ça date de quelque chose comme 97/98. J'ai surtout l'impression qu'une fois les shaders "par défaut" codés, on se dit que ça suffit, pas la peine d'aller voir plus loin C'est bien vrai que souvent, d'un modèle extrêmement complexe, plausible physiquement à un modèle tout bête, il n'y a que des subtilités invisibles au rendu, mais là, c'est différent. C'est d'ailleurs pour ça que j'ai choisi de coder ce shader

Contribution le : 31/07/2008 15:16
Créer un fichier PDF de la contribution Imprimer



 Haut   Précédent   Suivant
(1) 2 3 4 ... 11 »




Enregistrer votre réponse
Compte*
Nom   Mot de passe   Authentification
Message:*



[Recherche avancée]



Sujets récemment répondus
Forums Sujets Réponses Lus Dernières contributions
Questions & Réponses [non résolu] Conseil pour une topologie 0 3 Aujourd'hui 14:23:53
blendinfos 
Questions & Réponses Comportement 2.8 8 265 Aujourd'hui 08:55:40
Guppy88 
Questions & Réponses preferences utilisateur ne s'ouvrent plus 0 46 Hier 15:39:23
masje 
Questions & Réponses [résolu] Problème avec la symétrie    [1][2] 12 210 Hier 10:30:13
GFC 
Questions & Réponses Tableau d'objets déformés aléatoirement 3 71 Hier 10:11:10
WinZs 
Questions & Réponses galère d'importation SVG 5 156 Hier 08:42:16
Guppy88 
Questions & Réponses Utiliser Blend4Web? 1 47 Hier 07:07:16
WinZs 
Questions & Réponses Animation bvh 1 57 13/09 15:49:35
busanga 
Questions & Réponses riggin 2 74 13/09 11:14:08
debutant 
The Blender Clan 'tchat Demande de renseignements sur les caméras 360° 4 162 12/09 10:50:42
Laorz 
Questions & Réponses [résolu] UN TRACKING PLUS FONCTIONNEL 8 233 11/09 20:53:48
WinZs 
Questions & Réponses [non résolu] Papier translucide 4 391 11/09 09:29:35
zeromeetsinfinity 
Questions & Réponses changer le sens des normales 1 675 25/02/2017 19:40
Melodicpinpon 
Questions & Réponses Selection d'images pour le VSE 1 118 10/09 23:33:25
WinZs 
Questions & Réponses Mouvement de robe 8 143 10/09 21:05:08
Destruc18 
Questions & Réponses Je n'arrive pas à skinner mon pied... (débutant) 8 249 10/09 18:19:05
Aelendys 
Questions & Réponses [résolu] Images de fond face et profil aux dimensions différentes 2 165 09/09 17:15:07
GFC 
Questions & Réponses [non résolu] Blender game engine fracture    [1][2][3]...[8] 76 2649 09/09 16:53:24
Mat9999 
Questions & Réponses problème avec shadow catcher blender 2.8 cycles 2 198 09/09 14:51:43
stemo 
Questions & Réponses [résolu] Moyen pratique de supprimer une frame sur 2 (ou plus) ? 4 202 08/09 20:08:51
Okinage 

Qui est en ligne
76 utilisateur(s) en ligne (dont 34 sur Forums)

Membre(s): 1
Invité(s): 75


ebrain, plus...
Nouveaux membres
MadeleineC 15/9/2019
bolfab 13/9/2019
lolozen 9/9/2019
madmax-elkana 7/9/2019
karlouch 5/9/2019
Loan20 4/9/2019
ApexPredator 3/9/2019
boyerv 3/9/2019
foot 2/9/2019
lel 31/8/2019
Dernier Ajout
Forky-3D-ToyStory BC.png

Evènements à venir
Nov 18
Anniversaire de RichDeg
Dec 29
Anniversaire d'ebrain
Jan 11
BUG de Lyon
plus 278 plus d'élément(s)
 Par Mickaël Guédon [ebrain] © 2003-2019 The Blender Clan - hébergé par TuxFamily - Site déclaré à la CNIL sous le numéro 1155445