Bonjour, j'ai réussi à calculer les normales moyennes pour chaque point. Et cela marche relativement bien en intérieur, mais j'ai quelques problèmes pour afficher un spot dirigé vers le sol. Voici deux screenshot pour que vous compreniez rapidement le problème (il y a un spot qui éclaire vers le bas la boule au centre du monde) :
Là ça marche :
http://www.mathieueylert.com/boule.jpg
et voilà le problème :
http://www.mathieueylert.com/boule2.jpg
Même quand je suis très loin de mon spot, le sol réfléchi bêtement la lumière spéculaire, je ne comprends pas d'où ca vient, voilà les réglages de ma lumières et des matériaux :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 // spot LUMIERE_DIFFUSE 1.0 1.0 1.0 1.0 LUMIERE_SPECULAR 1.0 1.0 1.0 1.0 LUMIERE_AMBIENT 1.0 1.0 1.0 1.0 LUMIERE_POSITION 0.0 1.0 0.0 1.0 CUTOFF 180 EXPONENT 0.0 DIRECTION 0.0 -1.0 0.0 LINEAR_ATTENUATION 1.0 // réglage matériaux MATERIAL_DIFFUSE 1.0 1.0 1.0 1.0 MATERIAL_SPECULAR 1.0 1.0 1.0 1.0 MATERIAL_AMBIENT 0.0 0.0 0.0 1.0 MATERIAL_EMISSION 0.0 0.0 0.0 1.0 SHININESS 10
voilà le code qui paramètre le tout :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 /* On parametre la source de lumiere */ glLightfv(light, GL_DIFFUSE, diffuseLight[i]); glLightfv(light, GL_SPECULAR, specularLight[i]); glLightfv(light, GL_AMBIENT, ambientLight[i]); glLightfv(light, GL_POSITION, positionLight[i]); /* On parametre le spot */ glLighti(light, GL_SPOT_CUTOFF, cutoff); glLightfv(light, GL_SPOT_DIRECTION, direction); glLightf(light, GL_SPOT_EXPONENT, exponent); glLightf(light, GL_LINEAR_ATTENUATION, linear_attenuation); /* Pour rendre les materiaux (textures) brillants */ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); /* L'oeil est dans la scene, plus realiste */ glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); /************************************** * On parametre les materiaux *************************************/ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuseMaterial); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specularMaterial); glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambientMaterial); glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, emissionMaterial); /* Brillance du materiau */ glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
bref, tout m'a l'air correct, je ne vois pas pourquoi ça fait ça. De toute façon le résultat est moyen quand il n'y a pas beaucoup de face sur un objet, je vais devoir faire de la lumière par vertex.
Est ce que quelqu'un a déjà fait ça et pourrais me dire où je pourrais trouver un tuto ou un bout de code bien commenté, qui explique bien le principe, car je pense qu'il faut passer par une extension openGL. J'ai trouvé un ou deux bouts de codes, mais sans aucun commentaires, pas indentés, ni rien donc inutilisable...
Merci pour votre aide.
Partager