2011-11-14 5 views
0

나는 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 

} 
내 코드가 산란 방사 코사인 규칙에 따라 기본적으로 여기에서있다

: 이 enter image description here

+1

이 문제를 해결할 수 있을지는 확실하지 않지만 내적 길이가 A *의 길이로 정의되고 벡터의 길이가 벡터 사이의 각도의 코사인이고 A와 B가 1 인 경우 ' dot_prod'와'Light_in'은 같은 값이어야하고 많은 계산을 줄일 수 있습니다. – slugonamission

+0

구체적으로 무엇이 잘못 되었습니까? 중심의 날카로운 주요 사건을 제외하고, 나머지는 ok로 보인다. – NickLH

+0

셰이더에서 법선을 "계산"하는 것이 아닙니다. 표면 점 위치에서 법선을 추론 할 수있는 유일한 모양이 있으며, 그 점은 원점 주변의 구입니다. 다른 모든 도형의 경우 로컬 꼭지점 위치에서 결정할 수 없으므로 normal을 명시 적으로 지정해야합니다 (일부 트릭에서는 프래그먼트 셰이더에서 패싯 normal을 추출 할 수 있지만 결과는 좋지 않습니다). 셰이더에서 법선을 전혀 계산하지 마십시오. 그것은 무의미합니다. – datenwolf

답변

3

두 벡터의 스칼라 (= 점) 제품이 이미 제공 : http://en.wikipedia.org/wiki/Lambertian_reflectance

는 내가 얻을 것이 이것이다 당신은 그 벡터의 각을 코사인으로 나타냅니다. 따라서 cos (각도)은 완전히 불필요합니다.

또한 일반적으로 표면 법선과 광원에서 표면을 가리키는 정규화 된 벡터 사이의 내적을 계산합니다. 그러나 라이트 위치와 법선 벡터 사이의 점을 찍는 것은 올바르지 않습니다. 당신은 정점이 모델 뷰 전용 (하지 modelviewprojection)에 곱하는 것을

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

노트 같은 것을 원한다.

진지하게, 당신은 약간의보기 흉하지 않은 튜토리얼을 통해 일해야합니다, 당신의 시도에 많은 잘못이 있습니다.

+0

감사합니다. 문제는 단지 "각도"문제였습니다 –

+2

문제는 "각도 문제"가 아니 었습니다. 모두가 지금까지 백만 번이나 말했지만 튜토리얼과 기본 수학 및 기하학을 읽으십시오! 방금 정규화 한 벡터의 크기를 계산합니다 (힌트 : 정의입니다.) cargo-cult 프로그래밍의 요점. 또한 GLSL에는 length() 함수가 있습니다. –

관련 문제