Ambient Occlusion Volumes для прожженных самоваров
Скитаясь по интернету в поисках алгоритмом освещения, которые бы удовлетворили мои потребности, я наткнулся на весьма новый алгоритм, разработанный компанией NVIDIA, название которого AOV (Ambient Occlusion Volumes). Имея в своём распоряжении тёмные осенние ночи и несколько чашек горячего кофе, я решился изучить данный алгоритм, следствием чего является данная статья. Прежде чем я начну, хотелось бы отметить своё удивление по поводу того, что данный алгоритм имеет незаслуженно малую популярность в кругах разработчиков игр, в отличии от всеми знакомого нам SSAO. Содержание данной статьи будет, по большей мере, состоять из теории.
Введение
В июне 2010 года Morgan McGuire, исследователь и разработчик компании NVIDIA, разработал алгоритм освещения, который носит название Ambient Occlusion Volumes. При разработке данного алгоритма, M. McGuire, ставил себе в цель добиться более высокой производительности и качества освещения. Производительность алгоритма, по словам разработчика, во многом независима от сложности моделей, а по качеству освещения не уступает Ray Tracing’у.
Blender Ambient Occlusion | Blender’s Secret for more Realism
Немного об Ambient Occlusion
AO(Ambient Occlusion) является приближённым к GI(Global Illumination) алгоритмом, призванным к затенению пространств, на которых, фактически, не падают лучи света по причине того, что данные пространства условно перекрываются другими объектами, делая недоступным попадания лучей света к этому пространству. Сам алгоритм работает путём вычисления лучей, исходящих из точки, затенение которой мы проверяем, с последующей проверкой на пересечение объекта лучом. Если луч проходит без препятствий, то данная точка освещена, иначе — затенена.
Но при расчете таким алгоритмом возникают некие трудности. Через некоторое время на замену старому алгоритму пришёл SSAO(Screen Space Ambient Occlusion) от разработчиков компании Crytek. Сам алгоритм работал по такому принципу, что определяется некая сфера и в диапазоне этой сферы случайно отбираются точки после чего идёт проверка глубин(прежде записанных в буффер глубин) этих точек с той, для которой мы вычисляем затенение. Если глубина последней больше за глубину случайной точки, то она — затенена, а иначе, соответственно, освещена. Выполняется несколько таких проверок, после чего их результаты суммируются и вычисляется коэффициент затенения. Выглядит оно, примерно, так:
Благодаря своей простоте и, сравнительно, маленькой нагрузке, этот алгоритм стал излюбленный у многих разработчиков игр. Однако, он имеет кучу недостатков. Основная проблема этого алгоритма заключается в том, что при проверке глубины, выбранная точка может оказаться за гранью объекта который перекрывает проверяемую точку. Это приводит к тому, что точка будет считаться освещённой.
Далее мне бы хотелось рассмотреть еще одну немаловажную тему перед тем как будет описан AOV метод.
Radiosity
Многие из тех, кто знаком с названым методом нахмурились бы услышав данный метод в контексте Ambient Occlsuion. В действительности, эти методы тесно связаны друг с другом.
Ambient Occlusion (and Ambient Light) for Painters
Если вы уверенны в своих знаниях, у вас есть возможность пропустить данный раздел и перейти к следующему. Между тем, мне бы хотелось коротко пройти по этой теме.
Метод 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
Суть данного подхода заключается в том, что окружающая среда дискретизирована в маленькие плоскости. Для каждой пары плоскостей вычисляется форм-факторы. После, форм-факторы используют для создания системы уравнений, которая устанавливает связь между плоскостями в окружающей среде. Решив эту системы, мы получаем интенсивность света, которую излучает плоскость. Однажды просчитав интенсивность, окружение может быть представлено в любом положении без дополнительных расчётов освещения.
Интенсивность света, который излучает плоскость вычисляем таким способом:

где pi -коэффициент отражения плоскости i; Fij — форм-фактор из плоскости i к плоскости j; Ii — raidosity плоскости i; Iei — интенсивность излучения плоскости i; N — количество плоскостей которые находятся в окружении.
Данный подход был неплох, но не позволял добиться детального и точного изображения. К тому же, он становился очень дорогим, когда на сцене присутствовало большое количество плоскостей.
Позже, этот метод был усовершенствован путём разбиения плоскостей на патчи(фрагменты), а в свою очередь каждый патч разбивался на элементы. Таким образом, мы получали более детальное изображение.
Форм-фактор от патча к патчу вычисляется так:

где 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 будет полигон с вершинами , который полностью расположен на позитивной части плоскости, при условии p*n > 0. Таким образом, преграждение лучей света, создаваемое полигоном P, будет равно форм-фактору излучательной способности между P и X.

