Reputation: 5532
I have a sphere centered at C(0,0,0). For now I calculate the normal inside the vertex shader. I don't pass it to it.
#version 330
layout(location = 0) in vec3 in_Position; //declare position
layout(location = 1) in vec3 in_Color;
// mvpmatrix is the result of multiplying the model, view, and projection matrices */
uniform mat4 MVP_matrix;
vec3 constant_col;
vec3 normal_pos,normal_light_pos;
vec3 Light_Pos = vec3(3.0f, 2.0f, 4.0f); //Light Source
float light_magn,norm_magn;
float dot_prod;
float angle;
float Light_in;
out vec3 ex_Color;
void main(void) {
// Multiply the MVP_ matrix by the vertex to obtain our final vertex position (mvp was created in *.cpp)
gl_Position = MVP_matrix * vec4(in_Position, 1.0);
//normalizing vectors
normal_pos = normalize(in_Position);
normal_light_pos = normalize(Light_Pos);
//calculating the vector's magnitude
light_magn = sqrt(pow(normal_light_pos.x,2) + pow(normal_light_pos.y,2) + pow(normal_light_pos.z,2));
norm_magn = sqrt(pow(normal_pos.x,2) + pow(normal_pos.y,2) + pow(normal_pos.z,2));
dot_prod = dot(normal_light_pos, normal_pos); //getting the dot product
angle = dot_prod/ (light_magn*norm_magn); //getting angle in radians
angle = clamp(angle, 0, 1);
Light_in = cos(angle); // here I calculate the light intensity
constant_col = vec3(1.0f,0.0f,0.0f); //set the sphere's color to red
ex_Color = constant_col * Light_in ; //for sphere
}
my code is based on Lambertian cosine rule, basically from here: http://en.wikipedia.org/wiki/Lambertian_reflectance
What I get is this:
Upvotes: 0
Views: 218
Reputation: 162164
The scalar (=dot) product of two vectors already gives you the cosine of the angle of those vectors. So your cos(angle) is totally superfluous.
Also one normally calculates the dot product between the surface normal, and the normalized vector from light source to point on surface. You however do a dot product between light position and normal vector, which is not correct. You want something like
dot_prod = dot( normalize(normal_light_pos - MV * gl_Vertex, normal_pos);
note that the vertex is multiplied with modelview only (not modelviewprojection).
Seriously, you should work through some decent tutorial, there's just to much wrong with your attempts.
Upvotes: 3