Я недавно пытался изменить текущий метод расчета рассеянного освещения в RayTracer.Раньше он рассчитывался так:
float lambert = (light_ray_dir * normal) * coef;
red += lambert * current.color.red * mat.kd.red;
green += lambert * current.color.green * mat.kd.green;
blue += lambert * current.color.blue * mat.kd.blue;
, где coef - коэффициент ослабления, который начинается с 1 для каждого пикселя и затем ослабляется для каждого отраженного луча, генерируемого этой линией:
coef *= mat.reflection;
Это сработало хорошо.
Но я решил попробовать что-то более реалистичное и реализовал это:
float squared_attenuation = LIGHT_FALLOFF * lenght;
light_intensity.setX ((current.color.red /*INTENSITY*/)/ squared_attenuation);
light_intensity.setY ((current.color.green /*INTENSITY*/)/ squared_attenuation);
light_intensity.setZ ((current.color.blue /*INTENSITY*/)/ squared_attenuation);
red += ALBEDO * light_intensity.getX() * lambert * mat.kd.red;
green += ALBEDO * light_intensity.getY() * lambert * mat.kd.green;
blue += ALBEDO * light_intensity.getZ() * lambert * mat.kd.blue;
, где LIGHT_FALLOFF - это постоянное значение:
#define LIGHT_FALLOFF M_PI * 4
, а длина это длина вектора, который идет от центра точечного источника света до точки пересечения:
inline float normalize_return_lenght () {
float lenght = sqrtf (x*x + y*y + z*z);
float inv_length = 1/lenght;
x = x * inv_length, y = y * inv_length, z = z * inv_length;
return lenght;
}
float lenght = light_ray_dir.normalize_return_lenght ();
Проблема в том, что все это не создает ничего, кроме черного экрана!Главный виновник - длина, которая идет как делитель в light_intensity.set.Это делает окончательные значения цвета некоторым значением ^ -5.Однако, даже если я заменю его на единицу (разрушая мою цель реалистичного ослабления света), я все равно получу значения цвета, близкие к нулю, и, следовательно, черное изображение.
Я попытался добавить еще один источник света ближе к объектам, однако тот факт, что модели, которые должны быть закрашены, состоят из нескольких многоугольников с разными координатами, затрудняет определение хорошего расположения для них.
Итак, я спрашиваю.Вам кажется нормальным, что это происходит или это ошибка?Для меня теория не кажется мне странной, поскольку затухание является квадратичным.
Не похоже, есть какой-то намек на то, где разместить источники света, или на что-либо, что может получить изображениеэто не все черное?
Спасибо за чтение всего этого!
PS: Интенсивность закомментирована, потому что в примере, который я использовал для написания кода, это был один