I have been trying to implement a spotlight in my project. It works but at some point I noticed that when moving the camera around, the light was following the camera, and this is not what I wanted.
I found a way to fix the spotlight position so that it doesn't follow the camera anymore (multiplying it by the viewMatrix), but not the spotlight direction.
If I multiply the spotlight direction by the viewMatrix as in the following code, the spotlight appears to be moving in an unexpected way when I move the camera.
In my javascript file I compute the following:
viewMatrix = lookAt(viewerPos, at, up);
vertex shader:
vec3 pos = (uModelViewMatrix*aPosition).xyz;
N = normalize(uNormalMatrix*aNormal.xyz);
E = -normalize(pos);
vec3 cameraToLight = (uViewMatrix*uSpotLightPosition).xyz;
L = normalize(cameraToLight - pos );
vec3 cameraToDirection = (uViewMatrix*uSpotLightDirection).xyz;
lightDir = normalize(cameraToDirection - cameraToLight);
gl_Position = uProjectionMatrix * uModelViewMatrix * aPosition;
fragment shader:
vec3 H = normalize( L + E );
float Kd = max(dot(L, N), 0.0);
float Ks = pow(max(dot(N, H),0.0),uShininess);
vec4 ambient = uAmbientProduct;
vec4 diffuse = Kd*uDiffuseProduct;
vec4 specular = Ks*uSpecularProduct;
if( dot(L, N) < 0.0 )
specular = vec4(0.0, 0.0, 0.0, 1.0);
if(dot(normalize(lightDir), -normalize(L))>=uSpotlightOpeningAngle)
fColor = ambient+ diffuse;
else
fColor = vColor;