#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-я фотография, которую вы опубликовали, выглядит так, как вы получаете, когда игнорируете направление света, т. Е. Похоже, что вы освещаете поверхности, обращенные в сторону от света. Вы уверены, что ваши нормальные показатели также верны? Я также не понимаю, почему ты устраиваешь такую сложную сцену. Размещение одной сферы в начале координат и света над ней может облегчить понимание того, что происходит.