Амбиентное освещение в играх что это
Амбиентное освещение в играх что это
Ambient occlusion (AO) — модель затенения, используемая в трёхмерной графике и позволяющая добавить реалистичности изображению за счёт вычисления интенсивности света, доходящего до точки поверхности. В отличие от локальных методов, как например затенение по Фонгу, ambient occlusion является глобальным методом, то есть значение яркости каждой точки объекта зависит от других объектов сцены. В принципе, это достаточно отдалённо напоминает глобальное освещение.
Ambient occlusion чаще всего вычисляется путём построения лучей, исходящих из точки поверхности во всех направлениях, с последующей их проверкой на пересечение с другими объектами. Лучи, достигнувшие фона или «неба», увеличивают яркость поверхности, в то время как лучи, пересекающие другие объекты, не добавляют яркости. В результате точки, окружённые большим количеством геометрии, отрисовываются как более тёмные, а точки с малым количеством геометрии в видимой полусфере — светлыми.
Ambient occlusion относится к методам, основанным на доступности элемента поверхности для различных факторов, таких как грязь, свет и т. д.. Он получил популярность благодаря относительной простоте и достаточно высокой эффективности. Часто AO также называют «sky light».
Ambient occlusion (AO) — модель затенения, используемая в трёхмерной графике и позволяющая добавить реалистичности изображению за счёт вычисления интенсивности света, доходящего до точки поверхности. В отличие от локальных методов, как например затенение по Фонгу, ambient occlusion является глобальным методом, то есть значение яркости каждой точки объекта зависит от других объектов сцены. В принципе, это достаточно отдалённо напоминает глобальное освещение.
Ambient occlusion чаще всего вычисляется путём построения лучей, исходящих из точки поверхности во всех направлениях, с последующей их проверкой на пересечение с другими объектами. Лучи, достигнувшие фона или «неба», увеличивают яркость поверхности, в то время как лучи, пересекающие другие объекты, не добавляют яркости. В результате точки, окружённые большим количеством геометрии, отрисовываются как более тёмные, а точки с малым количеством геометрии в видимой полусфере — светлыми.
Ambient occlusion относится к методам, основанным на доступности элемента поверхности для различных факторов, таких как грязь, свет и т. д.. Он получил популярность благодаря относительной простоте и достаточно высокой эффективности. Часто AO также называют «sky light».
Как работает затенение в компьютерных играх
С появлением 3D-игр у их создателей серьезно прибавилось проблем: о сглаживании мы уже говорили, также мы говорили и о фильтрации текстур. Теперь же поговорим о еще одном эффекте, который позволяет серьезно улучшить реалистичность картинки — о Ambient Occlusion (AO), или о затенении.
В оптике можно выделить три простых градации освещенности — тень (источник света не виден), полутень (источник света виден частично) и освещенное место (источник света виден полностью). Казалось бы — все просто, рассчитать границы тени и полутени можно в два счета с помощью обыкновенных лучей. Однако полученная в результате картинка наводит на мысль, что мы где-то что-то забыли:
Таких черных теней не бывает (ну на Земле по крайней мере), так что сразу становится очевидным, что мы забыли — рассеяние света: суть в том, что в реальном времени фотоны могут отражаться от различных поверхностей и в итоге попадать туда, куда напрямую фотоны от источника не долетают: именно поэтому в тени хоть и темнее, чем на свету, но не черным черно. На Земле таким «рассеивателем» фотонов выступает сама атмосфера.
Но тут возникает вопрос — а как это рассчитать-то? Увы — алгоритма, дающего 100% точное рассеяние света в real-time, нет, однако есть множество хорошо приближенных к реальности алгоритмов, отлаженных настолько, что они спокойно используются в видеоиграх.
Для начала — общая для всех алгоритмов теория: можно ввести так называемую среднюю освещенность всей сцены, своеобразную аппроксимацию непрямого освещения. Но вот проблема в том, что в местах, где есть тень, такая аппроксимация будет давать повышенную яркость. Поэтому можно несколько усложнить ее — снижать яркость в тех местах, куда отраженному свету труднее добраться. То есть для каждого фрагмента сцены мы находим так называемый заграждающий фактор: количество свободных «путей» для фотона деленное на все количество путей фотона до данного участка, и на основе этих данных и средней яркости сцены можно рассчитать яркость конкретного участка.
Однако тут мы получаем очередную проблему — отрисовка геометрии происходит постепенно, поэтому заграждающий фактор также в процессе отрисовки может серьезно меняться. Можно, конечно, рассчитать AO на этапе загрузки сцены, но тогда затенение не коснется динамических объектов (персонажей, машин и т.д.) — а это нехорошо. И тут приходит идея использовать для отрисовки затенения экранное пространство (Screen Space), что в итоге выливается в простейший алгоритм AO — SSAO.
SSAO
Этот алгоритм появился еще в Crysis 10 лет назад. Его суть проста: после построения геометрии у нас остается Z-буфер, или буфер глубины, который включает в себя абсолютно всю информацию о геометрии сцены — а значит никаких проблем сделать AO нет.
Хотя, конечно, кого я обманываю — проблемы есть, и самая серьезная — недостаточная производительность современных видеокарт: для того, чтобы получить более-менее неплохую карту затенения, для каждого фрагмента сцены нужно обсчитывать порядка 200-250 направлений, что позволяет «закопать» любой GPU. Поэтому делается хитрее — используется 8-32 «луча», направленные на выбранный фрагмент сцены, которые каждый раз поворачиваются на случайное значение. В итоге получается терпимое качество картинки с не очень большими затратами на расчеты:
В дальнейшем алгоритм был доработан — стали использоваться карты нормалей, что снизило сложность вдвое и позволило в итоге вдвое увеличить число выборок. Ну и финальный штрих — стали использовать размытие, дабы сгладить шум от случайных выборок.
HBAO и HBAO+
Nvidia не была бы Nvidia, если бы не стала развивать затенение дальше, представив в 2008 году HBAO — Horizon Based Ambient Occlusion. От SSAO это затенение отличалось тем, что оно основано на физической модели, где аппроксимируется интеграл освещенности фрагмента сцены со значениями выборки буфера глубины. Итоговое качество оказывается выше SSAO при большом числе выборок, но мы опять же упираемся в производительность. Поэтому HBAO рендерится обычно в более низком разрешении, что приводит к мерцанию картинки.
Проблема мерцания была исправлена в HBAO+ простым методом, который сейчас активно использует Sony в 4К играх на PlayStation 4 Pro: для рассчета HBAO+ используется шахматный рендеринг, то есть для обработки затенения используется часть предыдущего кадра и половина нового: это требует меньше затрат GPU, но при этом позволяет рендерить затенение в исходном разрешении, что и убирает мерцание.
HDAO
AMD в стороне не остались, и стали использовать собственное затенение (которое, к слову, также работает и на Nvidia) — HDAO (High Definition AO). Увы — AMD не делится алгоритмом, однако известно, что в его основе лежит Gather4 — технология, которая собирает 4 текселя в один регистр. То есть, как и с HBAO, по сути происходит рендеринг в пониженном разрешении. В итоге, в среднем картинка с HBAO и HDAO сравнима по качеству, но опять же — все достаточно сильно зависит от игры: к примеру, в Far Cry 3 с HDAO трава выглядит красивее:
На этом все. Советы для игроков простые: если компьютер хорошо тянет игру без AO, то можно попробовать включить SSAO или HBAO — обычно это снижает fps не более чем на 10%. Если же и с ними производительность отличная — можно попробовать HBAO+ и HDAO. Ну и для самых топовых видеокарт современности можно порекомендовать набирающее обороты VXAO — оно крайне требовательно к ресурсам (в том числе и к видеопамяти), поэтому даже в FHD оно будет доступно лишь пользователям старших Nvidia GTX 900ой и 1000ой линейки, а также владельцам старших AMD RX, Fury и Vega.
Графика в играх: окклюзия, сглаживание, фильтрация — Как и с чем её едят
Приветствую всех Стопгеймеров! Давайте начистоту, вы ведь тоже заходите в только купленную игру, но сперва кликаете на графические настройки? Кто ради чего, кому-то ради самоутверждения надо глянуть на ультра-автонастройку благодаря своему мощному «железу», а кто-то просто лезет туда ради интереса.Однако, задумывались ли вы, чем отличаются FXAA и TXAA, или 8х и 16х анизотропная фильтрация? Как-раз в этом блоге, группа Abuse Reviews сейчас вам расскажет и покажет, что же это за фильтрации такие, как они работают и с чем их едят. Поехали!
P.S.
прошлом блоге количество материала в ролике было урезано, здесь эта ошибка была учтена, очень старался для вас.Приятного просмотра)
Давайте начнём с самого-самого простого
Разрешение экрана
Мало кто не знает, что разрешение — это количество отображаемых пикселей по горизонтали и вертикали. От этой настройки также зависит качество картинки и то, как сильно будут выражены «лесенки» в переходах между разными плоскостями\поверхностями. Но почему же возникает этот графический артефакт? Дело в том, что все графические элементы в играх состоят из пикселей, но таких проблем с прямыми линиями не происходит, но стоит только чуть её наклонить, как появляются «лесенки». Возникает это из-за отсутствия плавного перехода между цветами, которое обеспечивает сглаживание, вот о нём мы сейчас и поговорим.
Сглаживание
Самое главное его предназначение — борьба с теми самыми «ступеньками», которые все так не любят. Сглаживание обеспечивает нам плавный переход между цветами, за счёт чего изображение получается куда комфортнее, устраняя «ступеньки». Да, картинка однозначно становится красивой, но всегда приходится чем-то жертвовать, а именно производительностью. За счёт появления новой задачи, процессору и видеокарте приходится рендерить(обрабатывать) все эти дополнительные оттенки, которое даёт нам сглаживание. Но, к счастью, существует много видов сглаживания, которые предоставляют нам разработчики в настройках. Их то мы сейчас и рассмотрим:
Этот вид сглаживания не слишком сильно нагружает процессор, потому что он обрабатывает лишь те части кадра, которые выглядели бы неровными, а выбирает он эти части независимо от того, где и как они располагаются. Это самый быстрый и менее затратный в плане ресурсов метод сглаживания. Отличие от прошлого метода сглаживания заключается в нескольких аспектах. В первую очередь, FXAA применяется к изображению в том разрешении, в котором вы играете, также размывает картинку сильнее, что выглядит совсем не лучше, чем MSAA, зато расходует на порядок меньше ресурсов, из-за чего этот вид сглаживания почти не вредит вашему FPS
Пожалуй, это лучший вид сглаживания, который сильно похож на MSAA, но с некоторыми дополнениями. Дело в том, что TXAA учитывает и берёт в расчёт предыдущие кадры и сглаживает последующие путём усреднения цветов.
Да, это не вид сглаживания, но избавляется от лесенок этот способ довольно неплохо, но при одном условии, которое свойственно не каждому пк. Ведь не у всех есть 2\4К мониторы, которые позволяют увеличить разрешение больше 1920х1080. За счёт уменьшения пикселей «лесенки» остаются, но становятся куда меньше, однако это влияет на производительность больше всего из перечисленных способов. Так что этот метод подойдёт только обладателям мониторов с очень высоким разрешением и мощным железом. Забавно слушать легенды о том, что если поставить 2к или 4к разрешение в игре на FullHD мониторе, то картинка станет лучше. Решил я это проверить на примере GTA V и что-то не увидел разницы до и после, ни в фреймрейте, ни качестве.
Проблем никогда не бывает мало. В этом случае нет никаких исключений, ведь кроме «ступенек» встречается такой артефакт, как разрыв картинки. Это происходит, когда ваши монитор и видеокарта пытаются работать синхронно, но по какой-то причине эти парни не могут этого сделать, причиной является частота кадров и частота обновления монитора. К примеру, вы находитесь в какой-то загруженной локации, а ваша видеокарта старается держать стабильную частоту, в то время как монитор обновляет изображение на одной и той же частоте. Если они не синхронизируются между собой, то как раз и появляется такой разрыв. И для решения этой проблемы предназначен следующий параметр:
Вертикальная синхронизация
Этот параметр заставляет работать видеокарту на той же частоте, что и монитор, однако из-за этого возникают уже другие проблемы, к примеру, частота кадров может сильно падать из-за того что в игре появляется слишком много объектов, которые приходится обрабатывать. Но и для этой беды есть решение, которое называется — горизонтальная синхронизация. Принцип действия заключается в том, что модуль, встроенный в монитор заставляет экран обновляться сразу же при получении нового кадра, что способствует идеальному совпадению частот видеокарты и монитора. Благодаря всему этому, производительность компьютера не уменьшается, а монитор и видеокарта работают максимально слаженно.
На этом о проблемах картинки и артефактах — всё
Тесселяция
Тут стоит обратить внимание на контур головы 47-го
А вот она создана не для того чтобы исправлять косяки в картинке, а улучшать её и делать более насыщенной и реалистичной. Многие из нас знают, что 3д-объекты в играх состоят из полигонов (мелких частиц). Тесселяция подразумевает разбиение полигонов на более мелкие части, чтобы генерировать больше деталей у объекта. Это особенно удобно для выделения высоты и глубины объектов. Также она способствует созданию более закругленных объектов без острых форм и углов.
Окклюзия окружения (Ambient Occlusion)
Лично я занимаюсь созданием 3д-моделей в Cinema 4D и довольно хорошо знаком с этой фичей. Она позволяет создавать искусственные тени, таким образом, в идеале, геймдизайнеры и создатели 3д-анимаций предпочитают использовать движки, поддерживающие функцию глобального освещения, которое позволяет создавать освещение идентичное реальному, а всё благодаря вычислениям точных оттенков каждого из пикселей, в зависимости от общего количества света, попадаемого на него. Знаю, что звучит это сложновато, но как же это преобразовывает картинку… словами не описать. Такое освещение очень подходит для различных кинематографичных сцен в мультфильмах или кат-сцен в играх, но это оказывает очень сильную нагрузку на железо, но на то у нас и есть окклюзия окружения, которая создаёт искусственные тени там, где они должны располагаться.
Для начала стоит разобраться с освещением в играх. В них источником света является естественное освещение, которое является упрощённой версией глобального освещения, где расположение теней зависит от того, есть ли перед источником естественного освещения какое-либо препятствие, но это даёт нам более плоские тени в меньшем количестве, чем хотелось бы. Тут и наступает триумф окклюзии окружения, ведь она определяет расположение дополнительных теней с поммощью трассировки лучшей, а именно вычисляет, сколько солнечных лучшей блокируется рядом со стоящими объектами. То есть, если один объект загораживает другой, то поверхность второго объекта, разумеется, будет находиться в тени. Впадины, углубления и тому подобное начинает больше выделяться с помощью окклюзии.В огромном большинстве случаев этот параметр уже «вшит» в графические настройки, что не позволяет включать и выключать его. Но это всё окклюзия окружения в общем. Наверняка вы все сталкивались с такими параметрами освещения как SSAO,HBAO и HDAO?
Она взяла своё начало со времён первого Crysis, благодаря компании Crytek, по-сути оно заключается в вычислении глубины каждого пикселя и пытается вычислить количество преград от каждой из выбранных точек. Алгоритм SSAO призван упростить вычислительную сложность алгоритма Ambient occlusion и сделать его подходящим для работы на графических процессорах в режиме реального времени. Вместе с тем качество результирующего изображения у SSAO является худшим, чем в первоначальном Ambient occlusion, так как SSAO использует упрощённые методики рендеринга(обработки изображения).
Имеет тот же принцип работы, что и SSAO но несколько усовершенствованный. Просто вычисления глубины производятся с большим числом выборок, но приходится жертвовать производительностью.
Одно основывается на другом. Таким же образом как SSAO отличается от HBAO, HDAO от HBAO отличается точно тем же, ну и ещё эта окклюзия была представлена нам компанией AMD.
Ну а что по кинематографичности?
Глубина резкости
Неплохо так нагружает вашу систему, но и так же неплохо придаёт картинке кинематографичности, а всё благодаря фокусу на конкретных объектах, благодаря чему, остальные объекты размываются. Но это может привнести неудобства, как например при игре в PUBG, во время выглядывания из окна (ну вы знаете, когда упираешься лицом в стену как идиот и видишь всё что происходит за ней) иногда замыливается вид в окне, а фокус идёт на стену или оконную раму. Очень раздражает. Однако кинематографичность, опять же, дарит нам положительные впечатления об игре.
Ну и последнее о чём хотелось бы рассказать
Анизотропная фильтрация
А вот этот параметр уж точно видел каждый, но далеко не все понимают как это работает. Объясню быстро и просто. Во имя сохранения FPS разработчики используют нехитрый трюк с понижением качества текстур и моделей по мере отдаления от них. Зачастую мы можем наблюдать размытие текстуры пола вдали от себя, но если мы включим фильтрацию, то границы между различными уровнями детализации размываются. Плюс такой фильтрации в том, что вы можете со спокойной душой ставить значение 16х, ведь этот параметр почти не оказывает давления на процессор и видеокарту.
Ну а на этом всё. Если вам понравился этот блог и вы узнали что-то новое, обязательно жмите на плюс, а также интересно узнать, нравится ли вам качество видеоформата, если вы его глянули? Большое спасибо вам за внимание, всем удачных каток и стабильного FPS!
Что такое 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АО встречаются в играх сплошь и рядом. Корректная реализация АО сопряжена со множеством трудностей и требует неимоверных усилий.
Если вам понравился пост, в следующей части можно обсудить производительность различных методов фонового затенения.