Атмосфера - одна из самых важных частей реалистичного рендеринга. Существуют ситуации, когда атмосфера только мешает, например, если нужно показать политическую карту мира или другие абстрактные векторные данные. Но чаще атмосфера нужна, особенно при визуализации природных явлений. Атмосфера повышает визуальную привлекательность и реалистичность картинки.

Задача ставится так: необходимо в каждой точке рассчитать цвет околоземного пространства или земной поверхности. Физика атмосферы известна давно. Свет от Солнца рассеивается на молекулах воздуха и аэрозолей в атмосфере и рано или поздно попадает на сетчатку глаза. Свет разных длин волн рассеивается по-разному. Синий - рассеивается сильнее, поэтому небо нам кажется синим.

Необходимо вычислить, какая часть изначального пучка света от Солнца рассеялась, а какая осталась и попала в глаз. Это определяется уравнением рассеяния. В это уравнение входит громоздкий интеграл, который аналитически не берется, а численное интегрирование довольно сложное. Проведение этих расчётов в реальном времени долго было недостижимой задачей. Использовались приближенные алгоритмы для 2х отдельных случаев: вид с поверхности и вид из космоса. В случае вида из космоса достаточно было просто нарисовать красивый ореол вокруг глобуса. А вот примеры алгоритмов для вида с поверхности:

  • osgEphemeris
  • steps3D - я применял его для Виртуального Физтеха

В начале 2000х годов с появлением графических процессоров и возможности их программирования с помощью языков шейдеров начались разработки по расчёту цвета атмосферы в реальном времени. Одна из первых работ в этой области принадлежит Шону О’Нилу, которая даже была опубликована в GPU Gems 2. На эту работу ссылаются многие другие авторы. О’Нил разработал алгоритм для бесшовного рендеринга атмосферы для любого положения камеры от поверхности до дальнего космоса и любого вектора направления на Солнце.

Сам алгоритм сравнительно прост. Уравнение рассеяния максимально упрощено. Все вычисления происходят в вершинным шейдере БЕЗ использования дополнительных текстур с предрассчитанными значениями (lookup tables). И тем не менее, алгоритм выдает правдоподобный результат. Рассчитывается не только цвет околоземного пространства, но и цвет самой поверхности Земли, т.к. луч света в любом случае проходит через атмосферу и рассеивается. Благодаря этому на горизонте цвет поверхности становится более синим и сливается с небом. Сравните картинки с расчётом цвета поверхности и без:

Атмосфера

Атмосфера

О’Нил выложил все исходники у себя на сайте: как основное приложение, так и GLSL-шейдеры.

Дальнейшие исследования в этой области усовершенствовали алгоритм О’Нила. Нужно отметить алгоритм Брунетона, который также выложил все исходники. Один чел из Питера даже интегрировал их в свой космический движок (вот подробное описание). Брунетон по сравнению с О’Нилом добавил учёт неровностей рельефа и учёт множественного рассеяния.

В проекте «Виртуальная Земля» я использовал алгоритм О’Нила. После отказа от Аванго и перехода на osgEarth обнаружилось, что в osgEarth уже есть класс для рендеринга атмосфера также на основе алгоритма О’Нила. Но почему-то этот класс рендерил только околоземное пространство. Поэтому Земля выглядит как на 2й картинке выше.

Я без проблем перенёс свой старый код для рендеринга поверхности с учётом атмосферы. Однако, когда встала задача сделать Землю прозрачной и показать подземные объекты (гипоцентры землетрясений), то возникла проблема. Об этом - в следующем посте.