Облака и тени
Каждое кучевое облако в игре стоит над настоящим термиком модели атмосферы и повторяет его жизнь: рождается, растёт, живёт и рассыпается. Тень облака на земле — не декоративное пятно, а честная тень именно этой формы, и там, где она лежит, термики под ней слабее.
Кучевые облака и их жизненный цикл
Облако появляется, когда воздух термика дошёл до высоты конденсации (с задержкой, пропорциональной высоте облака и силе потока), и тает через некоторое время после того, как термик угас. Форма строится из восьми полуэллипсоидов-«башен» с широким центральным куполом и заполняется 3D-шумом (Perlin-Worley и Уорли) — это даёт клубящиеся, а не гладкие края. Мощность облака (отношение высоты к ширине) больше у переразвитых дней — кучевые облака хорошей погоды шире, чем выше, высокие башни появляются только при переразвитии.
Стадия читается по самому облаку, без подписей:
- растущее — клочья собираются в плотное облако с чёткими «кочанными» краями, заметен рост за 1–3 минуты наблюдения;
- зрелое — высокое, плотное, с плоским тёмным основанием; пока термик жив, основание темнее и плотнее (виден подсос);
- распадающееся — рваное, прозрачное, с приподнятой рваной кромкой, оседает и уплывает по ветру.
Основание одно и то же по высоте для всех облаков дня (уровень конденсации). При ветре облака
вытягиваются по нему и могут выстраиваться в улицы вдоль ветра; шум внутри облака сам «течёт»,
перенесённый ветром на высоте кромки, а форма при этом стоит над своим термиком. Слабый день —
термиков сильнее cloud_min_strength_ms мало, небо почти безоблачное («голубой день»); сильный
день — часть термиков переразвивается: высокие башни, растекающийся верх (подробнее об этом уровне —
в разделе «опасная погода» модуля атмосферы, включая грозовые ячейки и наковальни).
Подробно про сам термик — его силу, форму потока, восходящую скорость и то, как рождается и умирает поток воздуха под облаком, — на странице Термики; здесь описана только надземная, видимая часть.
Тени облаков
Облако гасит только прямой свет солнца — рассеянный свет неба под ним остаётся, поэтому тень не
превращается в чёрное пятно. Тень рисуется отдельным проходом (CloudShadowMap): небольшая карта вокруг
камеры пересчитывается несколько раз в секунду, и в каждой её точке считается пропускание прямого света
по формуле поглощения Бера через ту же самую плотность облака, что рисуется у него над головой. Тень
поэтому в точности повторяет форму облака, включая клубы и истончённые края распадающегося, плывёт
вместе с ним и тает с ним же.
Тень ложится на рельеф, траву, лес (и модели, и импостеры, и процедурные кроны), кусты и камни — все они используют одну и ту же формулу освещения, ослабленную прозрачностью облака в этой точке. Часть неба, закрытая облаком, тоже чуть темнее (рассеянный свет), но слабее, чем прямой. К краю карты тени плавно тают в дымку; под перистой пеленой верхнего яруса (если она есть) тени всех кучевых облаков бледнее — как в реальности, когда солнце уже частично рассеяно высокой облачностью.
Полутень
Тень не обрывается резкой линией: у края карты тени и на грани облака есть плавный переход (мягкое затухание), а не «ступенька» видимость/невидимость. Собственная тень солнца в игре (рельеф, деревья, крыло) тоже мягкая, с угловым размером солнечного диска — так что у объектов на границе тени облака получается настоящая полутень, а не два чётких состояния «светло» и «темно».
Термики слабее в тени
Это не только картинка: модель термиков знает о тех же зрелых облаках, что рисуются на небе, и новый термик, рождающийся в тени такого облака, слабее, чем на солнце (коэффициент ослабления в модели источников). Тень для этого расчёта — тот же диск облака, смещённый от солнца в его направлении, что и видимая тень на земле: пилот, читающий тени под собой, видит ровно то же самое разделение земли на «греется» и «не греется», что использует модель.
Границы модели
- Тень — не глобальная карта, а окно вокруг камеры фиксированного размера: облака за его пределами тени на видимую сцену не бросают (это и не нужно — их и так не видно).
- Плотность облака приближённая: раймарч по нескольким геометрически растущим шагам к солнцу, а не честная многократная рассеивающая симуляция — этого достаточно, чтобы основание было темнее краёв и темнее над живым термиком, но точной фотометрии не будет.
- Разные рендер-пути дают разную цену и немного разную картинку: основной путь (Forward+/Mobile) — один общий раймарч-проход по кадру с апскейлом, путь для встроенной графики (Compatibility) — бокс на каждое облако отдельно. В Compatibility известна визуальная проблема: часть облаков делится вертикальной границей на две половины разной яркости со «ступенчатым» краем — сознательно не исправляется, целевой рендер проекта — Forward+.
- Тень не учитывает переотражение от соседних облаков или рельефа — только прямое затенение по толщине облака над точкой.
- Модель термика и его облако не считаются заново на каждый шаг физики — облако и его тень пересчитываются заметно реже, чем кадр, поэтому при резкой смене освещения (например, после быстрого разворота) тень может на долю секунды отстать от актуальной формы облака.
Что рассматривали и почему так
- Декали vs аналитическая тень по карте. Раньше тени облаков рисовались декалями — плоскими пятнами
под каждым облаком без честной формы и без полутени. От декалей отказались в пользу
CloudShadowMap: карта считает настоящее пропускание света через ту же плотность, что и видимое облако, поэтому тень автоматически повторяет стадию жизни облака (рваная тень у распадающегося, плотная у зрелого) без отдельной ручной анимации. - Компромисс качество/цена. Полный волюметрический теневой проход для каждого источника света на каждый объект сцены был бы дороже, чем позволяет бюджет производительности на встроенной графике. Выбран отдельный маленький проход (SubViewport с плоской картой) с настраиваемым разрешением и числом шагов луча по пресетам качества — на мощной видеокарте это доли миллисекунды GPU за перерисовку, на слабой можно снизить разрешение карты и не терять сам принцип (форма тени всё равно настоящая).
- Опорная плоскость под камерой, а не честная проекция на весь рельеф: карта тени строится на земле под камерой и работает корректно для рельефа любой высоты в этой области — дешевле честной трассировки тени на весь видимый рельеф и для целей полёта (тень нужна там, где пилот, а не за горизонтом) этого достаточно.
- Compatibility-рендер не чинили специально: визуальный артефакт с разделением облака известен, но решение пользователя — считать целевым рендером Forward+, а встроенную графику поддерживать по возможности без переписывания облачного шейдера под неё с нуля.
Подробнее
- docs/guide/atmosphere.md — полное устройство модуля атмосферы: термики, облака, тени, опасная погода (грозы, волна, перистая пелена, пыльные вихри).
- Код облаков и теней: scripts/atmosphere/cloud_layer.gd, scripts/atmosphere/cloud_shadow_map.gd, scripts/atmosphere/cloud_common.gdshaderinc, scripts/terrain/cloud_shadow.gdshaderinc.
- Генератор шума облаков: tools/atmosphere/gen_cloud_noise.py.



