Я недавно добавил поддержку затенения фонга в процессоре трассировки лучей, и цвета перепутаны:
Если я просто рассеюсь:
Какой-то соответствующий код:
Vec3f camera_dir (xx_array[x],py,scene->getCameraDirZ());
camera_dir.normalize ();
Vec3f hit_normal = (1 - u - v) * vert1 + u * vert2 + v * vert3;
hit_normal.normalize ();
Vec3f light_ray_dir (current.pos - intersection);
float squared_length = light_ray_dir.normalize_return_squared_lenght ();
Vec3f reflected = light_ray_dir - 2 * (light_ray_dir * hit_normal) * hit_normal;
reflected.normalize();
specular_color += light_intensity * std::pow (std::max(0.f,reflected*camera_dir),mat.ns);
final_color = diffuse_color * mat.ks; + specular_color * mat.kd; (if is only difusse * mat.ks or mat.kd it produces the second image)
Некоторая, возможно, важная информация
Четыре последние строки являются последовательными, хотя последняя происходит вне цикла for, отвечающего за вычисления затенения для каждого источника света.
Две строки "hit_normal" происходят раньше, они находятся до начала вышеупомянутого цикла.
Первые два происходят в начале трассировщика лучей, в более ранних строках двух для циклов, отвечающих за пиксели изображения.
если я поменяю отраженный расчет с
Vec3f reflected = light_ray_dir - 2 * (light_ray_dir * hit_normal) * hit_normal;
до:
Vec3f reflected = 2 * (light_ray_dir * hit_normal) * hit_normal - light_ray_dir;
изображение меняется незначительно:
Как показывает код, все три вектора компонентов (hit_normal, отраженный, light_ray_dir, camera_dir) нормализованы.
Поэтому я прошу предложения о том, как отладить проблему, предложения о том, что может быть не так. Спасибо за внимание.