2010-04-02 3 views
1

Phong 조명 체계를 사용하여 하나의 상자와 점 광원을 포함하는 장면을 렌더링하고자합니다. 내가 방향성 광원을 사용하여 내 코드, 내가 얻을 원하는 렌더링 된 이미지를 실행할 때 때문에 오류가 하나 LightDirection(...) 또는 LightIntensity(...) 기능 어딘가에 있어야한다는 생각Phong 모델을 사용한 점 광원 조명

R3Rgb Phong(R3Scene *scene, R3Ray *ray, R3Intersection *intersection) 
{ 
    R3Rgb radiance; 
    if(intersection->hit == 0) 
    { 
    radiance = scene->background; 
    return radiance; 
    } 

    ... 
    // obtain ambient term 
    ... // this is zero for my test 

    // obtain emissive term 
    ... // this is also zero for my test 

    // for each light in the scene, obtain calculate the diffuse and specular terms 
    R3Rgb intensity_diffuse(0,0,0,1); 
    R3Rgb intensity_specular(0,0,0,1); 
    for(unsigned int i = 0; i < scene->lights.size(); i++) 
    { 
    R3Light *light = scene->Light(i); 
    R3Rgb light_color = LightIntensity(scene->Light(i), intersection->position); 
    R3Vector light_vector = -LightDirection(scene->Light(i), intersection->position); 

    // check if the light is "behind" the surface normal 
    if(normal.Dot(light_vector)<=0) 
     continue; 

    // calculate diffuse reflection 
    if(!Kd.IsBlack()) 
     intensity_diffuse += Kd*normal.Dot(light_vector)*light_color; 

    if(Ks.IsBlack()) 
     continue; 

    // calculate specular reflection 
    ... // this I believe to be irrelevant for the particular test I'm doing 

    } 

    radiance = intensity_diffuse; 
    return radiance; 
} 

R3Rgb LightIntensity(R3Light *light, R3Point position) 
{ 
    R3Rgb light_intensity; 
    double distance; 
    double denominator; 
    if(light->type != R3_DIRECTIONAL_LIGHT) 
    { 
    distance = (position-light->position).Length(); 
    denominator = light->constant_attenuation + 
         (light->linear_attenuation*distance) + 
         (light->quadratic_attenuation*distance*distance); 
    } 

    switch(light->type) 
    { 
    ... 

    case R3_POINT_LIGHT: 
     light_intensity = light->color/denominator; 
     break; 

    ... 
    } 
    return light_intensity; 
} 

R3Vector LightDirection(R3Light *light, R3Point position) 
{ 
    R3Vector light_direction; 
    switch(light->type) 
    { 
    ... 
    case R3_POINT_LIGHT: 
     light_direction = position - light->position; 
     break; 
    ... 
    } 
    light_direction.Normalize(); 
    return light_direction; 
} 

: 다음은 내 계산을위한 관련 코드 조각입니다 (따라서 Phong 조명 방정식이 정확하다는 것을 알게됩니다.) 또한 Phong (...)에서 intensity_diffuse을 계산할 때 디버깅하는 동안 light_color을 10으로 나눈 결과 필요한 이미지가 더 많이 나타납니다. light_color을 정확하게 계산합니까?

감사합니다.

+0

무엇이 오류입니까? –

+0

결과 렌더링 된 이미지가 예상보다 밝습니다. 그래서 "오류"에 의해 주어진 포인트 위치에서 빛의 강도를 계산할 때 오류가 있었음을 의미합니다. – Myx

+0

'light_intensity = light_intensity/(1. + distance + distance * distance);를 추가하여 구현을 테스트 한 결과' light_intensity = light-> color/denominator;''LightIntensity (...) '에서 원하는대로 줄 것입니다. 이게 정상인가? 편집 : 이것은 내가 정확히 원하는 것을주지 않는다. 그러나 어떤 종류의 구분이 완료되어야 할 필요가있는 것처럼 보인다 .... – Myx

답변

0

나는 밖으로 돌았 다. 결과를 정확하게 비교하지 못하는 "최종 이미지"가 올바르게 계산되지 않았습니다.