Участник:Kst179/Metropolis light transport
Metropolis light transport — это алгоритм, применяющий один из вариантов метода Монте Карло — метод Метрополиса-Гастинга, Монте Карло на Марковских цепях (Metropolis-Hastings, Markov chain Monte Carlo, MCMC), для генерации изображений при помощи физического описания трехмерных сцен. Алгоритм используется в компьютерной графике, решает задачу глобального освещения (точное моделирование световых эффектов). Отличается от классических методов, таких как Bidirectional path tracing скоростью работы и точностью моделирования (возвращает несмещенное значение).
Свойства и структура алгоритма
Общее описание алгоритма
Основной объект с которыми работает трассировщик лучей это пути от источников света до камеры. Путь это ломанная, каждое звено которой имитирует направление движения фотона, ломанная начинается в источнике света, изменяет направление при попадании на какую либо поверхность, а последнее звено должно заканчиваться в камере. Обозначим путь как [math]\displaystyle{ \overline{x} = x_1, x_2, \dots, x_k }[/math], где [math]\displaystyle{ k\gt 1, x_i }[/math] — координата на поверхности некоторого объекта от которого отражается луч). Для каждого пути введем некоторую функцию [math]\displaystyle{ f(\overline{x}) }[/math], обозначающую яркость, с которой этот луч освещает пиксель матрицы камеры.

Обычные методы трассировки лучей генерируют очень много путей и потом аггрегируют значение яркости по каждому пикселю. Это может быть очень долго, из за того что много компьютерного времени уходит на генерацию лучей с малой яркостью последующий вклад которых в результатирующее изображение мал (пример — две комнаты, разделенные слегка приоткрытой дверью в одной находится источник света, в другой — камера, тогда большинство независимо сгенерированных путей будет проходить сквозь стену, а значит иметь нулевую яркость).
В MLT путь считается случайной величиной, с плотностью вероятности [math]\displaystyle{ p(\overline{x}) = \frac{1}{b}f(\overline{x}), b=const }[/math], а генерация путей происходит согласно этому распределению. Тогда получается что более весомых путей мы генерируем больше, а пути проходящие через стены или на которых теряется слишком много яркости мы практически не рассматриваем. Также если генерировать пути согласно вышеописанному распределению то выражение для подсчета окончательного изображения [math]\displaystyle{ m_j = \int _{\Omega} w_j(\overline{x})f(\overline{x})d\overline{x} }[/math], (где [math]\displaystyle{ m_j }[/math] — значение [math]\displaystyle{ j }[/math]-го пикселя, [math]\displaystyle{ \Omega }[/math] — пространство всевозможных путей, [math]\displaystyle{ w_j(\overline{x}) }[/math] — индикатор того, что [math]\displaystyle{ \overline{x} }[/math] попадает в [math]\displaystyle{ j }[/math]-й пиксель) можно заменить на следующую несмещенную оценку:
[math]\displaystyle{ m_j = \int _{\Omega} w_j(\overline{x})f(\overline{x})d\overline{x} = \int _{\Omega} w_j(\overline{x})\frac{f(\overline{x})}{p(\overline{x})} p(\overline{x})d\overline{x} = \mathbb{E} w_j(\overline{x})\frac{f(\overline{x})}{p(\overline{x})} \approx \frac{1}{N} \sum _{i=0} ^{N} w_j(\overline{x_i})\frac{f(\overline{x_i})}{p(\overline{x_i})} = \frac{b}{N} \sum _{i=0} ^{N} w_j(\overline{x_i}) }[/math].
То есть после семплирования путей [math]\displaystyle{ \overline{x_1}, \overline{x_2}, \dots, \overline{x_N} }[/math] получаем что яркость j-го пикселя пропорциональна количеству приходящих в этот пиксель лучей а от их вида никак не зависит (но для этого необходимо чтобы пути строго соответствовали своему распределению).
Математическое описание алгоритма
Для семплирования путей из вообще говоря неизвестного нам распределения [math]\displaystyle{ p(\overline{x}) }[/math] используется метод MCMC. Построим следующую марковскую цепь: введем некоторую вероятность [math]\displaystyle{ K(\overline{y}|\overline{x}) }[/math] перехода [math]\displaystyle{ \overline{x} \rightarrow \overline{y} }[/math]. Выберем произвольный путь [math]\displaystyle{ \overline{x_0} }[/math] и случайным блужданием будем переходить от [math]\displaystyle{ \overline{x_{i-1}} }[/math] к [math]\displaystyle{ \overline{x_i} }[/math]. Пусть [math]\displaystyle{ \overline{x_0} }[/math] распределено с плотностью вероятности [math]\displaystyle{ p_0(\overline{x}) }[/math], далее определим итеративно:[math]\displaystyle{ p_i(\overline{x}) = \int_{\Omega} K(\overline{x}|\overline{y})p_{i-1}(\overline{y})d\overline{y} }[/math].