Выбор отражения или преломления в трассировке пути

14

Я пытаюсь реализовать рефракцию и передачу в моем трассировщике пути, и я немного не уверен, как это реализовать. Сначала немного предыстории:

Когда свет попадает на поверхность, часть его отражается, а часть преломляется: введите описание изображения здесь

Сколько света отражается и преломляется, определяется уравнениями Френеля введите описание изображения здесь

В рекурсивном трассировщике лучей простой реализацией будет стрелять луч для отражения и луч для преломления, а затем делать взвешенную сумму, используя Френеля.

рзнак равноFреsNеL()Tзнак равно1-рLознак равнорLя, отражение+TLя, преломление

Однако при трассировке пути мы выбираем только один путь. Это мой вопрос:

  • Как выбрать, отражать или преломлять непредвзято

Моим первым предположением будет случайный выбор на основе Френеля. Ака:

float p = randf();
float fresnel = Fresnel();
if (p <= fresnel) {
    // Reflect
} else {
    // Refract
}

Было бы это правильно? Или мне нужен какой-то поправочный коэффициент? Так как я не иду в обоих направлениях.

RichieSams
источник
Русская

Ответы:

6

TL; DR

Да, вы можете сделать это так, вы просто должны разделить результат на вероятность выбора направления.

Полный ответ

Тема выборки в трассировщиках пути, позволяющая использовать материалы с отражением и преломлением, на самом деле немного сложнее.

Давайте начнем с некоторого фона в первую очередь. Если вы разрешите BSDF - не только BRDF - в своем трассировщике пути, вам придется интегрироваться по всей сфере, а не только по положительному полушарию. Сэмплы Монте-Карло могут быть сгенерированы различными способами: для прямого освещения вы можете использовать BSDF и выборку света, для непрямого освещения единственной значимой стратегией обычно является выборка BSDF. Сами стратегии отбора проб обычно содержат решение о том, какое полушарие выбрать (например, рассчитывается ли отражение или преломление).

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

Для выборки BSDF ситуация гораздо интереснее. Описанный вами случай имеет дело с идеальной поверхностью Френеля, в которой есть только два способствующих направления (поскольку BSDF Френеля на самом деле является просто суммой двух дельта-функций). Вы можете легко разделить интеграл на сумму двух частей - одной отражения и одной для рефракции. Поскольку, как вы упомянули, мы не хотим идти в обоих направлениях в трассировщике пути, мы должны выбрать одно. Это означает, что мы хотим оценить сумму чисел, выбрав только одно из них. Это можно сделать с помощью дискретной оценки Монте-Карло: выберите одно из случайных чисел случайным образом и разделите его на вероятность его выбора. В идеальном случае вы хотите, чтобы вероятность выборки была пропорциональна аддентам, но, поскольку мы не знаем их значений (нам не пришлось бы оценивать сумму, если бы мы их знали), мы просто оцениваем их, пренебрегая некоторыми из факторов. В этом случае мы игнорируем количество поступающего света и используем только коэффициент отражения / пропускание Френеля в качестве наших оценок.

Следовательно, процедура выборки BSDF для случая гладкой поверхности Френеля состоит в том, чтобы случайным образом выбирать одно из направлений с вероятностью, пропорциональной коэффициенту отражения Френеля, и в некоторой точке делить результат для этого направления на вероятность выбора направления. Оценщик будет выглядеть так:

Lя(ωя)F(θя)п(ωя)знак равноLя(ωя)F(θя)F(θя)знак равноLя(ωя)

ωязнак равно(φя,θя)Lя(ωя)F(θя)п(ωя)F(θя)

В случае более сложных моделей BSDF, таких как модели, основанные на теории микрообъектов, выборка несколько сложнее, но обычно может быть применена и идея разделения целого интеграла на конечную сумму подинтегралов и последующего использования дискретного Монте-Карло.

ivokabel
источник
1
Это интересно, но меня смущает один момент. Не могли бы вы уточнить, что значит «разделить результат для этого направления на вероятность выбора направления»? Если это не бинарный выбор, а направление, выбранное из непрерывного распределения, не будет ли вероятность нулевой?
трихоплакс
1
@trichoplax: Да, было бы, но в этом параграфе я описывал технику выборки только для (диэлектрической) ФРДНЭ - идеально гладкой поверхности, которая является суммой двух дельта-функций Дирака. В таком случае вы выбираете одно из направлений с некоторой дискретной вероятностью. В случае недельта (конечного) BSDF вы генерируете направления в соответствии с функцией плотности вероятности. К сожалению, дельта и недельта случаи должны обрабатываться отдельно, что делает код немного грязным. Более подробную информацию о пробоотборных микрообъектах BSDF можно найти, например, в Walter et. и др. [2007] бумага.
Иокабель
2
@RichieSams: Уолтер и др. и др. [2007] в основном все еще является современным уровнем для диэлектрических шероховатых поверхностей, но для того, чтобы он работал хорошо, вам нужна хорошая выборка, которая была недавно опубликована Heitz и D'Eon в статье 2014 года «Важная выборка BSDF на основе микроацетонов используя распределение видимых нормалей ". И обратите внимание, что это модель однократного рассеяния, которая игнорирует взаимные отражения между микрообъектами, делая ее заметно темной для более высоких значений шероховатости. См. Мой вопрос «Компенсация потерь энергии в моделях BSDF с односторонним рассеиванием» для более подробной информации.
Ивокабель
5
Просто хотел указать, что если вы выберете вероятность = fresnel () в качестве предложенного вопроса, то, когда вы делите на вероятность, вы отменяете коэффициент Френеля, который обычно умножается на. Так (в дискретном, двумерном случае ) вы получите лучевой вклад, не включающий в себя никакого фактора Френеля. Это стандартная теория выборки по важности, но я подумал, что могу указать на это как на запутывающую проблему.
Натан Рид
2
@ Натан, я включил твое уведомление в ответ.
Ивокабель