Une couleur n’est visible que si elle reçoit de la lumière. C’est pourquoi, si un pixel n’est pas dans l’ombre d’un objet, on détermine la source de lumière qui l’éclaire.
Toute source de lumière possède un coefficient représentant son intensité. Ce coefficient est compris entre 0.0 et 1.0.
La lumière ambiante
Comme il est impossible de prendre en compte tous les rayons dérivés (rayons réfléchis, transmis etc…) dans la scène, on considère que ceux-ci constitue une lumière ambiante. Cette lumière, de faible intensité (environ 0.2) constitue un éclairage uniforme sur chaque objet constituant la scène.
Sa contribution à la couleur finale est :
La lumière diffuse
Pour l’instant, si l’on considère uniquement la lumière ambiante, les objets semblent plats. En effet, les objets sont d’une couleur unie et semble être en 2D. La composante diffuse d'une illumination représente le fait que l'énergie d'un faisceau lumineux s'étale d'autant plus sur la surface d'un objet si son angle d'incidence est proche de la tangente à l'objet.
Pour représenter cet effet, notre moteur suit la valeur de Beer-Lambert :
Cette formule fait intervenir l’angle entre le rayon lumineux et la normale au point à travers le produit scalaire. Ainsi, on obtient un dégradé représentatif de la diffusion de la lumière.
La lumière spéculaire
La lumière spéculaire représente une des propriétés des matériaux réfléchissants : la brillance. La brillance est en fait l’image de la source que l’œil (la caméra) perçoit via l’objet. Cette image est un cône formé par le rayon lumineux et le rayon réfléchi avec une intensité qui dépend de l’angle entre ces deux vecteurs.
Commentaires
Salut je suis en train de coder un raytracer en ce moment et je voulais avoir un peu plus d'explication sur la lumiere spéculaire, parce que je n'ai pas trés bien compris a quoi corresponde tes variables dans l'exemple.
MakMerci d'avance
Pour les variables :
Grégory Corgié- L : Vecteur de la lumière
- R : Vecteur du rayon réfléchi
Ensuite tu fais un produit scalaire entre ces deux vecteurs (avec le signe moins).
Les deux autres variables :
- N : Il s'agit d'un exposant que tu fixes. Plus il sera élevé, plus la valeur du produit scalaire sera atténuée. En effet, le valeur du produit scalaire est inférieure à 1 en norme car les vecteurs sont normés.
En gros, plus N est grand, plus la tâche spéculaire est petite.
- C : Il s'agit d'une constante que tu fixes encore selon ton modèle d'illumination. Pour chaque type d'éclairage (diffuse, constant, speculaire ) tu pondères avec une constante. Ici tu peux fixer C à 0.4 par exemple. Attention à ce que la somme des constantes soit inférieure à 1.
J'espère que c'est assez clair ?
Merci beacoup je vais le coder de ce pas ;)
MakJ'ai un probleme apres plusieur test.
MakLa lumiere speculaire marche bien mais je ne peux pas modifier la taille du halo qu'elle crai. A tu une idee de ou j'aurai pu me tromper ?
la taille du halo dépend de la valeur de l'exposant N.Tu dois pouvoir la moduler en faisant varier N.
Grégory CorgiéAu pire, rien ne t'empeche de seuiller la valeur du produit scalaire.
Sinon as tu des screenshots pour illustrer ton problème ?
Merci pour ton aide voici une capture d'ecran.
Makimg113.imageshack.us/img1...
La j'ai fait en sorte que le "bug" soit tres visible j'arrive a gerer son intensiter mais pas sa taille.
Si tu veux tu peux telecharger un la version qui bug rasenganpowa.free.fr/phen... voila et le fichier qui contient les calcul de la lumiere est light.c si tu pouvait jeter u coup d'oeil sa m'aiderai beaucoup.
Merci d'avance
Pour executer le programme faut le compiler et faut compiler aussi le contenue de img_reader. Ensuite il suffit juste de faire ./rt test.rti pour generer l'image puis aller dans img_reader et faire ./reader ../test.rti et voila.
MakOlà Mak,
Grégory CorgiéJ'ai eu le temps de regarder très vite fait ton code. J'avoue pas avoir eu trop le temps en fait mais je regarderai un peu plus.
1er problème, la compil ne marche pas sur mon Mac. Il doit manquer un petit truc.
Par contre, déjà quelques petits conseils:
- Tu devrais déjà te faire une petite librairie vectorielle avec les opérateurs de base (surcharge des opérateurs de base, produit scalaire, produit vectoriel, normalisation ...). Tu gagneras en lisibilité et en fiabilité. Je te raconte pas les erreurs d'inattention que tu risques d'introduire en tappant à chaque fois ton produit scalaire.
- Tu gagnerais à travailler avec des floats en terme de vitesse. Après tout dépend de ce que tu veux faire.
- Travailles avec des vecteurs de lumière normalisés. Le module de ces vecteurs n'est pas utile, seule leur direction importe.
Merci pour ton aide.
MakJe pense savoir pourquoi la version que je t'ai passer ne compile pas j'en ai refait une qui devrai compiler.
ps: J'ai aussi un Mac donc normalement les librairies sont compiler et marche. L'idée de la librairie vectorielle n'est pas mal mais je ne sais pas trop quoi mettre dedans.
Si jamais sa te dit de suivre l'évolution de du projet tu peux aller ici (code.google.com/p/raytrac...
Ooups j'ai faillie oublier de te passer les sources.
Makrasenganpowa.free.fr/phen...
Merci pour ton aide mais c'est bon sa marche ;)
Mak