SSLR и темпоральная аккумуляция

Как и планировал, сумел победить зашумленность отражений при помощи накопления данных с предыдущих кадров (с репроекцией по motion-векторам для компенсации медленного движения камеры):

Это решение также неплохо сглаживает шум, вызванный неоднородностью нормалей:

При резких движениях, конечно, репроекция не спасает, приходится сбрасывать историю, и шум возвращается. И, конечно, экранная трассировка — это аппроксимация, у нее всегда будут видимые артефакты в виде пустот там, где сэмплинг невозможен ввиду недостатка информации в буферах. Но результат вполне, как говорится, shippable — мне кажется, у меня получилось даже лучше, чем во многих коммерческих играх. Во многом, это благодаря использованию GGX importance sampling: распределение лучей очень близко к тому, что делается для префильтрации кубических карт под PBR.

SSLR в Dagon 2.0

Реализацию этого эффекта я в свое время отложил до выхода первой версии движка, и вот, наконец, пришло время за нее взяться. SSLR (screen-space local reflections) — это расчет отражений в пространстве экрана, упрощенная разновидность трассировки лучей. Берется HDR-буфер, буферы глубины и нормалей и в каждой точке выстреливается луч в направлении зеркального отражения поверхности. Луч делится на сегменты, и каждый сегмент последовательно проверяется на попадание в геометрию (путем сравнения Z со значением из буфера глубины). Если попали, то читаем цвет, соответствующий по экранным UV-координатам точке попадания.

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