Русский
Приборы ночного видения
ПНВ использует три шейдерных профиля с разными цветом, усилением, шумом и затемнением краёв. Дополнительно прибор выводит отдельную UI-маску. Помехи электроники плавно убирают шейдерный эффект, а маска остаётся до выключения прибора.
Страница описывает текущую ветку и пакеты gamedata, gamedata_soc, gamedata_cs, gamedata_coc. Шейдерные профили, UI-маска и помехи электроники работают на R1, R2 и R4. R1 и R2 применяют шейдерный эффект в финальном проходе постобработки, R4 использует отдельный проход ПНВ. Профили с shader_effect_range = 0 сохраняют существующий PPE-эффект. Апгрейд активного шлема или костюма сразу обновляет включённый ПНВ без повторного переключения.
Предметы и профили
Шлем или костюм выбирает секцию постпроцесса через конфигурацию предмета:
ini
nightvision_sect = effector_nightvision_2Надетый шлем имеет приоритет перед костюмом, затем выбирается отдельный прибор в слоте ПНВ. Отдельный прибор тоже читает nightvision_sect; существующие проверки батареи и положения в инвентаре продолжают работать. Снятие предмета, выключение прибора или разряд батареи прекращают его эффект.
В пакетах CoP и CoC доступны effector_nightvision_1, effector_nightvision_2, effector_nightvision_3. В SoC и CS сохранены имена секций: effector_nightvision и effector_nightvision_bad используют первое поколение, effector_nightvision_good — второе.
Шейдерный профиль задаётся в configs/misc/postprocess.ltx или другом подключённом файле конфигурации:
ini
[effector_nightvision_2]
shader_effect_range = 2
shader_nvg_color = 0.4, 0.99, 0.83, 10.0
shader_nvg_postprocessing = 0.125, 0.005, 0.0125, 0.9
pp_eff_name = nightvision_2.ppe
pp_eff_cyclic = 1Существующие параметры PPE нужно сохранить для статического освещения и профилей с shader_effect_range = 0. Пример дополняет существующую секцию эффекта и не заменяет настройки PPE из конкретного пакета.
| Параметр | Значение |
|---|---|
shader_effect_range | 1, 2, 3 выбирают поколение шейдерного ПНВ. При отсутствии параметра используется 1; значения выше 3 ограничиваются до 3. 0 выбирает настроенный PPE-эффект даже при динамическом освещении. |
shader_nvg_color | Четыре числа: красный, зелёный, синий компоненты и усиление яркости. В готовых профилях заданы все четыре значения. |
shader_nvg_postprocessing | Четыре числа: сила шума, обычного мерцания, полос и смещение радиального затемнения. Без параметра используются настройки выбранного поколения. |
Готовые профили:
| Поколение | RGB | Усиление | Шум | Мерцание | Полосы | Радиальное смещение |
|---|---|---|---|---|---|---|
| 1 | 0.4, 0.9, 0.3 | 8 | 0.175 | 0.009 | 0.025 | 0.8 |
| 2 | 0.4, 0.99, 0.83 | 10 | 0.125 | 0.005 | 0.0125 | 0.9 |
| 3 | 0.8, 0.8, 0.8 | 15 | 0.075 | 0.0025 | 0.005 | 1.0 |
Шейдер переводит цвет сцены в яркость, применяет оттенок и усиление, добавляет шум и два небольших временных колебания, затем затемняет изображение к краям. Независимая UI-маска создаёт дополнительное затемнение по краям.
Цвет предмета и апгрейды
Необязательный nightvision_color в секции шлема или костюма переопределяет цвет профиля:
ini
nightvision_sect = effector_nightvision_2
nightvision_color = 0.45, 0.95, 0.7, 12.0Четвёртая компонента задаёт усиление. Значения до 1 включительно заменяются усилением выбранного поколения; значения выше 1 задают собственное усиление. Поэтому существующие цвета предметов из трёх компонент сохраняют оттенок и получают усиление своего поколения.
Без переопределения на предмете цвет берётся из shader_nvg_color текущей секции nightvision_sect. Если нет и этого параметра, используется оттенок 0.3, 1.0, 0.2 с усилением выбранного поколения. Отдельный прибор читает цвет непосредственно из секции профиля.
Апгрейды могут менять nightvision_sect. Новый профиль и его цвет выбираются при следующем включении; уже работающий эффект не заменяется на лету. Явно заданный цвет предмета сохраняет приоритет после апгрейда.
UI-маска по краям
В каждый пакет добавлена textures/hud/nvg_vignette.dds и узел в configs/ui/ui_custom_msgs.xml:
xml
<nv_tunnel x="0" y="0" width="1024" height="768" stretch="1">
<texture>hud\nvg_vignette</texture>
</nv_tunnel>nv_tunnel — custom static в единственном экземпляре, без ограничения времени жизни. Координаты используют базовое разрешение UI; растяжение заполняет текущую область вывода. При замене ui_custom_msgs.xml в моде нужно сохранить этот узел или предоставить эквивалентный. Маску можно заменить через путь к текстуре, сохранив имя узла.
Движок поддерживает маску, когда актёр жив, находится в виде от первого лица и имеет активный, логически включённый эффект ПНВ. После очистки UI-сообщений custom static восстанавливается. Выключение прибора, разряд батареи, смерть или выход из вида от первого лица снимают маску. Возврат к первому лицу возвращает её, если прибор остаётся включённым.
Помехи меняют видимость шейдерного эффекта, сохраняя включённое состояние прибора. Поэтому при полностью подавленном изображении ПНВ UI-маска остаётся, а существующее потребление энергии продолжается. ПНВ оружия и прицелов использует отдельные эффекты и не создаёт эту маску. В 3D линзе ПНВ с активным PPE-профилем scope_nightvision используется уже обработанный снимок сцены, без дополнительного усиления материала. Это предотвращает двойное применение ПНВ и пересвет линзы до белого; при отсутствии активного PPE-прохода сохраняется эффект материала. Тот же PPE-профиль действует во время появления и исчезновения обычной линзы в анимации прицеливания, поэтому яркость не переключается на более сильный эффект материала посреди перехода. Gauss сохраняет .ppe для 2D-прицела. В 3D-прицеле model_scope_gauss усиливает серое изображение, добавляет синий оттенок и шум помех электроники. Чтобы применялся только эффект шейдера, материал линзы в Lua должен указать :scope_postprocess(false). Значение true разрешает обработку снимка через PPE; при активном PPE шейдер пропускает собственное усиление и синий оттенок, сохраняя шум помех. Выбор принадлежит материалу и не зависит от имени профиля в игровом компоненте. Рамки целей по-прежнему требуют полностью завершённого приближения.
Аберрация линзы прицела
В R4 обычные, ночные линзы, линзы с переключаемой сеткой и Gauss поддерживают хроматическую аберрацию Gunslinger. Настройка сохраняет исходное имя:
ini
scope_abberation = 0.006У встроенного прицела значение берётся из секции оружия, у съёмного — из секции прицела с резервным значением из оружия. Апгрейд может переопределить этот параметр; установленное значение восстанавливается при повторной загрузке параметров прицела. При отсутствии настройки используется 0.
Красный и синий каналы изображения сцены смещаются в противоположные стороны по диагонали; сила смещения увеличивается к краю линзы. Прицельная сетка и UI накладываются после этого эффекта. Координаты учитывают размер текстуры сцены при масштабировании рендера. При нулевой силе дополнительные выборки изображения не выполняются. Параметр передаётся через существующий канал m_hud_params.z, отдельная шейдерная константа не добавляется.
Помехи электроники
ПНВ использует существующий менеджер помех электроники. Отдельное определение выброса не добавляется; поведение помех для остальных устройств не меняется.
Интерфейс рендера m_affects сохранён:
| Компонента | Передаваемое значение |
|---|---|
x | Текущий счётчик помех, делённый на 10. |
y | Случайное значение; ПНВ не использует его для мерцания при выбросе. |
z | Целевой счётчик, делённый на 10. |
w | Признак уменьшения счётчика. |
R4 получает NightVisionInterference из того же текущего счётчика, что и m_affects.x. Обычно менеджер уже изменяет счётчик плавно. Локальное ограничение скорости до 0.2 нормализованных единиц в секунду дополнительно смягчает мгновенные изменения из скриптов во время работы ПНВ; для этого ограничения длительность кадра ограничена до 0.1 секунды. При первом включении сразу учитывается текущее значение помех, чтобы прибор не показывал кратковременно рабочую картинку во время сильных помех.
Шейдер использует smoothstep(0.02, 0.4, NightVisionInterference) для перехода от полного эффекта к его исчезновению. Порогам соответствуют значения счётчика менеджера 0.2 и 4. При значении 0.4 и выше шейдер возвращает исходный цвет сцены без оттенка ПНВ, усиления, шума и шейдерного затемнения. UI-маска остаётся видимой.
Во время перехода два медленных колебания примерно 0.9 и 1.7 Гц немного уменьшают вклад эффекта. Дополнительное ослабление достигает максимум 18%, сильнее всего в середине перехода и исчезает на его концах. Эти колебания не усиливают яркость и не включают или выключают весь кадр случайным образом. Небольшое штатное мерцание профиля тоже исчезает вместе с эффектом.
При уменьшении помех эффект восстанавливается через тот же плавный переход. Повторное включение для восстановления не требуется. Если скрипт удерживает повышенный счётчик электроники, соответствующее подавление сохраняется.
Реализация и ручная проверка
Игровой эффект выбирает профиль и поддерживает логическое состояние прибора. Обновление актёра сбрасывает только поля стекла в общих параметрах шейдеров; профиль ПНВ сохраняется между этими обновлениями до следующего включения. Рендер передаёт NightVisionPostprocess и NightVisionInterference в nvg_render.ps.hlsl. Проход один раз читает цвет сцены и вычисляет шум арифметически; отдельные привязки текстур глубины и синего шума больше не нужны. Маска рисуется отдельным UI-проходом. Эти сведения о реализации не заменяют измерения производительности на GPU.
После сборки изменённого кода движка, игры и рендера и установки соответствующих конфигов, шейдеров и текстуры UI нужно вручную проверить:
- Три поколения, цвет предмета, приоритет шлема и костюма, апгрейд профиля с последующим повторным включением.
- Работающий прибор при нарастании помех, полном подавлении шейдера и восстановлении. Маска по краям должна оставаться во время подавления.
- Включение при сильных помехах и загрузку сохранения с активным выбросом.
- Ручное выключение, разряд батареи, снятие предмета, смерть актёра и переключение между первым и третьим лицом.
- Существующий PPE-путь с
shader_effect_range = 0, отдельно — ПНВ оружия и прицелов.
Связанные эффекты снаряжения: Стекло маски и капли дождя.