Closed LifeKILLED closed 2 years ago
Гайд по добавлению шумодава в игру
**Описание (можно скипнуть)**
Пока еще шумодав работает исключительно с диффузным светом окружения, который однако приносит больше всего дискомфорта миганием и рябью. Это успешно устраняется. Шум теней и спекуляра надо убирать по-другому.
Отраженный глобальный свет почти всегда мягкий. Поэтому можно использовать блюр очень большого радиуса, чтобы охватить как можно большее число "белых точек" на шуме.
Но нужно учитывать не только цвет, но и направления, откуда свет пришел. Используя эти данные, можно переосветить сцену, сохранив мельчайшие детали.
Сферические гармоники - это способ сохранить 16 цветов, пришедших с 16 направлений всего в шести float-числах. Это просто очень удобный способ упаковки лайтпроб.
Еще одним хорошим свойством сферических гармоник: их можно легко складывать/интерполировать покомпонентно, как векторы. За счет этого можно очень дешево смешивать их простым блюром. На выходе получается набор мягко переходящих друг в друга лайтпроб.
**Как мерджить:**
В исходниках - объявить и инициализировать 4 текстуры: две для чистых гармоник и две для размытых. И передать их в шейдеры. Также вызвать шейдер первого прохода размытия.
Помимо новых шейдеров, изменения коснулись:
denoiser.comp - переосвещение пикселя найденными рядом гармониками
ray.rgen.comp - новые переменные в начале файла и функции main(). Самое главное - в самом конце, где мы кладем цвет out_accumulate в текстуру сферических гармоник. Также нужно запомнить направление 1 отскока и сохранить правильные нормали. Пришлось убрать упаковку двух нормалей в один, т.к. это давало неправильный результат при переосвещении.
Денойз никак не затрагивает код освещения, ему нужны только цвет и вектор
Если у меня будет время (ХХАХАХАХА), то я могу свои комментарии выше и сам поправить. Другое дело, что я так-то хотел совсем другой подход с деноизером попробовать, и начинаю думать про то, как можно сделать два параллельных деноизера рядом, чтобы их можно было переключать хотя бы при сборке.
Наверное, я себе смогу сам просто рядом подложить потом, когда начну экспериментировать.
И да, наверное, лучше выставить PR без включения better-sampling на просто vulkan. Не знаю пока, каков будет жизненный цикл better-sampling, и ничего, его включающего, не хочу пока мержить в вулкан.
(inb4 через час как вмержу better-sampling в вулкан)
Понял! Тогда верну шумодав на вулкан-рендер. Разница очень небольшая, изменений в логике лучей почти нет, это будет не сложно
Не уверен, что смогу быстро внести изменения с инициализациями и барьерами. Надеюсь, кто-то сделает это за меня
Насчет других способов шумоподавления, я просто не вижу лучшего варианта для глобального освещения. По моему опыту рендеринга в нереалтайм рендерах, более-менее ровной и без мерцаний картинка становилась только после 200 итераций на пиксель. Это целых 5 секунд, темпоральный денойз не проживет столько. Гармоники же делают это даже внутри одного кадра и практически не сажают производительность.
Другие способы шумоподавления использовать безусловно необходимо на спекуляре и прямом освещении в любом случае.
Оставлю эту ветку нетронутой и этот коммит активным, если ты все-таки захочешь использовать у себя этот шумодав. Он более-менее отлажен, проверен, протестирован несколькими людьми, были фитбеки и фиксы.
А я пока продолжу развивать другую экспериментальную ветку
Почему закрыл? Висела бы себе и висела. Или что-то новое будет?
Я много всего переделываю в новой ветке. Нового будет много
Add denoising of global illumination with spherical harmonics with worked integration with better-sampling branch