Причудливые цвета делают затенение фонга на трассировщике лучей - PullRequest
1 голос
/ 27 апреля 2019

Я недавно добавил поддержку затенения фонга в процессоре трассировки лучей, и цвета перепутаны: enter image description here

Если я просто рассеюсь: enter image description here

Какой-то соответствующий код:

 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;

изображение меняется незначительно:

enter image description here

Как показывает код, все три вектора компонентов (hit_normal, отраженный, light_ray_dir, camera_dir) нормализованы.

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

...