ПрограммированиеФорумГрафика

Bidirectional Path Tracing - помогите плиз с переносом энергии

#0
16:28, 25 мар 2013

Привет товарищи.
Вопрос к тем, кто глубоко разбирался, а тем более реализовывал двунаправленную трассировку.
Вопрос такой.

Вот на первом шаге мы генерим кучу точек из источника света, по сути это микроисточники света.
На втором шаге, когда идёт трассировка из глаза мы из каждой полученной точки пускаем 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); //  вот тут как бы рассчитывается общий вклад данного микроисточника в результат, сейчас тут фигня
      }
    }
  }
#1
2:17, 26 мар 2013

Неужели никто не реализовывал? (

#2
12:49, 26 мар 2013

Не похоже это на Bidirectional Path Tracing. Что за "микроисточники", откуда они берутся?

#3
13:40, 26 мар 2013

Как это непохоже? Это же основа метода.
Сначала мы трейсим кучу лучей из источника света, получаем точки которые как-то освещает источник света.
Потом учитываем эти точки при трейсинге лучей из глаза.
Фактически, эти точки у нас буду микроисточниками света.

#4
13:46, 26 мар 2013

Микрограни -знаю, микроисточники - нет ...

#5
14:00, 26 мар 2013

innuendo
Блин ну это же искусстивенно введённый термин.
Просто в каждой точке, которую осветил источник света мы считаем освешённость, и предполашаем что она тоже что-то освещает, хоть и очень слабо.

#6
18:13, 26 мар 2013

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

#7
19:09, 26 мар 2013

KaronatoR
> Сначала мы трейсим кучу лучей из источника света, получаем точки которые как-то освещает источник света.
Это Photon Mapping. Причем там обычно не семплят фотоны ("микроисточники") напрямую, а берут среднее из некоторой окрестности (или фиксированное количество ближайших).

#8
19:51, 26 мар 2013

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));

не стесняйся, выкладывай результаты, интересно ведь :)

#9
0:55, 27 мар 2013

Ruslan
Гамма коррекцию пока не делал, спасибо!

Реализовал базовую двунаправленную трассировку лучей.
Пока заметен высокочастотный шум, но это из-за отсутствия miltiple importanse sampling.
Пока вот так это дело выглядит:

Изображение
Изображение
Изображение
#10
4:29, 27 мар 2013

KaronatoR
>Гамма коррекцию пока не делал, спасибо!
это FROL спасибо, он недавно мне почти с таким же вопросом помог советом

вроде вторичка немного пересвечена не? стенка бокса немного ярче, чем противоположная стена, а так, похоже на правду
это дело такое, можно в одном месте по невнимательности допустить маленькую ошибку, потом долго думать, что все ок)

сцена полигональная, или поверхности математикой заданы?
трассировка на gpu?

#11
4:37, 27 мар 2013

Ruslan
> это FROL спасибо, он недавно мне почти с таким же вопросом помог советом
Он мой научный руководитель =)

> вроде вторичка немного пересвечена не? стенка бокса немного ярче, чем противоположная стена, а так, похоже на правду
Посмотрим, впереди ещё тестирование. =)

> сцена полигональная, или поверхности математикой заданы?
> трассировка на gpu?
Сцена полигональная, трассировка на гпу =)
Собственно, для трассировки используется OptiX

ПрограммированиеФорумГрафика

Тема в архиве.