Привет товарищи.
Вопрос к тем, кто глубоко разбирался, а тем более реализовывал двунаправленную трассировку.
Вопрос такой.
Вот на первом шаге мы генерим кучу точек из источника света, по сути это микроисточники света.
На втором шаге, когда идёт трассировка из глаза мы из каждой полученной точки пускаем shadow луч к некоторому рандомномно выбранному подмножеству глобального массива микроисточников света. Вот вопрос, как учитывать энергию, вносимую этими самыми микроисточниками?
На данный момент для микроисточника я храню позицию, нормаль и radiance.
Если не учитывать редиенс, то вклад вносимый микроисчтониками я пока рассчитываю вот так:
for (int i = 0; i < 50; i++) <-- пока беру тупо первые 50 точек из глобального массива, но это временно, сейчас прикручу рандом, а потом и русскую рулетку { float3 light_pos = mlp_data [i]; float Ldist = length (light_pos - hitpoint); // расстояние от источника света до точки пересечения float3 L = normalize (light_pos - hitpoint); // вектор направления на источник света float nDl = dot (ffnormal, L); // угол между поверхностью и направлением на источник света float LnDl = dot ((-1) * mlp_data [i + 1], L); // угол между нормалью источника света и направлением на источник света if (nDl > 0.0f && LnDl > 0.0f) { per_ray_data_shadow zshadow_prd; zshadow_prd.in_shadow = false; Ray shadow_ray = make_Ray (hitpoint, L, pathtrace_shadow_ray_type, scene_epsilon, Ldist * 0.995f); rtTrace (top_object, shadow_ray, zshadow_prd); if(!zshadow_prd.in_shadow) { result += make_float3 (1) * 10000 * nDl/ (Ldist * Ldist); // вот тут как бы рассчитывается общий вклад данного микроисточника в результат, сейчас тут фигня } } }
Неужели никто не реализовывал? (
Не похоже это на Bidirectional Path Tracing. Что за "микроисточники", откуда они берутся?
Как это непохоже? Это же основа метода.
Сначала мы трейсим кучу лучей из источника света, получаем точки которые как-то освещает источник света.
Потом учитываем эти точки при трейсинге лучей из глаза.
Фактически, эти точки у нас буду микроисточниками света.
Микрограни -знаю, микроисточники - нет ...
innuendo
Блин ну это же искусстивенно введённый термин.
Просто в каждой точке, которую осветил источник света мы считаем освешённость, и предполашаем что она тоже что-то освещает, хоть и очень слабо.
Странный у тебя бидир, во всяком случае терминология. Суть-то в том чтобы комбинировать пути засемпленные различными стратегиями и потом правильно сложить вклады.
KaronatoR
> Сначала мы трейсим кучу лучей из источника света, получаем точки которые как-то освещает источник света.
Это Photon Mapping. Причем там обычно не семплят фотоны ("микроисточники") напрямую, а берут среднее из некоторой окрестности (или фиксированное количество ближайших).
KaronatoR
Этот метод не реализовывал, но все же предложу вариант:
- при испускании фотонов от эмиттера, назначай им энергию (интенсивность фотона = интенсивность источника света / общее количество фотонов)
- при попадании фотона в поверхность, рассчитывай диффузное освещение и сохраняй результат в базе
- при сэмплировании, аккумулируй энергию
в финале не забудь про гамма коррекцию
color.r = pow(abs(color.r), (1.0f / 2.2f));
color.g = pow(abs(color.g), (1.0f / 2.2f));
color.b = pow(abs(color.b), (1.0f / 2.2f));
не стесняйся, выкладывай результаты, интересно ведь :)
Ruslan
Гамма коррекцию пока не делал, спасибо!
Реализовал базовую двунаправленную трассировку лучей.
Пока заметен высокочастотный шум, но это из-за отсутствия miltiple importanse sampling.
Пока вот так это дело выглядит:
KaronatoR
>Гамма коррекцию пока не делал, спасибо!
это FROL спасибо, он недавно мне почти с таким же вопросом помог советом
вроде вторичка немного пересвечена не? стенка бокса немного ярче, чем противоположная стена, а так, похоже на правду
это дело такое, можно в одном месте по невнимательности допустить маленькую ошибку, потом долго думать, что все ок)
сцена полигональная, или поверхности математикой заданы?
трассировка на gpu?
Ruslan
> это FROL спасибо, он недавно мне почти с таким же вопросом помог советом
Он мой научный руководитель =)
> вроде вторичка немного пересвечена не? стенка бокса немного ярче, чем противоположная стена, а так, похоже на правду
Посмотрим, впереди ещё тестирование. =)
> сцена полигональная, или поверхности математикой заданы?
> трассировка на gpu?
Сцена полигональная, трассировка на гпу =)
Собственно, для трассировки используется OptiX
Тема в архиве.