Почему у меня неправильное освещение? - PullRequest
0 голосов
/ 14 ноября 2011

У меня сфера с центром в C (0,0,0).Сейчас я вычисляю нормаль внутри вершинного шейдера.Я не передаю его ему.

#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

}

мой код основан на правиле косинуса Ламберта, в основном отсюда: http://en.wikipedia.org/wiki/Lambertian_reflectance

Что я получаю, это: enter image description here

1 Ответ

3 голосов
/ 14 ноября 2011

Скалярное (= точка) произведение двух векторов уже дает вам косинус угла этих векторов.Таким образом, ваш cos (угол) является полностью лишним.

Также обычно вычисляется скалярное произведение между нормалью поверхности и нормализованным вектором от источника света к точке на поверхности.Однако вы делаете точечное произведение между положением света и вектором нормали, что неверно.Вы хотите что-то вроде

dot_prod = dot( normalize(normal_light_pos - MV * gl_Vertex, normal_pos);

, обратите внимание, что вершина умножается только на представление модели (не проекция на просмотр модели).

Серьезно, вам нужно проработать какой-нибудь приличный учебник, слишком много не так с вашимпопытки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...