Оптимизация варианта описанного в статье https://habr.com/ru/post/434528/
- Переписано на c#
- Добавлена глубина резкости
- Рассеивающий источник света через потолочные отверстия вместо прямого освещения
- Многопоточность
Следующие оптимизации дали прирост скорости в 80-100 раз:
- Кеширование SDF-функции в трехмерном массиве для всего пространства, интерполяция SDF по ближайшим значениям в трехмерной сетке.
- Преобразование кеша SDF. В результате имеем свою SDF для каждого из 8 направлений полета лучей (+x, +y, +z), (+x, +y, -z) (+x, -y, +z) (+x, -y, -z) (-x, +y, +z) (-x, +y, -z) (-x, -y, +z) (-x, -y, -z). Это позволяет иметь высокие значения SDF вокруг препятствий, если направление движения от препятствия.
- Интерполяция кеша используется только при низких значениях SDF, значение функции в глубине пустого пространства вычисляется грубо но быстро.
За счет чего можно ускорится дополнительно:
- Переиспользовать первый этап просчета хода луча. Но придется пожертвовать глубиной резкости.
- Число точек на семпл можно сделать меньше в тех местах где переотражение вносит вклад без большого шума. В этом случае все семплы дают примерно одинаковый цвет и картинка сильно не изменится от наращивания семплов.
- Увеличить число направлений для расчета кеша SDF.
галерея: