Post process. SSAO. Теория


Notice: Функция get_currentuserinfo с версии 4.5.0 считается устаревшей! Используйте wp_get_current_user(). in /hlds/web/u138079p19/code4life.ru/htdocs/wp-includes/functions.php on line 3840

Не смотря на свою простоту, возможности которые дает post process достаточно большие. Ярким тому примером является SSAO, который способен придать сцене реализм и глубину. В данной статье поговорим о теории.

Терминология

SSAO (screen space ambient occlusion) – это компьютерный графический метод имитации ambient occlusion в пространстве экрана на основании карты глубины. Иными словами это затенение в пространстве экрана. SSAO выполняется в post process.

AO (Ambient occlusion) – метод рендера используемый для расчетов вклада затенения каждой точки сцены, создавая таким образом более реалистичное изображение.

Краткая история

SSAO был разработан компанией Crytek для движка CryEngine 2, и впервые был использован в игре Crysis в 2007 году. Затем SSAO начали использовать многие движки, а нынче различные вариации техник имитации AO являются обязательным составляющим элементом любого трехмерного движка, который ориентирован на имитацию реального окружения.

Пример (взял отсюда):

Возможно одна из первых реализаций SSAO
Возможно одна из первых реализаций SSAO
Первая реализация SSAO в движке SkyXEngine
Первая реализация SSAO в движке SkyXEngine

Позже эффект существенно усовершенствовался, были добавлены дополнительные расчеты, повышающие качество итоговой картинки. Основным новшеством было внедрение расчетов на основании нормалей сцены — Normal-oriented Hemisphere SSAO.

Реализация

Для реализации техники необходима карта глубины (depth map) сцены в данный момент времени, при этом, значения глубины в ней могут быть как линейными, так и параболическими. Однако линейная глубина позволяет избавиться от дополнительных расчетов.  То есть, вычисления осуществляются только для той части сцены, которую видит в текущий момент камера, при этом вычисление SSAO не зависит от геометрической сложности сцены.

Для реализации необходимы пиксельные шейдеры версии 3.0, поэтому вычисления может производиться и на DirectX 9.

Этапы реализации:

  • расчет затенения
  • Depth-based blur (размытие на основании глубины)
  • смешивание со сценой

Причем два последних могут осуществляться в одном проходе.

Расчет затенения

В простом случае, который содержит множество артефактов, расчет затенения текущего пикселя производится на основании некоторого количество ближайших пикселей. Чем больше соседних пикселей подвергается проверке, тем выше качество, но тем ниже производительность.

Если глубина соседнего пикселя меньше, значит, он затеняет анализируемый, а если больше, значит, он не участвует в затенении, потому что он не может вносить вклад в затенение.

Дополнительно, необходимо рандомизировать (сделать случайной) выборку соседних пикселей. В контексте пиксельных шейдеров версии 3.0 встроенными функциями это достаточно проблематично, но можно воспользоваться дополнительной выборкой из текстуры малого размера, пиксели которой содержат случайный цвет. Обычно, размер такой текстуры 4×4 пикселя.

Стоит заметить, что после прохода расчетов затенения, изображение получается «зернистым»:

Проход расчетов затенения SSAO, движок SkyXEngine
Проход расчетов затенения SSAO, движок SkyXEngine

Depth-based blur

После получения зернистого изображения, его надо размыть и именно на основании карты глубины, чтобы не  создать новых артефактов, но лишь смягчить «зернистость».

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

Depth-based blur помогает получить более сглаженное изображение из «зернистого».

В зависимости от «зернистости» изображения расчетов затенения (предыдущий этап), и подходом Depth-based blur, может потребоваться несколько проходов Depth-based blur для получения изображения приемлемого качества.

Depth-based blur проход SSAO, движок SKyXEngine
Depth-based blur проход SSAO, движок SKyXEngine

Смешивание со сценой

Смешивание (blending) со сценой может происходить в проходе Depth-based blur, либо отдельно. Как правило, смешивание происходит путем умножения текущего цвета пикселя сцены на цвет пикселя готовой карты SSAO.

Но, некоторая часть сцены, в текущий момент, может освещаться достаточно сильным источником света, и наложение SSAO на эти участки сцены, может быть излишним (в данном случае эффект только испортит картинку). В этом случае необходимо учитывать освещенность пикселей, а также учитывать факт нахождения пикселей в тени.

Слева без SSAO, справа с SSAO. Движок SkyXEngine
Слева без SSAO, справа с SSAO. Движок SkyXEngine

В следующей статье попытаемся реализовать SSAO.

Рекомендую дополнительно почитать:

Поделиться:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*