2010-04-02 3 views
1

Я хочу сделать сцену, содержащую одну коробку и источник точечного света, используя схему освещения Фонга. Ниже приведены соответствующие фрагменты кода для моего расчета:Точечная подсветка с использованием модели 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; 
} 

Я считаю, что ошибка должна быть где-то в или LightDirection(...) или LightIntensity(...) функции, потому что, когда я запускаю мой код, используя направленный источник света, я могу получить желаемую визуализацию изображения (таким образом, это заставляет меня поверить в правильность уравнения освещения Фонга). Кроме того, в Phong (...), когда я вычислил intensity_diffuse и во время отладки, я разделил light_color на 10, я получал результирующее изображение, которое больше походило на то, что мне нужно. Я правильно вычислил light_color?

Спасибо.

+0

Какая ошибка? –

+0

получившееся изображение меньше, чем ожидалось. Таким образом, по ошибке я имел в виду, что, возможно, я ошибся при вычислении интенсивности света в данном месте точки – Myx

+0

Я только что протестировал реализацию, добавив 'light_intensity = light_intensity/(расстояние 1. + расстояние + расстояние *);' после ' light_intensity = light-> color/denominator; 'in' LightIntensity (...) 'и, похоже, дает мне то, что я хочу. Это нормально? EDIT: это не дает мне то, что я хочу точно, но кажется, что нужно сделать какое-то деление .... – Myx

ответ

0

Оказалось, что ошибок не было. «Конечное изображение», в котором я сравнивал результаты, не было правильно рассчитано.