Обзор самописной 2D системы освещения для top-down Pixel Art игр на расте и wgsl

В последние два с половиной месяца я с головой ушел в разработку системы освещения для top-down 2D игр "с нуля". В данный момент у меня готова полностью динамическая система для первичного и вторичного света (т.е. – global illumination) методом расчета проб через трассировку лучей в SDF пространстве. Решил поделиться прогрессом, кодом и техническим…

330330

Вопрос про историю из 8-ми кадров. Я так понял, каждый кадр там подсчитан с нуля и без учета других кадров. А потом в финальном проходе ты делаешь 8 выборок и усредняешь результат. То есть условно:
```
for i in 0..8
final_color += k[i] * reproject(history_tile[i], diff_coord[i]);
final_color *= get_texture();
```
А не проще ли хранить всего один предыдущий кадр, но в котором уже будут учтены все предыдущие?
```
history_tile[0] += k * reproject(history_tile[1], diff_coord);
history_tile[1] = history_tile[0];
final_color = get_texture() * history_tile[0];

```
То есть, вычисляешь тайл как сейчас, но вместо этапа записи его в атлас, применяешь к нему предыдущий тайл с репроектингом и затуханием, используешь его в финальном проходе и меняешь тайлы местами. Получаем меньше потребления памяти и меньше выборок в финальном проходе

2
Ответить
Автор

Да, отличное замечание.

У меня так изначально и работало. Мы брали значение предыдущего кадра, добавляли к нему новый и вычитали последний. Можно это делать немного хитрее, например как в этой статье: https://gpuopen.com/download/publications/GPUOpen2022_GI1_0.pdf?utm_source=twitter&utm_medium=social&utm_campaign=arrg

Это по-моему наблюдению очень сильно влияет на перформанс, в продакшн версии нужно будет вернуть.

Я поменял на вычисление "в лоб" из 8 семплов только потому что так удобнее было экспериментировать.

1
Ответить