Участник
- Статус
- Оффлайн
- Регистрация
- 8 Янв 2020
- Сообщения
- 430
- Реакции
- 234
Сделал очень быструю трассировку путей в реальном времени. Она использует сильно упрощённую геометрию сцены при расчете глобального освещения. Из-за этого и выходит такая высокая производительность, но такой подход пригоден только для расчета AO и непрямого освещения, т.к. отражения будут отображать эту самую уродливую простую геометрию сцены.
Сама реализация:
Берём модельки и объекты сцены в определенном радиусе, в котором будет работать глобальное освещение. С помощью compute шейдера или на процессоре вокселизируем модели либо сильно сокращаем количество вершин модели (тут на ваш выбор, первый вариант тяжелее на стороне процессора, но легче при расчете самого освещения, со вторым - наоборот. Также можно использовать готовые ЛОДы, если они есть). Создаём карту текстур для этих простых моделей или кубов либо ремапим оригинальные UV координаты текстур прямо в фрагмент шейдере (первый вариант жрет больше памяти, так что тут тоже на ваш выбор, но рекомендую второй). Собственно, рассчитываем усреднённый цвет с текстур на эти воксели или упрощённую модельку. Теперь о самой трассировке путей. Тут я буду описывать процесс для трассировки кубиков, но сам процесс (кроме функции пересечения) не отличается для упрощенных моделей.
Берём любую функцию пересечения луча с кубом, но желательно брать те, где поменьше (или отсутствуют) ветвления и сложных операций с матрицами. Далее итерируем все подготовленные цели для глобального освещения и ищем пересечение. Оптимизация: перед отправкой данных в шейдер освещения, сортируем все кубики по дистанции до камеры, чтобы сразу брать первое пересечение в самом шейдере и не итерировать все таргеты, т.к. это сильно замедлит трассировку. Используем позицию фрагмента, полученную при растеризации, как отправную точку для первого луча. Семплим направление для луча по любой BRDF и пускаем луч в этом направлении. Далее все как в обычной трассировке путей. Не забываем про семплинг прямых источников света, начиная со второго отскока (для этого можно использовать карты теней, чтоб не пускать дополнительные лучи для проверки видимости). Отражения семплим либо по SSR, либо по кубмапам, чтоб не получилось ебаное уродство из кубов в зеркале.
В конце просто усредняем собранные семплы и умножаем их на цвет, полученный при обычном расчете освещения. Надеюсь, этот опыт хоть кому-то пригодится. Могут быть неточности, я хочу спать.
Производительность: 120-150 кадров в секунду в разрешении 1920х1080 на RTX 3060.
Карты теней, построенные с помощью трассировки лучей воксельной геометрии (или почему это плохая идея):
Сама реализация:
Берём модельки и объекты сцены в определенном радиусе, в котором будет работать глобальное освещение. С помощью compute шейдера или на процессоре вокселизируем модели либо сильно сокращаем количество вершин модели (тут на ваш выбор, первый вариант тяжелее на стороне процессора, но легче при расчете самого освещения, со вторым - наоборот. Также можно использовать готовые ЛОДы, если они есть). Создаём карту текстур для этих простых моделей или кубов либо ремапим оригинальные UV координаты текстур прямо в фрагмент шейдере (первый вариант жрет больше памяти, так что тут тоже на ваш выбор, но рекомендую второй). Собственно, рассчитываем усреднённый цвет с текстур на эти воксели или упрощённую модельку. Теперь о самой трассировке путей. Тут я буду описывать процесс для трассировки кубиков, но сам процесс (кроме функции пересечения) не отличается для упрощенных моделей.
Берём любую функцию пересечения луча с кубом, но желательно брать те, где поменьше (или отсутствуют) ветвления и сложных операций с матрицами. Далее итерируем все подготовленные цели для глобального освещения и ищем пересечение. Оптимизация: перед отправкой данных в шейдер освещения, сортируем все кубики по дистанции до камеры, чтобы сразу брать первое пересечение в самом шейдере и не итерировать все таргеты, т.к. это сильно замедлит трассировку. Используем позицию фрагмента, полученную при растеризации, как отправную точку для первого луча. Семплим направление для луча по любой BRDF и пускаем луч в этом направлении. Далее все как в обычной трассировке путей. Не забываем про семплинг прямых источников света, начиная со второго отскока (для этого можно использовать карты теней, чтоб не пускать дополнительные лучи для проверки видимости). Отражения семплим либо по SSR, либо по кубмапам, чтоб не получилось ебаное уродство из кубов в зеркале.
В конце просто усредняем собранные семплы и умножаем их на цвет, полученный при обычном расчете освещения. Надеюсь, этот опыт хоть кому-то пригодится. Могут быть неточности, я хочу спать.
Производительность: 120-150 кадров в секунду в разрешении 1920х1080 на RTX 3060.
Карты теней, построенные с помощью трассировки лучей воксельной геометрии (или почему это плохая идея):