«Зеркальный» цвет с затенением по фонгу и переливами трассировки лучей - PullRequest
0 голосов
/ 06 апреля 2019

Я применил фонг-шейдинг на моем 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 - вершины треугольника.

Так что же кажется более вероятным?Возможно, более сложная ошибка в приведенном выше коде или просто отсутствующая нормализация для отраженного вектора.Или, может быть, что-то еще?Спасибо за ваше время.

1 Ответ

0 голосов
/ 06 апреля 2019

Да, модель отражения фонга использует нормализованные векторы для вычисления интенсивности отраженного света. Обратите внимание на шапки в выражении:

enter image description here

источник: https://en.wikipedia.org/wiki/Phong_reflection_model

R обозначает вектор отражения, L - направление света, а N - нормаль поверхности в визуализируемой точке; обратите внимание также на то, что вы транспонировали две части выражения - это может быть проблемой, если вы ожидаете, что оба вектор света и вектор отражения должны указывать в сторону от поверхности, но в зависимости от модели вы могли бы рассчитать это по-разному.

enter image description here

Я посмотрел на ваш код, и ваше направление света находится далеко от света, а не от поверхности, поэтому я думаю, что главное, о чем нужно помнить, это то, что ваши векторы направления могут указывать на или из поверхность, то есть с или против нормального. Я не думаю, что это вызвало бы NaN все же. Я бы позаботился о том, чтобы направление камеры также нормализовалось, и везде проверил бы векторы нулевой длины, поскольку они могут нарушить ваши обычные вычисления при делении на ноль.

Я также немного посмотрел на ваш обычный расчет. Вы хотели рассчитать нормаль по вершинам треугольников? Или вы имели в виду нормаль в каждой из вершин?

Надеюсь, это поможет

...