w23 / xash3d-fwgs

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

Figure out how to importance-sample skylight #16

Closed w23 closed 3 years ago

w23 commented 3 years ago

We tried to just add SURF_DRAWSKY surfaces as emissive to light clusters, and that immediately overflows light cluster buffers because there are way too many such surfaces, and most of them affect the entire map essentially.

I don't have any good ideas of how to address this ATM. Maybe better culling of such surfaces (i.e. using PVS) would help, decreasing their number a bit?

w23 commented 3 years ago

So one possible approach is:

Alternative:

0x4E69676874466F78 commented 3 years ago

For the sky, light_spot can also be used with the key _sky = 1 #38 There you can do two suns for example.

0x4E69676874466F78 commented 3 years ago

Выяснились пикантные особенности неба:

  1. light_environment может быть не один, вот примерный список (в скобках число на карте): c0a0b (2), c2a3e (4), c2a4 (2), c2a5 (6), c2a5b (5), c2a5c (2), c2a5e (4), c2a5f (4), c2a5w (5), c2a5x (3), c4a1 (5), c4a1b (3), c4a1y (2), c4a1z (2), crossfire (2).
  2. На карте c0a0b где мы наблюдали на стриме отличающуюся тень это похоже именно тот случай когда взялся второй light_environment который там задан в начале где вагончик опускается.
  3. У light_environment в те времена например не было angles (pitch yaw roll) и были только pitch и angle по отдельности, потом angle из редактора выпилили, а pitch забыли, но в картах халфы angle всё ещё используется.
  4. Ещё есть глобальный уровень амбиента, нам его неоткуда взять, но почитать про него можно тут https://github.com/ValveSoftware/halflife/blob/master/utils/qrad/qrad.txt#L27
  5. light_environment могут быть в разных местах и задавать разный угол падения солнца, типа пролез по трубе а там уже солнце слегка иначе смотрит, но может быть и недалеко друг от друга.
  6. В коде курада сложно понять как определяется какие поверхности скайбокса отвечают за конкретный light_environment выяснить сложно https://github.com/ValveSoftware/halflife/blob/master/utils/qrad/lightmap.c#L1358 наверное в этой функции, там PVS задействуется ещё и такое есть https://github.com/ValveSoftware/halflife/blob/master/utils/qrad/lightmap.c#L1143-L1164 Проще наверное навелосипедить, пустив без отражений лучи от light_environment в разные стороны и собрать временный список поверхностей неба связанный с этим конкретным light_environment, потом выделить наружные границы суммы всех собранных брашей и записать координаты получившейся коробки, дальше если игрок в этой коробке смотреть в параметры light_environment которая с ним связана и применять их к солнцу.

Обновил #38

w23 commented 3 years ago

Я промыл и вставил глазки и посмотрел на исходники курада более внимательно, и там короче очень прямолинейно всё: у light_environment действительно есть origin, по которому он тупо кладётся в список источников света своего листика bsp.

Выходит, что нам нужно делать не глобальное солнце, а просто ещё один источник света. Ну и light clusters более естественно делать всё же на основе bsp, выходит. Нужно опять собирать эксперименты эти поганые, как туда правильно всё складывать и вообще.

0x4E69676874466F78 commented 3 years ago

light_spot с _sky = 1: c2a2g, c2a2h, c2a4, c2a4e, c2a4f, c2a4g Все из них в том числе с light_environment.

0x4E69676874466F78 commented 3 years ago

@w23

Выходит, что нам нужно делать не глобальное солнце, а просто ещё один источник света.

А он будет только за свою зону отвечать?

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

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

w23 commented 3 years ago

Выходит, что нам нужно делать не глобальное солнце, а просто ещё один источник света.

А он будет только за свою зону отвечать?

Ага. Вроде это именно то, чего мы хотим. Не знаю, правда, что там именно со скайбоксом.

0x4E69676874466F78 commented 3 years ago

Ещё инфа: на hlrad (компилятор из ZHLT) light_environment работает иначе, он не учитывает другие light_environment и получается всего одна энтити на всю карту. Этот компилятор очень популярный и вроде в модах активно используется. Моё предложение: если на карте только

то делать солнце(а) глобальным(и).

w23 commented 3 years ago

It seems that qrad explicitly samples emit_skylight sources only if they're hitting SURF_SKY surfaces: https://sourcegraph.com/github.com/ValveSoftware/halflife/-/blob/utils/qrad/lightmap.c?L1098