Уравнение рендеринга для Photon Mapping

Это своего рода длинный пост, поэтому спасибо всем, кто читает это!

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

Таким образом, уравнение рендеринга задается как: Lr(x,w) = Integral(fr(x,w',w) * Li(x,w') cos(Thetai) *dw'i )

где x — заданная точка сцены, w' — направление падающего света, w — отраженный свет, а Theta_i — падающий угол (я думаю).

ПЕРВЫЙ ВОПРОС:

Это касается термина fr(x, w', w), который является BRDF (функция распределения двунаправленной отражательной способности). Теперь я не уверен, правильно ли я это понимаю или нет, но в основном BRDF - это функция затенения? А именно, для базовой функциональности трассировки лучей в моей программе я использовал модель отражения Фонга для прямого освещения и отражений. Можно ли просто переназначить мой код отражения Фонга и использовать его для представления BRDF в интеграле?

ВТОРОЙ ВОПРОС: Мой другой вопрос касается того, когда мы разбиваем уравнение рендеринга на его составляющие. Например, для расчета диффузного взаимного отражения мы делаем:

Коэффициент диффузного отражения = Интеграл (fr, d (x, w', w), * Li, d (x, w') cos (theta_i) dw'i)

Так что в любой момент я уже накопил вокруг себя кучу диффузно отраженных фотонов. Из того, что я понимаю из этого уравнения, я просто умножаю интенсивность каждого фотона на диффузную составляющую модели Фонга, умноженную на косинус угла, и складываю их все?

Код, который у меня есть для этого конкретного сегмента, выглядит так:

Color result = Color(0,0,0) // r = g = b = 0;
for(int i = 0; i < # photons surrounding point x; i ++)
{
   result += Phong_Diffuse(photon_i, x, camera_ray) * photon_i.color * photon_i.angle
}

Затем я добавляю это к цвету, полученному от прямого освещения ( Phong_DIFF_&_SPEC(light_source, x, camera_ray)) и к цвету, полученному от зеркальных отражений. Правильно ли я делаю здесь?

Я просто, кажется, не получаю желаемого эффекта. Одна из причин заключается в том, что если я масштабирую свои фотоны так, чтобы каждый фотон имел интенсивность Light_source / num_Photons, то даже с несколькими сотнями фотонов в одном месте это едва заметно меняет мою сцену, поскольку у меня всего 500 000 фотонов. И если я не масштабирую свои фотоны или не искажаю масштабирование, цвета все равно кажутся неверными.

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

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

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


person user1855952    schedule 04.12.2012    source источник


Ответы (1)


На ваш первый вопрос ответ - да. BRDF — это просто распределение вероятностей, которое описывает вероятность того, что фотон с направлением падения i отразится в направлении o (или будет поглощен). Это то, что описывает и ваша модель Фонга.

Что касается вашего второго вопроса, я думаю, ваши проблемы заключаются в коэффициенте масштабирования. Когда вы собираете фотоны в окрестности радиуса R (независимо от того, является ли R постоянным или изменяется в зависимости от k ближайших соседей), вы должны разделить свою накопленную энергию на площадь диска радиуса R (и, таким образом, если эта площадь намного меньше единицы, это повысит вашу интенсивность). Помимо этого, ваш расчет кажется правильным: вы берете все фотоны с их направлением, используете их в BRDF, чтобы увидеть вероятность того, что они отразятся в сторону камеры (или, говоря иначе, сколько энергии остается у фотона при отражении в сторону камеры). ), и суммировать все. Я предполагаю, что ваш Phong_Diffuse содержит диффузный компонент (отсюда и его название), и если это так, то это тоже правильно.
Другая возможность заключается в том, что ваш диффузный коэффициент отражения слишком слаб, чтобы создавать видимые диффузные взаимоотражения.

person nbonneel    schedule 06.12.2012