Volumetric fog

 

Обзор

Покажите мне человека, который бы не любил смотреть на облака. Но как их сделать в 3D? Этому мы и посвятим эту статью. Очень сложно создать настоящие облака на компьютере, возможно этому поможет спецэффект, называемый volumetric fog.

Volumetric fog - это не просто туман (затенение точки в зависимости от расстояния до нее в соответствии с какой-либо функцией), это цветные облака тумана сквозь которые можно проходить (вспомните Unreal) и которыми можно просто затенять некоторые области уровня или сцены. Они могут быть везде. В статье мы рассмотрим два пути создания этого эффекта.

Раньше туман использовался скорее не как средство украшения а как средство увеличения производительности акселераторов. На открытых пространствах можно видеть настолько далеко, что аж компьютер тормозить начинает ;). Вот программисты и нашли выход: ставили поближе заднюю плоскость отсечения, а все покрывали "толстым-толстым слоем"…. тумана. Посмотрите на Turok: за туманом еле видно пистолет в руке ;) (утрирую).

Вот после этого отступления мы и перейдем прямо к делу, то есть к нашему туману.

 

Туман из частиц

Первая идея, которая приходит в голову - сделать туман из частиц. Тут есть одно преимущество - управлять можно каждой частицей, делая туман неоднородным, физически правильным, движущимся и т.д. Однако есть и недостаток: угадайте, сколько частиц нужно будет для создания облачка тумана? Девять тысяч? Не-а. Наверное даже больше тридцати. А теперь угадайте - какой акселератор вытянет такую нагрузку? (фанатов Voodoo 3 просьба не кричать и не писать письма ;). Добавьте сюда еще то, что облачка будет, предположим, три. Придется вернуться к тем временам когда все играли в разрешении 320*240 ;).

Может кто-нибудь и сделает такую программу, но это буду не я.

 

Математически просчитанный volumetric fog

Идея проста и стара как мир: вы создаете луч, соединяющий определенную вершину или точку и позицию наблюдателя. Затем определяете, пересекает ли он куб, которым ограничена область тумана, до столкновения с твердым телом, а затем определяете цвет заданной вершины или точки в соответствии с цветом, плотностью тумана и длиной пути, пройденного лучом сквозь туман (куб).

Посмотрим как это сделано в Unreal (интервью с Tim'ом Sweeney):

"…Unreal использует карты тумана (fogmaps), которые по концепции совпадают с картами освещенности (lightmaps). Однако, карты тумана накладываются на многоугольники путем сложения, после слияния текстуры и карты освещенности. Попиксельное уравнение выглядит так:

Pixel on screen = (Pixel from texture * Pixel from lightmap) + Pixel from fogmap…

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

…Единственный метод оптимизировать процесс - использовать карту тумана низкого разрешения…"

 

Заключение

Таким образом, если забыть о возможности использования карт тумана, можно предположить, что туман создается таким способом:

  1. Сцена (или только туманные участки) разбивается на большее количество многоугольников (ломать не строить - любой квадрат можно разбить на 100 треугольников).
  2. Создается функция, которая для каждой точки создает луч, соединяющий эту точку с точкой обзора, и проверяет, не пересекается ли он с областью тумана.
  3. Если есть пересечение, он определяет плотность тумана в каждой точке (из двух - точке входа в туман и точке выхода) и расстояние между этими точками. Плотность тумана - обратная квадратичная функция относительно центра области тумана (куба).
  4. Из найденных плотности и расстояния функция определяет окончательный цвет точки.
  5. Точка и ее цвет отображаются на экране (прошу заметить, что этот путь работает только на 3D системах, интерполирующих цвета между вершинами многоугольника).

Однако этот вариант наверняка не самый лучший. Тема остается открыта. Если у вас есть материал по этому спецэффекту, наработки или просто вам есть что сказать или спросить, пишите мне.

 

Пример

Опять-таки, уже существует. Скоро будет здесь. Если кому надо - пишите. Отвечу.

Последнее обновление: 22/07/99