Physically Based Shading for Call of Pripyat
Проект модификации шейдеров S.T.A.L.K.E.R. Зов Припяти, позволяющий создавать PBS материалы для игры. Главные цели проекта:
- иметь Metalness, Roughness, Occlusiion карты в текстурах;
- шейдеры не должны взрывать картинку с оригинальным контентом и требовать полной переработки;
- работать на ванильном движке, или OpenXRay 1.6 для максимальной совместимости со всем вообще.
В поставке:
- шейдеры для R3 и R2;
- набор текстур для демонстрации.
- Работает на R3 и R2. Изменений в R1 не произведено. Да и надо ли?
- Контент всё равно требует приложить к нему руку, потому что:
- По умолчанию все материалы - матовые диэлектрики, чтобы материалы блестели где надо и не блестели где не надо нужно нарисовать соответствующие карточки;
- Не смотря на то, что контент не взрывается, персонажи стали выглядеть как бумажные статуэтки с принтом человека.
В контент включены:
- SSLR шейдер от Anonim https://www.amk-team.ru/forum/topic/14078-sslr/#comment-1287250, простая реализация;
- GTAO, простая реализация от LVutner, дополненная шумом из ассета для Unity. На данный момент они интегрированы только на R3. Оптимизаций алгоритмов не производилось.
r3_gbuffer_opt off
обязателен, чтобы мод заработал, в шейдерах своя паковка связанная с костылями, чтобы завести PBS, для которой нужны все карточки в gbuffer-е, подробнее в технических подробностях;r2_ssao_blur on
,r2_ssao_opt_data off
,r2_ssao_mode default
- для того, чтобы завести GTAO с размытием.r3_dynamic_wet_surfaces on
,r3_dynamic_wet_surfaces_far 70.
,r3_dynamic_wet_surfaces_near 50.
,r3_dynamic_wet_surfaces_sm_res 512
- для того, чтобы дистанция намокания и переход между сухим намокшим были приемлимые.
- На GTAO с r2_ssao_blur 1 вокруг предметов вплотную к небу чёрная обводка, я сделал, чтоб она была белой, но это проблема halfres рендера ssao;
- Для irradience map заготовлены small sky в софтине Lys. Вместо irradience использован specular с настройкой roughness 0.5, потому что так красивее;
- Для источников света используются отдельные карты диффуза и глосса, потому что accum шейдерах буффер COL пустой - движок отдаёт только POS и NORM. Дождь изменяет одни диффуз и глосс, а источники света берут другие. Поэтому для источников света нет намокших поверхностей.
Порядок каналов в _bump
:
R | G | B | A |
---|---|---|---|
metalness | roughness | normal y | normal x |
Порядок каналов в _bump#
:
R | G | B | A |
---|---|---|---|
normal err x | normal err y | AO * 0.5 | height |
В текстурах в ресурсах ваниллы G канал _bump
в целом белый, а B канал _bump#
в целом серый. Поэтому в G канале _bump
именно roughness, а не gloss. А AO в B канале _bump#
находится в значениях от 0 до 128.
- В шейдере изменён порядок каналов GBuffer-а для того, чтобы PBS рендерился без правок движка.
- POS.xy заменены на 4 канала color+gloss, сжатые с потерями в два. Сделано это для того, чтобы в s_accum получить полный результат просчёта света от источника, включая блеск и диффузный цвет;
- roughness карта в буфер помещается как 1 - roughness, чтобы намокание правильно работало.
- я вынул mtl индекс из gbuffer. В X-Ray он в основном нужен, чтобы применять разный характер отражения на поверхностях. Но теперь нельзя делать хаки, назначая кастомный mtl индекс на текстуры и применять к ним особенные эффекты.
Порядок каналов в GBuffer:
- | RGB | A |
---|---|---|
POS | [color.rgb, gloss], position.z | metalness |
NORM | normal.rgb | hemi |
COL | color.rgb | gloss |
- рабочий texCubeLOD на R2, он нужен, чтобы размывать скайбокс в зависимости от шершавости поверхности. Доступен только выбор между skybox и smallsky;
- вращать отражение скайбокса вслед за скайбоксом;
- тинтить отражение скайбокса при помощи sky_color;
- сделать, чтобы на намокших от дождя поверхностях были блики от источников света
- SSLR на полуматовых поверхностях - нужно делать mip-map-ы буфера.
- SSAO blur сейчас работает следующим образом. Он рендерит SSAO в буфер в полразмера, затем его нужно взять в полный размер и затем размыть. Правильно было бы размыть его в пол-размера, записать в буфер и его уже увеличить до полного, но vanilla движок такое не позволяет.
- Исправить все баги.
- Доделать перенос шейдеров на R2, как оказалось, не все шейдеры поправлены.
- Добавить сюда скриншотов;
- Перенести SSLR и GTAO на R2;
- Оттестировать все источники света и все шейдеры на работу с новым пайплайном;
- Набор демонстрационных текстур окружения;
- Набор демонстрационных текстур HUD моделей;
- Набор исправленных текстур персонажей, чтобы они не выглядели так страшно;
- Демонстрационная локация;
- Починить фильтрацию rain shadow map, чтобы на вертикальных поверхностях полосы исчезли.
- Добавить Filtered Importance Sampling (на самом деле он совсем не обязательный);
- Сделать новый шейдер террейна с параллаксом на основе sufrace_bumped, height маской между слоями (очень спорная опциональная история, которая звучит дорого, а height маска ещё и очень кастомно, потому что falloff материалов придётся хардкодить, фича может пригодиться в модах);
- Оптимизации GTAO и SSLR (я тупой, это сложно, я сам не осилю).