Облака и тени

Каждое кучевое облако в игре стоит над настоящим термиком модели атмосферы и повторяет его жизнь: рождается, растёт, живёт и рассыпается. Тень облака на земле — не декоративное пятно, а честная тень именно этой формы, и там, где она лежит, термики под ней слабее.

Кучевые облака и их жизненный цикл

Облако появляется, когда воздух термика дошёл до высоты конденсации (с задержкой, пропорциональной высоте облака и силе потока), и тает через некоторое время после того, как термик угас. Форма строится из восьми полуэллипсоидов-«башен» с широким центральным куполом и заполняется 3D-шумом (Perlin-Worley и Уорли) — это даёт клубящиеся, а не гладкие края. Мощность облака (отношение высоты к ширине) больше у переразвитых дней — кучевые облака хорошей погоды шире, чем выше, высокие башни появляются только при переразвитии.

Стадия читается по самому облаку, без подписей:

  • растущее — клочья собираются в плотное облако с чёткими «кочанными» краями, заметен рост за 1–3 минуты наблюдения;
  • зрелое — высокое, плотное, с плоским тёмным основанием; пока термик жив, основание темнее и плотнее (виден подсос);
  • распадающееся — рваное, прозрачное, с приподнятой рваной кромкой, оседает и уплывает по ветру.

Основание одно и то же по высоте для всех облаков дня (уровень конденсации). При ветре облака вытягиваются по нему и могут выстраиваться в улицы вдоль ветра; шум внутри облака сам «течёт», перенесённый ветром на высоте кромки, а форма при этом стоит над своим термиком. Слабый день — термиков сильнее cloud_min_strength_ms мало, небо почти безоблачное («голубой день»); сильный день — часть термиков переразвивается: высокие башни, растекающийся верх (подробнее об этом уровне — в разделе «опасная погода» модуля атмосферы, включая грозовые ячейки и наковальни).

Подробно про сам термик — его силу, форму потока, восходящую скорость и то, как рождается и умирает поток воздуха под облаком, — на странице Термики; здесь описана только надземная, видимая часть.

Тени облаков

Облако гасит только прямой свет солнца — рассеянный свет неба под ним остаётся, поэтому тень не превращается в чёрное пятно. Тень рисуется отдельным проходом (CloudShadowMap): небольшая карта вокруг камеры пересчитывается несколько раз в секунду, и в каждой её точке считается пропускание прямого света по формуле поглощения Бера через ту же самую плотность облака, что рисуется у него над головой. Тень поэтому в точности повторяет форму облака, включая клубы и истончённые края распадающегося, плывёт вместе с ним и тает с ним же.

Тень ложится на рельеф, траву, лес (и модели, и импостеры, и процедурные кроны), кусты и камни — все они используют одну и ту же формулу освещения, ослабленную прозрачностью облака в этой точке. Часть неба, закрытая облаком, тоже чуть темнее (рассеянный свет), но слабее, чем прямой. К краю карты тени плавно тают в дымку; под перистой пеленой верхнего яруса (если она есть) тени всех кучевых облаков бледнее — как в реальности, когда солнце уже частично рассеяно высокой облачностью.

Полутень

Тень не обрывается резкой линией: у края карты тени и на грани облака есть плавный переход (мягкое затухание), а не «ступенька» видимость/невидимость. Собственная тень солнца в игре (рельеф, деревья, крыло) тоже мягкая, с угловым размером солнечного диска — так что у объектов на границе тени облака получается настоящая полутень, а не два чётких состояния «светло» и «темно».

Термики слабее в тени

Это не только картинка: модель термиков знает о тех же зрелых облаках, что рисуются на небе, и новый термик, рождающийся в тени такого облака, слабее, чем на солнце (коэффициент ослабления в модели источников). Тень для этого расчёта — тот же диск облака, смещённый от солнца в его направлении, что и видимая тень на земле: пилот, читающий тени под собой, видит ровно то же самое разделение земли на «греется» и «не греется», что использует модель.

Границы модели

  • Тень — не глобальная карта, а окно вокруг камеры фиксированного размера: облака за его пределами тени на видимую сцену не бросают (это и не нужно — их и так не видно).
  • Плотность облака приближённая: раймарч по нескольким геометрически растущим шагам к солнцу, а не честная многократная рассеивающая симуляция — этого достаточно, чтобы основание было темнее краёв и темнее над живым термиком, но точной фотометрии не будет.
  • Разные рендер-пути дают разную цену и немного разную картинку: основной путь (Forward+/Mobile) — один общий раймарч-проход по кадру с апскейлом, путь для встроенной графики (Compatibility) — бокс на каждое облако отдельно. В Compatibility известна визуальная проблема: часть облаков делится вертикальной границей на две половины разной яркости со «ступенчатым» краем — сознательно не исправляется, целевой рендер проекта — Forward+.
  • Тень не учитывает переотражение от соседних облаков или рельефа — только прямое затенение по толщине облака над точкой.
  • Модель термика и его облако не считаются заново на каждый шаг физики — облако и его тень пересчитываются заметно реже, чем кадр, поэтому при резкой смене освещения (например, после быстрого разворота) тень может на долю секунды отстать от актуальной формы облака.

Что рассматривали и почему так

  • Декали vs аналитическая тень по карте. Раньше тени облаков рисовались декалями — плоскими пятнами под каждым облаком без честной формы и без полутени. От декалей отказались в пользу CloudShadowMap: карта считает настоящее пропускание света через ту же плотность, что и видимое облако, поэтому тень автоматически повторяет стадию жизни облака (рваная тень у распадающегося, плотная у зрелого) без отдельной ручной анимации.
  • Компромисс качество/цена. Полный волюметрический теневой проход для каждого источника света на каждый объект сцены был бы дороже, чем позволяет бюджет производительности на встроенной графике. Выбран отдельный маленький проход (SubViewport с плоской картой) с настраиваемым разрешением и числом шагов луча по пресетам качества — на мощной видеокарте это доли миллисекунды GPU за перерисовку, на слабой можно снизить разрешение карты и не терять сам принцип (форма тени всё равно настоящая).
  • Опорная плоскость под камерой, а не честная проекция на весь рельеф: карта тени строится на земле под камерой и работает корректно для рельефа любой высоты в этой области — дешевле честной трассировки тени на весь видимый рельеф и для целей полёта (тень нужна там, где пилот, а не за горизонтом) этого достаточно.
  • Compatibility-рендер не чинили специально: визуальный артефакт с разделением облака известен, но решение пользователя — считать целевым рендером Forward+, а встроенную графику поддерживать по возможности без переписывания облачного шейдера под неё с нуля.

Подробнее

Тени облаков над долиной — до и после доработки формы тени

Тени облаков над долиной — после: тень повторяет форму облака

Тени облаков с воздуха, сверху

Рябь на воде и тени облаков в облачную погоду