что такое ambient occlusion map
Что такое Ambient Occlusion (AO)
Ambient occlusion – метод глобального фонового или непрямого затенения объектов.
Мягкие тени, создаваемые за счет Ambient Occlusion в различных трещинах и углублениях 3D-объектов, освещаемых в сцене непрямым освещением, визуально разделяют объекты, добавляя дополнительного реализма на рендере.
Например, Ambient Occlusion можно использовать для лучшего визуального разделения кирпичей стены, которые на самом деле не разделены. АО – это не то же самое, что и тени, отбрасываемые прямым источником света, фактически, это фейковые тени, образуемые за счет непрямого освещения, которые на рендере отбрасывают поверхность геометрии.
Если эти лучи взаимодействуют с другой поверхностью, этот участок становится темнее. Если нет – светлее. В большинстве 3D-приложений АО рассчитывается с помощью специального шейдера, который назначается на геометрию. После рендера АО-пас добавляется к изображению в редакторе для композитинга, например в Photoshop, где он дополнительно редактируется и улучшается.
Учитывая, что АО имитируется тогда, когда поверхность объекта «испускает» свет, любой объект с назначенной картой прозрачности не будет просчитываться автоматически. При этом кажется, что АО не рассчитывается, но это не так, поскольку на самом деле лучи света проходят сквозь прозрачную геометрию.
Ambient Occlusion идеально подходит для смягчения всех теней в сцене, если они чрезмерно резкие, а также для их затемнения, если светлые. При этом необходимости в создании дополнительного источника света нет, поскольку АО работает не так, как, например, Final Gather, для которого нужен источник света, испускающий лучи. Для Ambient Occlusion также характерна некоторая вариативность цвета, благодаря которой наши глаза лучше различают детали, которые в противном случае остались бы незамеченными или размытыми. Кроме того, АО идеально подходит для визуализации незатекстуренных моделей.
Советы по настройке Ambient Occlusion
При просчете Ambient Occlusion время рендера можно также сократить, если запечь АО в отдельный слой. Это особенно важно при рендере анимации, поскольку при рендере каждого компьютер будет заново рассчитывать AO, что значительно замедляет время рендера.
Если при рендере на АО-пасе возникают непонятные артефакты, например, излишне насыщенные или слабые тени и пр., нужно подкрутить параметр Max distance в настройках АО. Этот параметр отвечает за то, какое расстояние должны преодолеть лучи света на пути к поверхности геометрии. Чем больше расстояние, тем шире и насыщенней будут тени. Увеличение расстояния также увеличит количество отбрасываемых теней. При уменьшении этого расстояния лучи проделают меньший путь, поэтому тени появятся только там, где геометрия будет расположена близко к поверхности. Экспериментальный подход – залог того, что вы достигнете желаемого результата.
Для дополнительного реализма на рендере можно также использовать непосредственно АО-пас, который можно найти в настройках рендера. Это позволит с помощью направленного источника света добавить Ambient Occlusion дополнительной направленности, а также уменьшит его зависимость от окружающей геометрии.
В некоторых случаях необходимости в рендере отдельного АО-паса нет, поскольку в некоторых материалах он встроен. В таких 3D-редакторах, как 3ds Max или Maya, АО можно найти в настройках архитектурных или дизайнерских материалов. Поэтому перед тем, как настроить отдельный АО-пас, проверьте, не встроен ли он в настройки материала.
Что такое Ambient Occlusion и зачем он нужен.
Наверняка, многие из вас наблюдали в играх настройку «фоновое затенение» (Ambient Occlusion), но, уверен, далеко не все догадываются что это такое и для чего необходимо.
Для начала, предлагаю рассмотреть освещение на фрагменте фотографии ниже:
В данном случае, храм находится в тени, тогда как прямой источник освещения в виде солнца скрыт за облаками, но мы все равно можем легко различить структуру сцены — объем, глубину, взаимосвязь между объектами.
Обусловлено это тем, что даже при рассеянном свете, далеко не все участки поверхностей освещаются равномерно, на какие-то участки падает больше лучей, на какие-то — меньше.
В местах, где на поверхность попадает меньше света из-за блокирования лучей близлежащими объектами — фронтонами, пилястрами и т.д., появляются рассеянные тени, которые привязывают близлежащие объекты друг к другу, а также придают глубины сцене.
Без рассеянных теней освещение выглядит монотонным, плоским и неправдоподобным, также теряется связь между объектами.
В старых играх, без разрушаемых строений, физики объектов и с простой геометрией сцены, для имитации фонового затенения использовали статичные карты освещения — 2D текстуры. Карты освещения заранее подготавливаются в редакторе игры и содержат информацию об освещенности объектов сцены. Данный метод подходит только для статичных сцен и неподвижных объектов, т.к. карты освещения не меняются по ходу игры.
В современных играх карты освещения используются все реже, даже несмотря на то, что в некоторых проектах вроде «Орден: 1886», они дают хорошие визуальные результаты. Обусловлено это тем, что карты освещения высокого разрешения, необходимые для реалистичного отображения детализированной геометрии, занимают большие объемы видеопамяти, ввиду чего, подходят больше для закрытых, относительно небольших игровых сцен, тогда как нынче в моде игры с гигантскими открытыми мирами. Кроме того, карты освещения накладывают ограничения на разрушаемость, физику, изменение освещения сцены и прочие игровые аспекты.
По вышеназванным причинам, в современных играх все чаще целиком отказываются от статичных карт освещения в пользу более динамических и комплексных методов, совместимых с разрушаемостью и подвижными объектами, а также позволяющих легко изменять освещение сцены в режиме реального времени. Одним из таких методов является фоновое затенение в экранном пространстве, о котором мы и будем говорить далее по тексту.
В играх, фоновое затенение симулирует вышеупомянутое преграждение света близлежащими объектами, добавляя в сцену рассеянные тени.
В случае растеризации, все объекты выводятся и обрабатываются независимо друг от друга, поэтому просто так АО в трехмерном пространстве геометрии не сделать, а выполнять отдельный проход с трассировкой путей не позволяет производительность текущего железа. По этим причинам, для аппроксимации фонового затенения в играх используется буфер глубины — растровое изображение (буфер кадра) с уже отрисованной сценой, в котором, вместо цвета, в каждом пикселе хранятся значения расстояния от камеры до точки поверхности какого-либо объекта сцены.
Выглядит буфер глубины так, чем темнее цвет, тем ближе пиксель к камере:
Отсюда и название целого класса методов — Screen Space Ambient Occlusion (сокр. SSAO), или фоновое затенение в экранном пространстве.
Существует множество вариаций фонового затенения в экранном пространстве — BTAO (Broad Temporal Ambient Obscurance), LSAO (Line-Sweep Ambient Obscurance), SSBC, HMSSAO, большая часть которых использует небольшое число сэмплов, простые эвристики для устранения артефактов и ориентированы на слабые машины.
Но сегодня речь пойдет о самых передовых и инновационных технологиях фонового затенения на ПК, оптимизированных для работы с большим числом сэмплов и имеющих сложные эвристики для предотвращения графических артефактов, таких технологиях, как HBAO+ (улучшенный Horizon Based Ambient Occlusion ) и VXAO (Voxel Ambient Occlusion).
Для начала рассмотрим простейший случай SSAO. Благодаря буферу глубины, который выступает как 2.5D поле высот, в пиксельном шейдере — программе граф. конвейера, позволяющей изменять цвет пикселей, можно определить насколько тот или иной пиксель сцены затенен близлежащими объектами.
Самый простой способ определить степень затенения в исходной точке объекта (пикселе) — создать тестовые сэмплы с произвольными локациями в пределах заданного радиуса внутри полусферы, после чего сравнить таковые по глубине со значениями пикселей буфера глубины (изображены как серый рельеф на изображениях ниже), если значение сэмпла меньше значения пикселя буфера глубины, то сэмпл находится внутри геометрии, иначе — вне геометрии:
На срезе полусферы выше (вид: поле высот), P — исходная точка объекта (исходный пиксель буфера глубины), n — нормаль в исходной точке, серый рельеф — геометрия (поле высот), представленная значениями пикселей буфера глубины в окрестности точки P, красные квадраты — сэмплы, вносящие вклад в затенение исходного пикселя (близлежащие объекты внутри искомого радиуса), зеленые квадраты — сэмплы, не вносящие вклад в затенение исходного пикселя (пустое пространство).
Затенение в исходной точке тем сильнее, чем больше сэмплов попадает на соседние объекты, сила затенения легко регулируется при помощи доп. коэффициентов.
При большом числе сэмплов можно увеличивать радиус поиска, не жертвуя качеством и стабильностью изображения в динамике, что делает картинку более реалистичной, а переходы в освещении более плавными.
С небольшим числом сэмплов, радиус поиска ограничен, а переходы между поверхностями резкие и неправдопобные.
^^^ Сцена без фонового затенения.
^^^ Сцена с HBAO+ с 32 сэмплами на пиксель
Как можно заметить, сцена с HBAO+ значительно ближе по освещению к фотографии выше, рассеянные тени и плавные переходы тонов дают лучшее представление о структуре сцены, так, благодаря фоновому затенению, становится понятно, что храм стоит на поверхности, также появляется связь между отдельными архитектурными элементами. Более того, с АО, становятся заметны мелкие монотонно освещенные детали, такие как окна.
Наилучшее качество фонового затенения на сегодня обеспечивает HBAO+ и AO методом трассировки лучей в экранном пространстве, но только первый метод достаточно быстрый для использования большого числа сэмплов.
По сравнению с другими методами, такими как SSBC в FarCry 4 с 12 сэмплами на пиксель, HBAO+ с 36 сэмплами обеспечивает значительно более качественное затенение.
Видно, что рассеянные тени реалистичнее с HBAO+, без резких переходов в освещении, свойственных более простым методам. Также обратите внимание на подушки, благодаря большому радиусу поиска с 36 сэмплами, тень не исчезает за подушкой как в случае с 12 сэмплами SSBC. Переключив внимание на другие детали, можно заметить, что стена за шторой справа корректно затеняется с HBAO+ и не затеняется с SSBC, тогда как хорошо освещенная штора слева лишена бандинга и затенена в меньшей степени с HBAO+, который, согласно физически корректной модели, учитывает прямое освещение при затенении.
Консольные методы SSAO зачастую работают с буфером глубины в половинном разрешении, компенсируя недостатки в виде мельтешения пикселей во время движения использованием сэмплов из предыдущего кадра. Данный подход имеет свои недостатки в виде «хвостов» (остаточных следов при движении камеры), лишнего бандинга и ухудшения производительности карт в мульти ГПУ режимах с SLI, т.к. приходится копировать дополнительные буферы между картами.
Существенным недостатком большинства методов фонового затенения в экранном пространстве являются светлые силуэты вокруг персонажей и прочих движущихся объектов.
Этот неприятный артефакт возникает, когда подвижные объекты загораживают статичные. В этом случае невозможно корректно рассчитать затенение статичных объектов, т.к. шейдер работает с 2D буфером глубины, в котором присутствуют пиксели только видимых объектов и только со стороны камеры, тогда как информация об обратной стороне геометрии, перекрытых объектах и объектах не попадающих в камеру отсутствует.
Ультра пресет HBAO+ в Assassin’s Creed: Syndicate решает и эту проблему, рассчитывая фоновое затенение в два прохода. Сначала для статичной части сцены с большим радиусом охвата АО для лучшего затенения крупных деталей строений и техники, затем для подвижных объектов с меньшим радиусом АО для лучшего затенения мелких деталей персонажей, после чего, два буфера с АО комбинируются в один финальный буфер. В результате, подвижные объекты не влияют на корректность затенения статичных объектов на заднем фоне.
Обратите внимание на затенение рядом с массовкой, только в случае Ultra опции HBAO+, рассеянные тени рассчитываются корректно для статичной геометрии за персонажами. С остальными алгоритмами и опциями, АО для статичной геометрии рассчитывается некорректно, а вокруг персонажей возникают светлые ореолы.
Другим существенным недостатком фонового затенения в экранном пространстве является локальность эффекта.
Т.к. шейдер работает с 2D текстурой буфера глубины, обратная сторона объектов в кадре и геометрия вне кадра не оказывают никакого влияния на степень затенения. Радиус поиска в пределах кадра также существенно ограничен производительностью, т.к. с ростом разрешения для покрытия той же площади кадра без ухудшения качества требуется проверять все больше сэмплов на пиксель, что приводит к нелинейному росту сложности.
Исправить эти существенные недостатки помогает VXAO — метод фонового затенения, который конвертирует полигональную трехмерную сцену в воксельную сетку при помощи аппаратных возможностей чипов на архитектурах Максвелл, Паскаль и Вольта, таких как консервативная растеризация и мультипроекция, ускоряющих процесс вокселизации более чем в 3 раза.
После чего, воксельная структура данных, будь то разреженное воксельное октодерево, 3D текстура или что-то еще, используется для высокопроизводительной трассировки конусами. С позиции каждого пикселя экранного буфера глубины трассируется до 16 конусов по всем направлениям трехмерной воксельной сетки.
В результате, даже если стена или потолок не попали в кадр, они по прежнему будут вносить вклад в освещение, обратная сторона крупных объектов также учитывается. На последнем этапе, слой буфера кадра с глобальным затенением после VXAO комбинируется со слоем локального затенения после HBAO+ для обеспечения максимального качества.
Сразу видно, что сцена стала более объемной, под стулом и столом появились рассеянные тени, которые не по силам методам в экранном пространстве из-за ограниченного радиуса охвата и отсутствия информации об обратной стороне геометрии. Освещение в ящиках, на потолке и под досками на полу стало контрастнее, комплекснее и правдоподобнее.
В отличие от методов в экранном пространстве, работающих с 2D буфером глубины, АО в трехмерном пространстве вокселей не зависит от положения камеры относительно поверхностей объектов, поэтому фоновое затенение никуда не пропадает как ни верти камерой. Ну и т.к. это глобальное фоновое затенение, учитывающее всю сцену, воксельный АО не мерцает, не шумит, не исчезает на краях экрана и не производит прочие артефакты свойственные локальному фоновому затенению при небольшом числе сэмплов.
Тем не менее, из-за ограниченного разрешения воксельной сетки, для воспроизведения локального фонового затенения на мелких объектах, таких как камни, трава и т.д., VXAO по прежнему используется совместно с HBAO+.
Забавные картинки напоследок, да, такие артефакты SSАО встречаются в играх сплошь и рядом. Корректная реализация АО сопряжена со множеством трудностей и требует неимоверных усилий.
Если вам понравился пост, в следующей части можно обсудить производительность различных методов фонового затенения.
Да прибудет с Вами Ambient Occlusion!
Да прибудет с Вами Ambient Occlusion!
Очень краткая информация об АО
Как это делается
Часть 1. Плагины и скрипты
Судя по тому, что для просчёта АО написаны плагины и скрипты, актуальность быстрого результата в среде CG специалистов значительно востребовано.
Occlusion Pass Generator
VRay ambient occlusion
После установки можно работать (даже не нужно перезапускать МАКС)
Установите vRay активным рендером и вызывайте скрипт.
Больше ничего делать не нужно))) Скрипт не изменяет в сцене НИЧЕГО!
Выставляем предпочитаемые настройки и жмём «Render»
Чуть подробнее об опциях. Как вы видите, настроек меньше чем в OPG, да и нет вкуснятинки в виде сохранения бампа\дисплейса\опэсити ваших материалов.
Зато есть два метода просчёта 🙂
Часть 2. Вручную (handmade)
vRay Renderer
Mental Ray Renderer
Default Scanline Renderer
Часть 3. Немного о постобработке
Уроков на тему постобработки предостаточно, но всёже внесу свою ржавую пятикопеечную монету. Хотя бы для того, чтоб показать куда же его, АО, помимо жёсткого диска, можно пристроить.
Не мудрствуя лукаво, открываем в фотошопе нашу картинку и нашу АО. Создаём новый слой в файле картинки, копируея в него АО.. Используя диалог blending mode изменяем смешивание (blend) Normal на Multiply. Смотрим результат. При необходимости уменьшаем прозрачность (opacity) На этом можно и остановиться. Но давайте добавим ещё красоты.
Копируем слой с картинкой (background) в новый слой и располагаем его над слоем с АО (чтоб слегка сгладить затенения там, где они слишком затеняют)
Идём Filter\Blur\Gaussian blur, замуливаем со значением от 2 до 5, меняем смешивание Normal на Overlay. Любуемся результатом, и, при необходимости, регулируем прозрачность.
Разница чувствуется, правда? Картинку можно ещё долго мучать в фотошопе, вот вы этим и займётесь, на досуге. потом. если захотите)))
Фотошоп, к слову сказать, не единственное средство. Любой редактор растровой графики с возможностью смешивания слоёв, и результат уже зависит лишь от вас. Ну а если вы считали не статику, тогда и в вашей любимой монтажке (Fusion, After Effect, Autodesk Combustion, Shake, Nuke и подобные им) найдётся инструменты, ведь верно?
Спасибо за внимание! И да прибудет с Вами АО.
Ambient Occlusion Volumes для прожженных самоваров
Скитаясь по интернету в поисках алгоритмом освещения, которые бы удовлетворили мои потребности, я наткнулся на весьма новый алгоритм, разработанный компанией NVIDIA, название которого AOV (Ambient Occlusion Volumes). Имея в своём распоряжении тёмные осенние ночи и несколько чашек горячего кофе, я решился изучить данный алгоритм, следствием чего является данная статья. Прежде чем я начну, хотелось бы отметить своё удивление по поводу того, что данный алгоритм имеет незаслуженно малую популярность в кругах разработчиков игр, в отличии от всеми знакомого нам SSAO. Содержание данной статьи будет, по большей мере, состоять из теории.
Введение
В июне 2010 года Morgan McGuire, исследователь и разработчик компании NVIDIA, разработал алгоритм освещения, который носит название Ambient Occlusion Volumes. При разработке данного алгоритма, M. McGuire, ставил себе в цель добиться более высокой производительности и качества освещения. Производительность алгоритма, по словам разработчика, во многом независима от сложности моделей, а по качеству освещения не уступает Ray Tracing’у.
Немного об Ambient Occlusion
Но при расчете таким алгоритмом возникают некие трудности. Через некоторое время на замену старому алгоритму пришёл SSAO(Screen Space Ambient Occlusion) от разработчиков компании Crytek. Сам алгоритм работал по такому принципу, что определяется некая сфера и в диапазоне этой сферы случайно отбираются точки после чего идёт проверка глубин(прежде записанных в буффер глубин) этих точек с той, для которой мы вычисляем затенение. Если глубина последней больше за глубину случайной точки, то она — затенена, а иначе, соответственно, освещена. Выполняется несколько таких проверок, после чего их результаты суммируются и вычисляется коэффициент затенения. Выглядит оно, примерно, так:
Благодаря своей простоте и, сравнительно, маленькой нагрузке, этот алгоритм стал излюбленный у многих разработчиков игр. Однако, он имеет кучу недостатков. Основная проблема этого алгоритма заключается в том, что при проверке глубины, выбранная точка может оказаться за гранью объекта который перекрывает проверяемую точку. Это приводит к тому, что точка будет считаться освещённой.
Далее мне бы хотелось рассмотреть еще одну немаловажную тему перед тем как будет описан AOV метод.
Radiosity
Многие из тех, кто знаком с названым методом нахмурились бы услышав данный метод в контексте Ambient Occlsuion. В действительности, эти методы тесно связаны друг с другом.
Если вы уверенны в своих знаниях, у вас есть возможность пропустить данный раздел и перейти к следующему. Между тем, мне бы хотелось коротко пройти по этой теме.
Метод radiosity, так же известный как метод излучательности, является одним из методов GI, который опирается на расчёт форм-факторов(form-factors), которые, в свою очередь, описывают обмен энергией между парами плоскостей в окружающей среде.
Если коротко, форм-факторы представляют собой некую часть энергии, которая излучается из одной плоскости и принимается другой. При расчёте форм-фактора учитывается расстояние между центрам плоскостей и углом поворота относительно друг друга.
Вычисляется форм-фактор таким образом:
где θi,j — угол между нормалью плоскости и Ri,j,, dA1,2 — дифференциальная область плоскости, Ri,j — вектор расстояния между dA1,2. В данном уравнении HID равно единице, если dA1,2 видимы друг для друга и ноль, если наоборот.
На расцвете данного метода использовались два подхода: Full Matrix Radiosity и Progressive Refinement Radiosity.
Full Matrix Radiosity
Суть данного подхода заключается в том, что окружающая среда дискретизирована в маленькие плоскости. Для каждой пары плоскостей вычисляется форм-факторы. После, форм-факторы используют для создания системы уравнений, которая устанавливает связь между плоскостями в окружающей среде. Решив эту системы, мы получаем интенсивность света, которую излучает плоскость. Однажды просчитав интенсивность, окружение может быть представлено в любом положении без дополнительных расчётов освещения.
Интенсивность света, который излучает плоскость вычисляем таким способом:
Данный подход был неплох, но не позволял добиться детального и точного изображения. К тому же, он становился очень дорогим, когда на сцене присутствовало большое количество плоскостей.
Позже, этот метод был усовершенствован путём разбиения плоскостей на патчи(фрагменты), а в свою очередь каждый патч разбивался на элементы. Таким образом, мы получали более детальное изображение.
Форм-фактор от патча к патчу вычисляется так:
где Ei — количество элементов в патче, Fej — форм-фактор от элемента e к патчу j, Ai,e — области патча и элемента.
Progressive Refinement Radiosity
Данный подход основан на предыдущем. Особенность данного подхода состоит в том, что после каждой итерации происходит перерасчёт, а именно инкремент значения излучательности плоскости. Рассчитывается оно таким образом:
где Ii — уже просчитанное значение излучательности.
Проблемой данных подходов является сложность расчётов даже при простых формах объектов. Чтобы вычислить форм-фактор плоскости нам нужно произвести два раза интегрирование, не говоря уже об лишних расчётах. На решение этой проблемы пришёл Hemi-Cube Radiosity.
Hemi-Cube Radiosity
HC имеет схожесть с алгоритмом Nussalt Analog. Суть его была в том, что вокруг точки на плоскости размещается так называемая проекционная полусфера с единичным радиусом. Другая плоскость проецируется на эту полусферу и размещается на базе полусферы. Таким образом форм-фактор будет равен отношению области спроецированной плоскости в базе полусферы к области самой базы полусферы. Алгоритм HC в своей реализации использует, как вы уже могли догадаться, полукуб.
Стороны полукуба разбиваются на набор небольших дискретизированных плоскостей(hemi-cube pixels), каждая из которых имеет свой предрассчитанный форм-фактор. Когда вторая плоскость проецируется на полукуб, сумма форм-факторов дискретных областей на которых была спроецированна плоскость будет равна значению форм-фактора от точки на первой плоскости до второй плоскости.
К сожалению, данное решение имело ряд своих недостатков, что и стало причиной новых исследований в этом направлении. Если начать описывать недостатки данного метода, то статья сильно затянется, а нам этого ненужно.
Ambient Occlusion Volume
Во время разработки метода radiosity, Baum D.R. предложил такой метод вычисления форм-фактора:
где Gi — набор граней плоскости, Nj — нормаль дифференциальной плоскости j, Гg — величина равная углу гамма и направлению полученного при векторном произведении Rg и R(g+1), как показано на рисунку снизу:
M. McGuire вдохновился данным подходом и на основе последнего придумал AO алгоритм. Описывал он его так:
Пусть X будет очень маленьким патчем гладкого многообразия. Центроид X будет в точке, которая является началом нормали n. Полигоном P будет полигон с вершинами
Реализация AOV’s
В данном разделе, я попытаюсь рассмотреть реализацию данного алгоритма с точки зрения теории. Для работы с данным алгоритмом нам всё так же понадобиться буффер глубины и нормалей. Следующие операции будут происходить в геометрическом шейдере.
Рассмотрим выпуклый полигон P с вершинами