Bonjour,
J'essaye de faire un éclairage par pixel pour une lampe omnidirectionnel et je me base sur ce cours :
http://www.lighthouse3d.com/opengl/g...php?pointlight
Voici le code des shader :
(vert)
(frag)
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 varying vec4 diffuse, ambient; varying vec3 normal, lightDir, halfVector; varying float dist; void main() { vec4 ecPos; vec3 aux; normal = normalize(gl_NormalMatrix * gl_Normal); //light direction ecPos = gl_ModelViewMatrix * gl_Vertex; aux = vec3(gl_LightSource[0].position - ecPos); lightDir = normalize(aux); dist = length(aux); //diffuse and ambient diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse; ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient; //specular halfVector = normalize(gl_LightSource[0].halfVector.xyz); gl_Position = ftransform(); }
Le code fonctionne bien sauf quand la caméra est dans certaine position, je n'ait plus aucun éclairage (comme si la lumière s'éteignait) !
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 varying vec4 diffuse, ambient; varying vec3 normal, lightDir, halfVector; varying float dist; void main() { vec3 n, halfV; vec4 color = vec4(0.0); float NdotL, NdotHV, att; //normalize the interpolated normal n = normalize(normal); NdotL = max(dot(n, normalize(lightDir)), 0.0); if (NdotL > 0.0) { //diffuse and ambient att = 1.0 / (gl_LightSource[0].constantAttenuation + gl_LightSource[0].linearAttenuation * dist + gl_LightSource[0].quadraticAttenuation * dist * dist); color = att * (diffuse * NdotL + ambient); //specular halfV = normalize(halfVector); NdotHV = max(dot(n, halfV), 0.0); color += att * gl_FrontMaterial.specular * gl_LightSource[0].specular * pow(NdotHV,gl_FrontMaterial.shininess); } gl_FragColor = color; }
NB 1 : Si j'utilise l'éclairage par vertex offert par OpenGL, la lumière ne s'éteint jamais.
NB 2 : Le shader du site pour les lampe directionnel fonctionne sans problème.
Il me semble donc que la seule partie du code qui pourrait être mauvaise se trouve dans le calcul de la position de la lumière :
Merci d'avance...ecPos = gl_ModelViewMatrix * gl_Vertex;
aux = vec3(gl_LightSource[0].position - ecPos);
lightDir = normalize(aux);
dist = length(aux);
Partager