Как добавить эффект тумана и избежать неестественных границ на пересечениях с объектами: опыт авторов Blightbound

Для реализации этой особенности применяется техника depth fade.

Сооснователь студии Ronimo Games (Awesomenauts) Йост ван Донген опубликовал на сайте Gamasutra текст с описанием принципов техники depth fade, которая позволяет добавить эффект тумана в игру и избежать очевидных границ в местах пересечения с объектами. Также он показал несколько дополнительных примеров использования этой техники в Blightbound. Мы выбрали из текста главное.

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

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

Чтобы решить эту проблему, Донген применил технику depth fade, которая обычно используется для мягких частиц, но имеет и другие области применения. Идея техники состоит в том, чтобы в области пересечения полупрозрачная плоскость стала ещё более прозрачной. Благодаря этому возникает эффект, который по принципу своей работы похож на настоящий туман, так как объекты плавно исчезают в дымке.

На этом скриншоте плоскость тумана находится над землёй. На верхнем изображении можно увидеть чёткие границы в области пересечения объектов и плоскости тумана. На нижнем скриншоте границы сглажены при помощи depth fade
На этом скриншоте плоскость тумана находится над землёй. На верхнем изображении можно увидеть чёткие границы в области пересечения объектов и плоскости тумана. На нижнем скриншоте границы сглажены при помощи depth fade

Хитрость рендеринга с depth fade заключается в том, чтобы сначала идёт визуализация обычной геометрии — туда не входят прозрачные и полупрозрачные объекты. Это необходимо для «заполнения» буфера глубины (Z-buffer, depth buffer) — благодаря ему игра знает, как далеко от камеры находится каждый пиксель.

Затем при рендеринге объектов с depth fade пиксельный шейдер оценивает расстояние в буфере глубины и сравнивает его со своими показателями. Это помогает определить, насколько близко пиксели находятся к области пересечения объекта и плоскости тумана: чем ближе, тем выше прозрачность. Усиление прозрачности происходит до того момента, пока плоскость тумана не станет полностью невидимой в точке пересечения.

У этой техники есть ещё несколько интересных применений. Если изменить расстояние действия эффекта, то можно легко менять плотность тумана. Кроме того, объекты не должны фактически пересекаться с плоскостью тумана для применения depth fade — они могут располагаться и под ней.

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

Хоть этот метод традиционно применяется для частиц, его легко можно использовать для всех объектов с прозрачностью. Поскольку в мире Blightbound туман имеет большое значение, разработчики сделали несколько видов дымок. И техника depth fade подходит для каждого из них.

Для depth fade не требуется так много вычислительных ресурсов, как для более традиционного альфа-блендинга. При рассчёте расстояния для каждого пикселя частиц или плоскости тумана требуется всего один дополнительный look-up текстуры в буфере глубины. Если сравнивать это с более продвинутыми методами, например, voxel ray marching, то предложенная техника требует намного меньше ресурсов.

Также depth fade может помочь сделать затухание освещения более плавным. Сравните, как в одном примере свет от факела разделяется на чёткие зоны, а в другом — плавно освещает окружение

По словам Донгена, когда он реализовал depth fade в своей игре, он решил провести небольшое исследование. Он выяснил, что эта техника входит в перечень стандартных функций в Unreal Engine 4. В Unity depth fade реализована только для частиц, но её можно расширить и для других объектов.

Несколько примеров использования техники depth fade в Blightbound
8484
2 комментария