В настоящее время я пытаюсь реализовать трассировщик пути Монте-Карло. Я провел некоторые исследования, и похоже, что общий подход к материалам заключается в использовании многоуровневой модели. Что-то вроде этого:
Когда свет попадает на поверхность, Френель говорит нам, сколько этого света отражается первым слоем и сколько идет на второй, и так далее.
Поэтому я сделал нечто похожее, но более простое: только один слой зеркальных и один слой рассеянных. Пропускания пока нет. Пока все хорошо, я использую простой взвешенный по косинусу brdf для моей диффузной модели, а модель Кука-Торранса - для моего зеркального отражения.
Теперь самое сложное: что мне делать, когда луч попадает на поверхность? Обычно я выбираю brdf, соответствующий материалу поверхности, выбираю направление падающего света, оцениваю brdf и делю на правильную функцию распределения вероятности.
Но здесь, поверхностное попадание эффективно соответствует нескольким материалам. Наивным способом справиться с этим будет выборка один раз для каждого попадания слоя. Но это, несомненно, является источником огромного снижения производительности, в результате чего мой путь фактически превращается в дерево.
Есть ли лучшее решение?