Двунаправленная трассировка путей (bidirectional path tracing)

Пытаюсь постичь трассировку путей (path tracing). Пока-что разобрался лишь с самой основой - когда из каждой точки пересечения запускается луч в случайном направлении в пределах полусферы, затем снова, и так рекурсивно, пока луч не ударится в источник света. В результате такой подход приводит к тому что в случае с маленькими источниками освещения изображения получается крайне шумным.

Следующие изображения демонстрируют уровень шума в зависимости от кол-ва семплов (лучей) на пиксель.

path tracing с разным кол-вом семплов на пиксель

Кстати, что касается лучей на пиксель - тут я тоже не уверен что все делаю правильно, ибо метод "Монте-Карло", насколько я понимаю, подразумевает что из каждой точки пересечения запускаются несколько лучей, а затем их результат суммируется и усредняется. Но такой подход приводит к тому, что кол-во лучей растет в геометрической прогрессии, и уже после 6 отскоков достигает неадекватных значений, поэтому я решил что лучше просто запускать изначально несколько лучей на один пиксель (чуть отклоненных от центра пикселя в случайном направлении, не выходящих за пределы пикселях), но в каждом пересечении при этом генерируется только 1 луч. Я не знаю соответствует ли данный подход "Монте-Карло" или нет, но по крайней мере так хотя бы рендеринг длится не вечно..

Bidirectional path tracing

Я стал искать способы, как можно было бы уменьшить кол-во шума, и наткнулся на двунаправленную трассировку лучей (bidirectional path tracing). Но к сожалению нигде в сети я так и не смог найти подробного объяснения данного алгоритма простыми словами. Все что я понял, это то, что лучи генерируются как из камеры так и из источников освещения, а затем происходит проверка на возможность соединения точек пересечения этих путей.

двунаправленная трассировка путей

То есть получается, если точки пересечения синего луча из камеры (2) и желтого луча из источника (1) могут быть беспрепятственно соединены (на пути соединения нету преград) значит можно считать что луч из камеры может пройти по точкам 2 и 1 прямо к источнику.

Но возникает другой вопрос, что если, например, у меня есть преломляющие поверхности на сцене?

введите сюда описание изображения

Тогда получается следующее :

  1. Запускается луч из камеры и ударяется о преломляющую сферу (точка 4), запускается луч из источника и ударяется о стену (точка 1).
  2. Выясняется что нельзя соединить эти точки, и генерация лучей продолжается. Из точки 1 генерируется еще один случайный луч и ударяется о стену (точка 2), в точке удара о сферу (4) генерируется еще преломленный луч и ударяется о внутр. поверхность сферы (точка 5).
  3. Выясняется что нельзя соединить эти точки, и генерация лучей продолжается. Из точки 2 генерируется еще один случайный луч и ударяется о пол (точка 3), в точке удара о внутр. поверхность сферы (5) генерируется еще один преломленный луч, и ударяется, например, о пол (точка 6)
  4. Выясняется что точки 6 и 3 не могут быть соединены

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

Вопрос

Каким образом алгоритм двунаправленной трассировки вообще дает какие-то улучшения при всем том, что я перечислил. Как в таком случае вообще можно смоделировать, например, правильную каустику? Может быть я не правильно понял суть этого алгоритма и что-то путаю? Буду рад если кто-то пояснит как это всё должно работать


Ответы (0 шт):