Туман — это просто расстояние

Горы не становятся серо-голубыми сами по себе. Между ними и зрителем слой воздуха, и чем он толще, тем больше цвет горы похож на цвет неба у горизонта.

Четыре гряды гор: ближняя почти чёрная, дальние бледнеют до цвета неба
Гребни, seed 61–64. Четыре слоя с долей дымки 0,55, 0,4, 0,2 и 0.

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

Дымка — одна строка. Цвет слоя смешивается с цветом неба у горизонта в пропорции, которая зависит от расстояния:

c = color * (1 - haze) + sky_horizon * haze

Слои рисуются от дальнего к ближнему, и у каждого своя доля дымки. Шаг не стоит делать одинаковым. Контраст сильнее падает на первых километрах, чем на последующих, поэтому разница между двумя ближними слоями больше, чем между двумя дальними.

Туман в долинах

Второй приём — полосы тумана у подножия слоя. Это гауссова полоса, которую модулирует двумерный шум, чтобы край не был ровным. Плотность 0,4–0,7: больше — и хребет за ней исчезает совсем.

band = np.exp(-((y - fog_y) / fog_h) ** 2) * (0.6 + 0.4 * noise) * k
img = img * (1 - band) + haze_color * band
Рассвет над холмами: солнце в дымке, в долинах лежит туман
Рассвет над холмами, seed 71–74. Туман лежит в двух долинах, а ближний склон подсвечен тёплой полосой по краю.

Подсветка края — последний штрих. Верхние 2–3 % высоты ближнего слоя смешиваются с цветом солнца, и склон кажется освещённым сзади. Это работает только на ближнем плане: на дальних слоях подсветка превращается в обводку.