Добавил расчет для вторичного света (ссылка на код внизу)
Продолжаю допиливать глобальное освещение для 2D проекта с помощью рей-марчинга.
Абстрактные примеры
Здесь только прямой свет + пенумбры через реймарч SDF:
Прямой + вторичный свет методом virtual lights:
Как это работает
Проверка перекрытия света делается в два этапа:
1) Строим Signed-Distance-Field текстуру используя оклюлеры.
2) Используя SDF для каждого пикселя "маршируем" луч в сторону каждого источника света и проверяем перекрыт ли он оклюдером.
3) Далее, если источник не перекрыт, то вычисляем количество полученного пикселем света любой понравившейся формулой.
Для не физически-корректных пенумбр можно дешево посчитать расстояние от луча до ближайшего оклюдера как описано здесь.
4) Далее, вторичный свет вычисляем похожим образом, используя подсвеченные пиксели в качестве новых источников. Здесь я пока еще экспериментирую, но как будет хороший результат, сделаю отдельный пост.
Выложил исходный код на Rust+WGSL здесь: