Туман — это просто расстояние
Горы не становятся серо-голубыми сами по себе. Между ними и зрителем слой воздуха, и чем он толще, тем больше цвет горы похож на цвет неба у горизонта.
Каждый хребет — это профиль из одномерного фрактального шума: семь октав, у каждой вдвое больше узлов и вдвое меньше амплитуда. Профиль задаёт верхнюю границу слоя, а всё, что ниже, закрашивается цветом хребта.
Дымка — одна строка. Цвет слоя смешивается с цветом неба у горизонта в пропорции, которая зависит от расстояния:
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
Подсветка края — последний штрих. Верхние 2–3 % высоты ближнего слоя смешиваются с цветом солнца, и склон кажется освещённым сзади. Это работает только на ближнем плане: на дальних слоях подсветка превращается в обводку.