w23 / xash3d-fwgs

Vulkan Ray Tracing fork of Xash3D FWGS engine. Intended to be merged into master at some point in the future.
160 stars 16 forks source link

Better sampling with denoising #323

Closed LifeKILLED closed 2 years ago

LifeKILLED commented 2 years ago

Add denoising of global illumination with spherical harmonics with worked integration with better-sampling branch

LifeKILLED commented 2 years ago

Гайд по добавлению шумодава в игру

    **Описание (можно скипнуть)**

Пока еще шумодав работает исключительно с диффузным светом окружения, который однако приносит больше всего дискомфорта миганием и рябью. Это успешно устраняется. Шум теней и спекуляра надо убирать по-другому.

Отраженный глобальный свет почти всегда мягкий. Поэтому можно использовать блюр очень большого радиуса, чтобы охватить как можно большее число "белых точек" на шуме.

Но нужно учитывать не только цвет, но и направления, откуда свет пришел. Используя эти данные, можно переосветить сцену, сохранив мельчайшие детали.

Сферические гармоники - это способ сохранить 16 цветов, пришедших с 16 направлений всего в шести float-числах. Это просто очень удобный способ упаковки лайтпроб.

Еще одним хорошим свойством сферических гармоник: их можно легко складывать/интерполировать покомпонентно, как векторы. За счет этого можно очень дешево смешивать их простым блюром. На выходе получается набор мягко переходящих друг в друга лайтпроб.

   **Как мерджить:**

В исходниках - объявить и инициализировать 4 текстуры: две для чистых гармоник и две для размытых. И передать их в шейдеры. Также вызвать шейдер первого прохода размытия.

Помимо новых шейдеров, изменения коснулись:

denoiser.comp - переосвещение пикселя найденными рядом гармониками

ray.rgen.comp - новые переменные в начале файла и функции main(). Самое главное - в самом конце, где мы кладем цвет out_accumulate в текстуру сферических гармоник. Также нужно запомнить направление 1 отскока и сохранить правильные нормали. Пришлось убрать упаковку двух нормалей в один, т.к. это давало неправильный результат при переосвещении.

Денойз никак не затрагивает код освещения, ему нужны только цвет и вектор

w23 commented 2 years ago

Если у меня будет время (ХХАХАХАХА), то я могу свои комментарии выше и сам поправить. Другое дело, что я так-то хотел совсем другой подход с деноизером попробовать, и начинаю думать про то, как можно сделать два параллельных деноизера рядом, чтобы их можно было переключать хотя бы при сборке.

Наверное, я себе смогу сам просто рядом подложить потом, когда начну экспериментировать.

w23 commented 2 years ago

И да, наверное, лучше выставить PR без включения better-sampling на просто vulkan. Не знаю пока, каков будет жизненный цикл better-sampling, и ничего, его включающего, не хочу пока мержить в вулкан.

(inb4 через час как вмержу better-sampling в вулкан)

LifeKILLED commented 2 years ago

Понял! Тогда верну шумодав на вулкан-рендер. Разница очень небольшая, изменений в логике лучей почти нет, это будет не сложно

Не уверен, что смогу быстро внести изменения с инициализациями и барьерами. Надеюсь, кто-то сделает это за меня

LifeKILLED commented 2 years ago

Насчет других способов шумоподавления, я просто не вижу лучшего варианта для глобального освещения. По моему опыту рендеринга в нереалтайм рендерах, более-менее ровной и без мерцаний картинка становилась только после 200 итераций на пиксель. Это целых 5 секунд, темпоральный денойз не проживет столько. Гармоники же делают это даже внутри одного кадра и практически не сажают производительность.

Другие способы шумоподавления использовать безусловно необходимо на спекуляре и прямом освещении в любом случае.

LifeKILLED commented 2 years ago

Оставлю эту ветку нетронутой и этот коммит активным, если ты все-таки захочешь использовать у себя этот шумодав. Он более-менее отлажен, проверен, протестирован несколькими людьми, были фитбеки и фиксы.

А я пока продолжу развивать другую экспериментальную ветку

w23 commented 2 years ago

Почему закрыл? Висела бы себе и висела. Или что-то новое будет?

LifeKILLED commented 2 years ago

Я много всего переделываю в новой ветке. Нового будет много