где j = (i+1) mod k.
Реализация AOV’s
В данном разделе, я попытаюсь рассмотреть реализацию данного алгоритма с точки зрения теории. Для работы с данным алгоритмом нам всё так же понадобиться буффер глубины и нормалей. Следующие операции будут происходить в геометрическом шейдере.
Рассмотрим выпуклый полигон P с вершинами , которые при любой комбинации из 3-х вершин не создают коллинеарности. Сперва, нам нужно рассчитать затухающую функцию, которая нам понадобиться чтобы добиться плавности при переходах от near- к far-field освещению. Вычисляется она таким образом:


Выглядит оно таким образом:

Следующим пунктом в нашей реализации будет построение объема вокруг нашего полигона.
Чтобы это сделать, нам нужно рассчитать вектор смещения, который понадобиться для смещения вершин нашего объема относительно вершин полигона.
Хочется внеси еще один новый термин, который называется obscurance. Он отвечает за затухание эффекта перекрытия со сменой расстояния.
Вектор смещения мы получаем таким образом:

где δ является тем самым obescurance на максимальной дистанции.

И последним нашим шагом будет произведение затухающей функции( g ) на перекрытие полигоном P ( AOp(n) ). Так же, после всех операций следует применить т.н. blending.
После всего написанного здесь было бы грехом не приложить скриншоты, которые продемонстрируют работу AOV алгоритма. Эти скриншоты были сделаны компанией NVIDIA, а демо можно найти внизу статьи(опять же от NVIDIA).


Для сравнения с Ray Tracing’ом:

Заключение
Мы рассмотрели довольно непростой способ AO. Многие могут остаться недовольны, так как, вероятнее всего, жаждали увидеть реализацию в виде кода. К сожалению, слишком много информации вышло бы лишь для одной статьи. Впрочем, те кто загорелся желанием реализовать данный метод, может копнуть вглубь демо от NVIDIA, которое я приложу снизу.
P.S. У меня есть убедительная просьба к вам, дорогие читатели. Если вы нашли то, что мной описанный метод в некоторых местах является неправильным или просто есть ошибки в плане языка, сообщите мне, попытаюсь исправить все свои недочёты. Если у вас есть потребность увидеть данный алгоритм в виде кода, я попытаюсь выделить время и сделать демо.
Литература
Мной было прочитано достаточное количество источников, но основной упор я делал именно на эти паперы:
— M. McGuire «Ambient Occlusion Volumes»
— «Improving radiosity solutions through the use of analytically determined form-factors»
Также хочу отметить, что большинство изображений было взято из последнего папера.
Источник: habr.com
HBAO в играх — что это такое?

Приветствую всех)) Мне нравится что производители видеокарт не только улучшают их аппаратно, но и программно, создавая разные технологии для улучшения картинки в играх, пытаясь выжать все из железа)) Вот например вы играете, все нормально, а тут выходит новая версия драйверов, в которых есть новая функция улучшения графики! такой себе бесплатный приятный бонус))
HBAO в играх — что это значит?
HBAO расшифровывается как Horizon Based Ambient Occlusion, это метод затенения, отличающийся от SSAO тем, что основано на физической модели, где аппроксимируется интеграл освещенности фрагмента сцены со значениями выборки буфера глубины (понятного конечно мало). В итоге качество выше чем SSAO, но кушает ресурсов тоже больше. Поэтому HBAO рендерится обычно в более низком разрешении, что в итоге приводит к мерцанию картинки.
Проблема мерцания была исправлена в версии HBAO+ (но видюху требует от GTX 660 и выше), кстати этот способ используется и в 4K играх на Sony PlayStation: в HBAO+ используется шахматный рендерниг, то есть для обработки затенения используется часть предыдущего кадра и половина нового, в итоге нагрузка на видеокарту меньше, но при этом рендеринг происходит в исходном разрешении, поэтому мерцания нет.
Вот пример как работает технология в деле:

HBAO создает мягкие и реалистичные контактные тени, может и правда улучшить графику. Но как мы уже выяснили — кушает ресурсы, поэтому может быть просадка FPS.
HBAO больше подходит для видеокарт NVIDIA, а для AMD лучше использовать HDAO, в то время как SSAO — самый легкий режим в плане использования ресурсов.
Что лучше ставить? Вопрос сложный. Идеально это ставить Fraps и тестировать FPS))
Затенение HBAO+ входит в набор технологий NVIDIA GameWorks.
Давайте посмотрим на эффект HBAO+, вот скрин из игры, тут ничего нет:

А здесь уже включена технология HBAO+:

Вот еще интересный пример сравнения технологий:

Еще узнал, что SSAO доступен при DirectX 9, а вот в DirectX 11 уже будут доступны HBAO и HDAO. Вывод — все еще зависит от версии DirectX.
Здесь мы уже четко видим преимущество HBAO+:

