Затенение с квадратом спада всегда делает все черным - PullRequest
0 голосов
/ 22 февраля 2019

Я недавно пытался изменить текущий метод расчета рассеянного освещения в 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: Интенсивность закомментирована, потому что в примере, который я использовал для написания кода, это был один

1 Ответ

0 голосов
/ 22 февраля 2019

То есть вы предполагаете, что свет имеет светимость "1"?Как далеко твой свет?Если ваш свет - скажем, - на расстоянии 10 единиц, то их вклад от света будет 1/10, или очень маленькое число.Вероятно, поэтому ваше изображение темное.Вы должны иметь достаточно большие числа для вашей интенсивности света, если вы собираетесь сделать это.В одной из моих сцен у меня есть свет, который находится на расстоянии около 1000 единиц (притворяясь Солнцем), а интенсивность составляет 380000!Другое дело ... чтобы имитировать реальность, вы должны использовать 1 / length ^ 2.Интенсивность света падает с квадратом расстояния, а не только с расстоянием.Удачи!

...