Я пытаюсь реализовать рефракцию и передачу в моем трассировщике пути, и я немного не уверен, как это реализовать. Сначала немного предыстории:
Когда свет попадает на поверхность, часть его отражается, а часть преломляется:
Сколько света отражается и преломляется, определяется уравнениями Френеля
В рекурсивном трассировщике лучей простой реализацией будет стрелять луч для отражения и луч для преломления, а затем делать взвешенную сумму, используя Френеля.
Однако при трассировке пути мы выбираем только один путь. Это мой вопрос:
- Как выбрать, отражать или преломлять непредвзято
Моим первым предположением будет случайный выбор на основе Френеля. Ака:
float p = randf();
float fresnel = Fresnel();
if (p <= fresnel) {
// Reflect
} else {
// Refract
}
Было бы это правильно? Или мне нужен какой-то поправочный коэффициент? Так как я не иду в обоих направлениях.
brdf
pathtracing
reflection
refraction
RichieSams
источник
источник
Ответы:
TL; DR
Да, вы можете сделать это так, вы просто должны разделить результат на вероятность выбора направления.
Полный ответ
Тема выборки в трассировщиках пути, позволяющая использовать материалы с отражением и преломлением, на самом деле немного сложнее.
Давайте начнем с некоторого фона в первую очередь. Если вы разрешите BSDF - не только BRDF - в своем трассировщике пути, вам придется интегрироваться по всей сфере, а не только по положительному полушарию. Сэмплы Монте-Карло могут быть сгенерированы различными способами: для прямого освещения вы можете использовать BSDF и выборку света, для непрямого освещения единственной значимой стратегией обычно является выборка BSDF. Сами стратегии отбора проб обычно содержат решение о том, какое полушарие выбрать (например, рассчитывается ли отражение или преломление).
В простейшем варианте выборка света обычно мало заботит об отражении или преломлении. Он выбирает источники света или карту окружающей среды (если есть) с точки зрения свойств света. Вы можете улучшить выборку карт окружающей среды, выбрав только полушарие, в которое материал имеет ненулевой вклад, но остальные свойства материала обычно игнорируются. Обратите внимание, что для и идеально гладкого материала Френеля выборка света не работает.
Для выборки BSDF ситуация гораздо интереснее. Описанный вами случай имеет дело с идеальной поверхностью Френеля, в которой есть только два способствующих направления (поскольку BSDF Френеля на самом деле является просто суммой двух дельта-функций). Вы можете легко разделить интеграл на сумму двух частей - одной отражения и одной для рефракции. Поскольку, как вы упомянули, мы не хотим идти в обоих направлениях в трассировщике пути, мы должны выбрать одно. Это означает, что мы хотим оценить сумму чисел, выбрав только одно из них. Это можно сделать с помощью дискретной оценки Монте-Карло: выберите одно из случайных чисел случайным образом и разделите его на вероятность его выбора. В идеальном случае вы хотите, чтобы вероятность выборки была пропорциональна аддентам, но, поскольку мы не знаем их значений (нам не пришлось бы оценивать сумму, если бы мы их знали), мы просто оцениваем их, пренебрегая некоторыми из факторов. В этом случае мы игнорируем количество поступающего света и используем только коэффициент отражения / пропускание Френеля в качестве наших оценок.
Следовательно, процедура выборки BSDF для случая гладкой поверхности Френеля состоит в том, чтобы случайным образом выбирать одно из направлений с вероятностью, пропорциональной коэффициенту отражения Френеля, и в некоторой точке делить результат для этого направления на вероятность выбора направления. Оценщик будет выглядеть так:
В случае более сложных моделей BSDF, таких как модели, основанные на теории микрообъектов, выборка несколько сложнее, но обычно может быть применена и идея разделения целого интеграла на конечную сумму подинтегралов и последующего использования дискретного Монте-Карло.
источник