Trt Trt
Trt Trt

Reputation: 5532

Why is my lighting wrong?

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: enter image description here

Upvotes: 0

Views: 218

Answers (1)

datenwolf
datenwolf

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

Related Questions