трассировка лучей | рассеянное затенение с несколькими источниками света создает странные тени под углом 90 градусов

#c #raytracing #shading

Вопрос:

У меня возникли проблемы с реализацией рассеянного затенения в проекте трассировки лучей, который я недавно начал.

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

пример изображения

Я понятия не имею, откуда это берется… Мой код для расчета яркости выглядит так:

 float brightness = 0;
for (Light* light : unintersectedLights)
{
    Vector3 intersectionToLightDirVec = Vector3Normalize(Vector3Subtract(light->position, intersection));
    float angleBetweenNormalAndLight = Vector3AngleBetween(intersectionNormalVec, intersectionToLightDirVec);
    brightness  = Clamp(Remap(angleBetweenNormalAndLight, 0, PI / 2, 1, 0), 0, 1) * light->brightness;
}

color = ColorMultiply(color, brightness);
 

Сначала я подумал, что, похоже, одно из значений было отрицательным, чего не может быть, так как я зафиксировал результаты, а также дважды проверил его, и там никогда не было отрицательного значения.

Теперь я застрял с этими темными линиями, и я не уверен, следует ли мне просто продолжать или это тоже будет проблемой с будущими расчетами.

Вот полный код: https://github.com/vequa/RayTracing3D

Заранее спасибо ^^

Комментарии:

1. Я уже давно не выполнял вычисления 3D-компьютерной графики, но я думаю, что Vector3AngleBetween должен сначала нормализовать векторы, а затем выполнить точечное произведение. Опять же, я могу быть совершенно неправ, но похоже, что вы сталкиваетесь с числовой нестабильностью (1/очень большое число) или (1/очень маленькое число).

2. @PepijnKramer да, вы правы, и я изменю его прямо сейчас, но в этом случае ntersectionNormalVec и intersectionToLightDirVec уже являются нормализованными векторами, так что это не проблема

3. angleBetweenNormalAndLight = abs(... сделает отрицательные углы (поверхности, обращенные в сторону от света) положительными. Удаление abs должно дать вам правильный результат. Вы также можете использовать его как ранний выход, чтобы избежать следующих вычислений.

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

5. Что Remap делать со значением, выходящим за пределы его диапазона отображения? 2-я фотография, которую вы опубликовали, выглядит так, как вы получаете, когда игнорируете направление света, т. Е. Похоже, что вы освещаете поверхности, обращенные в сторону от света. Вы уверены, что ваши нормальные показатели также верны? Я также не понимаю, почему ты устраиваешь такую сложную сцену. Размещение одной сферы в начале координат и света над ней может облегчить понимание того, что происходит.