Spotlight dans fragment shader rotation
Bonjour,
Je suis débutant en OpenGL et je souhaite faire une lampe type lampe de bureau avec du coup un lumière "spotlight" qui en provient.
J'ai regardé pas mal d'explication et de programme déjà fait mais je n'arrive pas à faire suivre ma lumière en rotation.
Je suis sous une vieille version d'OpenGL (demandé par mon école...).
Pouvez-vous m'aider s'il vous plait ?
Voici ce que j'ai actuellement, j'utilise la méthode d'illumination de Phong:
Code:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #version 120
varying vec3 coordonnee_3d;
varying vec3 coordonnee_3d_locale;
varying vec3 normale;
varying vec4 color;
uniform sampler2D texture;
// vecteur position de ma lampe
uniform vec4 pos_lamp;
// matrice de rotation de ma lampe
uniform mat4 rot_lamp;
vec3 light = vec3(pos_lamp.x, pos_lamp.y, pos_lamp.z);
float angle;
void main (void)
{
//vecteurs pour le calcul d'illumination
vec4 light_new = rot_lamp *light ;
vec3 n = normalize(normale);
vec3 d = normalize(light_new.xyz-coordonnee_3d_locale);
vec3 r = reflect(d,n);
vec3 o = normalize(-coordonnee_3d_locale);
//calcul d'illumination
float diffuse = 0.5*clamp(dot(n,d),0.0,1.0);
float specular = 0.5*pow(clamp(dot(r,o),0.0,1.0),128.0);
float ambiant = 0.0;
//recuperation de la texture
vec2 tex_coord = gl_TexCoord[0].xy;
vec4 color_texture = texture2D(texture,tex_coord);
vec4 color_final = color*color_texture;
//couleur finale
angle = dot(d,n);
angle = max(angle,0);
// Test whether vertex is located in the cone
if(angle > radians(40))
gl_FragColor = (ambiant+diffuse)*color_final+specular*vec4(1.0,1.0,1.0,0.0); // (blanc)
else
gl_FragColor = (ambiant+diffuse)*color_final+specular*vec4(0.0,0.0,0.0,1.0); // (noir)
}
} |
Merci d'avance