Я применил фонг-шейдинг на моем raytracerК сожалению, я получаю ошибку сегментации при запуске.Вероятная причина связана с переменной Vec3f «specular_color» (с объектом, состоящим из трех чисел с плавающей запятой).Когда я печатаю его значения, я получаю:
specular_color: inf inf inf
Чтобы выяснить причину несложно:
Рассчитанотаким образом:
specular_color += light_intensity * std::pow (reflected*camera_dir,mat.ns);
где mat.ns - показатель зеркальности, который показывает ожидаемые значения.
отражено * camera_dir является причиной, потому что она всегда заканчивается большим значением.В трех из четырех моих тестовых случаев это пятизначное значение.В другом шестизначное значение (близкое к семи).Таким образом, пяти- или шестизначные значения, взятые для любого показателя, который не достаточно близок к единице, могут переполнить переменные с плавающей запятой.
Теперь возникает вопрос, почему эти значения такие большие, если они могут или не могут быть такимипуть.Если они не могут, то, вероятно, есть ошибка в предыдущем коде.Если они могут, все, чего не хватает, это нормализовать отраженный вектор (camera_dir уже унитарен)
Отраженный вектор рассчитывается следующим образом:
Vec3f reflected = light_ray_dir - 2 * (light_ray_dir * hit_normal) * hit_normal;
, где light_ray_dir рассчитывается как:
Vec3f light_ray_dir (current.pos - intersection);
Текущий является именем источника света, а пересечение - точкой встречи луча с треугольником.
Он всегда работал нормально, когда рассеивал только свет.
hit_normal, однако, является новым кодом и вычисляется как:
Vec3f hit_normal = (1 - u - v) * vert1 + u * vert2 + v * vert3;
, где u и v - барицентрические координаты, а vertX - вершины треугольника.
Так что же кажется более вероятным?Возможно, более сложная ошибка в приведенном выше коде или просто отсутствующая нормализация для отраженного вектора.Или, может быть, что-то еще?Спасибо за ваше время.