NO AO — значит затенения нет вообще.
Заключение
- HBAO в играх — эффект затенения, режим требователен к ресурсам, повышает качество графики. Но правда читал что иногда при включенном режиме свет бывает какой-то неестественный.
- Включить или нет? Если у вас мощная видеокарта — то стоит пробовать, а вообще FPS может стать немного ниже. Нужно тестировать во Фрапсе.
- И стоит помнить, что первоначально HBAO создала NVIDIA, поэтому этот режим лучше включать на их видеокартах, а вот для AMD лучше HDAO.
Удачи и добра, надеюсь кому-то информация пригодилась!
Источник: virtmachine.ru
Ambient Occlusion что это в играх
Когда-то давно, в 2000 году, текстуры и количество полигонов были важными краеугольными камнями того, что можно было считать «хорошей графикой».
Но они были быстро доведены до предела и служили лишь ступенькой к истинно фотореалистичным играм. Наиболее важным аспектом фотореализма, как выяснили разработчики, было освещение. И хотя рендеринг теней персонажей в режиме реального времени не был слишком сложным, каждый дюйм игровой среды подвергался естественному освещению — это совершенно другое дело.
Что делает модель затенения?
Как уже упоминалось выше, окклюзия окружающей среды обеспечивает более реалистичное окружающее освещение, вычисляя, насколько яркими определенные части экрана должны быть основываясь на геометрии.
В принципе, он определяет, сколько света должно быть «заблокировано» определенной частью окружающей среды.

Виды моделей затенения
Наиболее распространенный тип затенения это SSAO или преграждение окружающего света в экранном пространстве. Это наименее требовательный из всех типов окружающего окклюзии, хотя фактическое качество эффекта может сильно варьироваться от игры к игре в зависимости от того, насколько хорошо он был реализован разработчиками.
Помимо SSAO, есть и HBAO и HDAO. Эти две технологии принадлежат Nvidia и AMD соответственно, и, таким образом, лучше работают каждый на своей графической карте. Эти два типа AO (Ambient Occlusion) довольно похожи, оба предлагают более качественную модель затенения окружающей среды, но с более высокой производительностью. Однако они не так часто реализуются в играх, как SSAO.
И, наконец, есть также недавно введенный VXAO (voxel ambient occlusion), который также был разработан Nvidia в качестве преемника HBAO, хотя он немного более требователен по сегодняшним стандартам, и только высококачественные графические процессоры могут в полной мере использовать его.

Стоит ли вам использовать модель затенения?
Раньше, когда она была представлена в игре Crysis в 2007 году, SSAO был чуть тяжелее для большинства GPU того времени. Однако сегодня негативное влияние на производительность практически не заметна из-за передовых архитектур GPU, используемых в современных видеокартах.
Таким образом, даже если вы хотите выжать как можно больше дополнительной производительности, вам лучше отказаться от других более требовательных настроек.
Что касается того, какой тип окружающей окклюзии использовать, ответ простой — всегда используйте расширенные типы моделей затенения, если они доступны, и если ваш GPU может их обрабатывать. Это означает HBAO, HBAO+ или VXAO на видеокартах Nvidia и HDAO на картах от AMD.
Если ничего из вышеперечисленного не поддерживается или если есть проблемы совместимости GPU, то SSAO всегда является хорошим вариантом. Он обеспечит более глубокое погружение в окружающую среду с минимальной нагрузкой по производительности.
Источник: ru.pickgamer.com
Ambient Occlusion (AO) – зачем он нужен и как его использовать
В сборниках текстур нередко можно встретить различные дополнительные текстуры в том числе, Ambient Occlusion (AO). Это черно-белая текстура, в которой хранятся тени от рассеянного света (своеобразная карта). Они могут подчеркнуть рельеф изображенный на основной текстуре. Данную текстуру AO использовать не обязательно, но материал без нее может смотреться более плоским.
Как использовать Ambient Occlusion
- В слот Diffuse Color помещаем текстуру Composite из раздела General. Принцип работы этой текстуры как у слоев в Фотошопе.
- В текстуре Composite в правом верхнем углу нажимаем кнопку добавить слой (Add A new Layer).
- В Layer 1 назначаем нашу обычную Diffuse color-текстуру на левый квадратик (можно просто перетащить на левый квадратик в нужном слое из папки с текстурами)
- В Layer 2 назначаем карту Ambient Occlusion на левый квадратик.
- У Layer 2 переключаем режим с Normal на Multiply.

Как использовать ambient occlusion
Готово. Результат на скриншоте.

Что такое ambient occlusion
Силу Ambient Occlusion можно ослабить с помощью настройки Opacity в Layer 2. А если вдруг AO слишком слабое, то можно создать сверху еще один такой же слой с текстурой AO.
Подробнее узнать 3D-визуализации и научится работать с графикой можно на нашем бесплатном курсе.
Источник: 3dclub.com
Что такое 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АО встречаются в играх сплошь и рядом. Корректная реализация АО сопряжена со множеством трудностей и требует неимоверных усилий.
Если вам понравился пост, в следующей части можно обсудить производительность различных методов фонового затенения.
Источник: nvpixels.wordpress.com