Как объемные эффекты, такие как дым, туман или облака, отображаются с помощью трассировщика лучей? В отличие от твердых объектов, они не имеют четко определенной поверхности для вычисления пересечения.
источник
Как объемные эффекты, такие как дым, туман или облака, отображаются с помощью трассировщика лучей? В отличие от твердых объектов, они не имеют четко определенной поверхности для вычисления пересечения.
Появление объемов (также называемых участвующими средами) в природе вызвано крошечными частицами, такими как пыль, капли воды или планктон, которые взвешены в окружающей жидкости, такой как воздух или вода. Эти частицы являются твердыми объектами, и свет преломляется или отражается от этих объектов, как на обычной поверхности. Теоретически, участвующая среда может обрабатываться традиционным трассировщиком лучей только с пересечением поверхности.
Конечно, огромное количество этих частиц делает невозможным фактически отслеживать их по отдельности. Вместо этого они аппроксимируются статистической моделью: поскольку частицы очень малы, а расстояние между частицами намного больше размера частиц, отдельные взаимодействия света с частицами можно моделировать как статистически независимые. Поэтому разумным приближением является замена отдельных частиц непрерывными величинами, которые описывают «среднее» взаимодействие легких частиц в этой определенной области пространства.
Для физического объемного переноса света мы заменяем немыслимо много частиц непрерывно участвующей средой, которая имеет два свойства: коэффициент поглощения и коэффициент рассеяния. Эти коэффициенты очень удобны для трассировки лучей, поскольку они позволяют нам вычислить вероятность взаимодействия луча со средой, то есть вероятность удара по одной из частиц, как функцию расстояния.
Коэффициент поглощения обозначается . Скажем, луч света хочет пройти метров внутри участвующей среды; вероятность того, что он пройдет сквозь неабсорбированный материал, то есть не ударит одну из частиц и не будет поглощен ею, равна `. По мере увеличения t мы можем видеть, что эта вероятность стремится к нулю, то есть, чем дольше мы проходим через среду, тем больше вероятность того, что что-то ударит и будет поглощено. Очень похожие вещи имеют место для коэффициента рассеяния : вероятность того, что луч не на частицу и не равна; то есть, чем дольше мы проходим через среду, тем больше вероятность, что мы столкнемся с частицей и рассредоточимся в другом направлении.
Обычно эти две величины складываются в один коэффициент вымирания . Вероятность прохождения метров через среду, не взаимодействуя с ней (не будучи поглощенной или рассеянной), тогда равна . С другой стороны, вероятность взаимодействия со средой через метров составляет .
В физических рендерерах это используется следующим образом: когда луч входит в среду, мы вероятностно останавливаем его внутри среды и взаимодействуем с частицей. Важность выборки вероятности взаимодействия дает расстояние ; это говорит нам о том, что луч прошел метров в среде до удара частицы, и теперь происходит одна из двух вещей: либо луч поглощается частицей (с вероятностью ), либо рассеивается (с вероятностью ).
Как рассеивается луч, описывается фазовой функцией и зависит от природы частиц; фазовая функция Рэлея описывает рассеяние на сферических частицах, меньших длины волны света (например, нашей атмосферы); фазовая функция Ми описывает рассеяние на сферических частицах, размер которых аналогичен длине волны (например, капли воды); в графике обычно используется фазовая функция Хенея-Гринштейна , первоначально применяемая для рассеяния от межзвездной пыли.
Теперь в графике мы обычно не визуализируем изображения бесконечной среды, а визуализируем медиа внутри сцены, также состоящей из твердых поверхностей. В этом случае мы сначала полностью отслеживаем луч, пока он не достигнет следующей поверхности, полностью игнорируя участвующую среду; это дает нам расстояние до следующей поверхности, . Затем мы выбираем расстояние взаимодействия в среде, как описано ранее. Если , луч попадает на частицу на пути к следующей поверхности, и мы либо поглощаем ее, либо рассеиваем. Если , луч прошел сквозь невредимый и взаимодействует с поверхностью как обычно. t t < t M a x t ≥ t M a x
Этот пост был лишь небольшим введением в рендеринг с участием участвующих СМИ; кроме всего прочего я полностью игнорировал пространственно изменяющиеся коэффициенты (которые вам нужны для облаков, дыма и т. д.). Заметки Стива Маршнера - хороший ресурс, если вам интересно. В целом, участвующие СМИ очень трудно эффективно визуализировать, и вы можете сделать это намного сложнее, чем я описал здесь; есть объемное фотонное картирование , фотонные пучки , диффузионные аппроксимации , совместная выборка по важности и многое другое. Там также интересная работа на гранулированных СМИ это описывает, что делать, когда разрушается статистическая модель, то есть взаимодействия частиц больше не являются статистически независимыми.
Один из способов сделать это - который не совсем подходит для решения «перейти к», но может работать хорошо, - это найти расстояние, которое луч прошел через объем, и использовать интеграцию некоторой функции плотности, чтобы вычислить, сколько было «материала» ударил.
Вот ссылка с примером реализации: http://blog.demofox.org/2014/06/22/analytic-fog-density/
Зависит от объема эффекта.
Однородные объемные эффекты, которые не относятся к рассеиванию, можно смоделировать, просто рассчитав расстояние между лучами и лучами.
В противном случае вам нужно выполнить интеграцию пути луча, также известного как лучевое движение. Чтобы избежать необходимости снимать вторичные лучи, лучевая маркировка часто сочетается с каким-то кешем, таким как карта глубины, карты глубины, карты кирпича или облака вокселей для затенения света и т. Д. Таким образом, вам не нужно обязательно маршировать всю сцену. Подобное кэширование часто делается для объемной процедурной текстуры.
Также возможно преобразовать текстуру в примитивы поверхности, такие как прямоугольники, сферы или плоскости, которые имеют подходящую текстуру с мягкими краями. Затем вы можете использовать обычные методы рендеринга для решения объемного эффекта. Проблема в том, что вам обычно нужно много примитивов. Кроме того, форма примитива может отображаться как слишком равномерная выборка.