path tracing - теория
В начале я решил просто постичь трассировку лучей. Делал примеры на CPU, GPU и фрагментных шейдерах, сейчас остановился на Vulkan и специальном расширении для этого (VK_KHR_RAYTRACING). Ниже пример того, на чем я остановился:
Первым неприятным открытием для меня стало то, что мягкие тени так просто не сделать даже на GPU (а я надеялся запустить сотню лучей в сторону сферического источника света и хорошо себя чувствовать, но нет), приходится в каждом кадре в пределах конуса запускать один псевдо-случайный луч, и получать шумное изображение. В разных источниках упоминается денойзинг, без которого, как оказалось, не обойтись.
И тут я подумал - раз уж в любом случае придется разбираться с денойзингом, не попробовать ли мне замахнуться на нечто большее, а именно на path tracing в реальном времени на GPU? Я натыкался на различные примеры, и сделал вывод что это именно то, что нужно.
Но тут я понял что у меня не хватает теоретического понимания того, как устраивается path tracing. А именно, мне не понятно следующее:
- Правильно ли я понимаю, что алгоритм в общих чертах такой : луч исходящий из камеры ударяется о поверхность, в месте ударения луча генерируется еще куча лучей (по полусфере вдоль нормали) и они направляются во все стороны, затем снова, и снова, пока луч не достигнет источника?
- Если всё так, как считать освещенность точки? Чем больше отскоков луча, тем тусклее свет? Но ведь если мы говорим о трассировке в реальном времени, кол-во отскоков вообще должно быть крайне лимитировано (например, даже одним отскоком). В таком случае как вычисляется освещенность?
- Интеграция методом Монте-Карло. Много где это упоминается, но я до конца не понимаю суть. Суть в том чтобы направить много лучей из точки пересечения, посмотреть какой цвет (освещенность ПРЯМЫМ освещением) для пересечения каждого луча, а затем сложить и поделить на кол-во? Или я ошибаюсь?
- Прямая и НЕ прямая освещенность. В моем текущем примере источники точечные, а если быть точнее - сферические (хотя сферичность используется только для генерации теней). Суть в том что я заранее знаю где они находятся и для вычисления той же тени я направляю в сторону этой сферы лучи. Это прямое освещение. Как прямое освещение реализуется в случае с path tracing'ом? Лучи просто случайно попадают в источник, или для прямого освещения генерируются лучи идущие конкретно в источник? Но источники могут быть самых произвольных форм..
- Мы не можем запускать особо много лучей по полусфере, если хотим чтобы это работало в реальном времени. Максимум 4 луча. Слышал что иногда используется наложение результата предыдущего кадра на результат текущего. Но даже если так, возникает вопрос как это всё усредняется. Складываются 2 кадра и делится на 2?
- Если делать это сложение результата из предыдущего кадра - может возникнуть проблема при резком движении камеры. Как это решается? Получается нужно каким-то образом сдвигать на сколько-то кадр (или выборку из него) Как понять насколько?
В общем буду рад, если кто-то прояснит детали алгоритма path tracing'а, возможно мне стоит в начале попытаться сделать это на CPU
