Под капотом: объяснение SSAO

Под капотом: объяснение SSAO

7 июл. 2020

Сегодня мы хотели бы объяснить новую графическую функцию, которую мы вводим в наши игры с обновлением 1.38. Статья очень техническая - мы попросили наших программистов помочь, и объяснение довольно сложное. Тем не менее, мы почувствовали, что, по крайней мере, некоторым людям из нашей аудитории может быть интересно ознакомиться с этим материалом - увидеть, что то, что происходит под капотом игрового движка, требует много исследований и тяжелой работы нашего команда программистов В дополнение к техническим деталям мы подумали, что предоставление контекста и объяснение компромиссов в производительности может быть полезным и важным для большинства игроков. Ярослав ака Cim (один из наших смелых и опытных программистов, работающих над улучшением графики)

Под капотом: объяснение SSAO

Резюме TL; DR приведенного ниже текста гласит, что Screen Space Ambient Occlusion - это крутая новая, но высокопроизводительная техника для обогащения рендеринга нашего игрового мира. Вам не нужно его использовать, если вы чувствуете, что он слишком сильно снижает производительность по своему вкусу, или вам может понравиться и вы можете позволить себе торговать несколькими кадрами в секунду для улучшения восприятия тени и глубины. Эффект может быть тонким, он в основном работает на уровне подсознания, но как только вы привыкнете к нему, может быть трудно вернуться назад. Это еще одна веха в нашем плане улучшений освещения / затенения, который мы сейчас выполняем, за которым последует новая обработка HDR-света и введение более нормальных поверхностей в будущих обновлениях.

Под капотом: объяснение SSAO

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

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

Под капотом: объяснение SSAOПод капотом: объяснение SSAO
Работа наших программистов над новыми технологиями SSAO / HBAO также потребовала изменений в нашем конвейере искусства и создания произведений искусства. Все 3D-модели в наших играх должны были быть повторно рассмотрены отделом по художественным работам, и любые случаи, когда любые искусственные тени и затемнения уже применялись к модели художником, были изменены. Для некоторых более сложных игровых моделей это было упрощением, которое фактически уменьшило количество треугольников в них, чтобы повысить производительность рендеринга. В какой-то степени мы обменяли часть предполагаемых будущих ручных усилий, которые потребовались бы для создания отдельных красивых 3D-моделей для алгоритмического прохода рендеринга, который объединяет теневое представление для всей сцены, помогая «укоренять» такие объекты, как здания, фонарные столбы и растительность на местности. Что такое SSAO и как это работает?

Под капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAO

Прежде чем мы начнем - обратите внимание, что SSAO является общей аббревиатурой для «окклюзии окружающего пространства экрана». Имя включает в себя все различные методы окклюзии окружающей среды (AO) и их варианты, которые работают в пространстве экрана (это означает, что они получают всю информацию во время выполнения из данных, которые отображаются на экране компьютера и в связанных буферах памяти). Есть SSAO (технология Crytek 2007, которая в основном дала общее название всем методам), MSSAO, HBAO, HDAO, GTAO, и многие другие методы, каждый из которых использует по-разному настроенные подходы, каждый из которых имеет свои преимущества и недостатки. Мы основали наш подход на методике на основе горизонта под названием GTAO, которая была представлена ​​Activision в документе 2016 года.

Часть имени ambient occlusion (AO) означает, что мы оцениваем, сколько входящего света (преимущественно небесного света, но иногда вычисляемая окклюзия применяется и к другим источникам света) перекрывается в определенном месте игрового мира. Представьте, что вы стоите на ровной поверхности - вы увидите все небо выше, поэтому окклюзия 0%, земля полностью освещается небом. Теперь представьте, что вы находитесь на дне колодца - вы увидите только небольшой участок неба, это означает, что небо закрывается почти на 100% и лишь незначительно влияет на окружающее освещение в этом колодце, и, естественно, в нем довольно темно. дно колодца. Определенный уровень внешней окклюзии в определенном месте влияет на расчеты освещения и создает затененные области в складках, дырах и других «сложных» местах.

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

Поэтому вместо того, чтобы запекать статическую информацию (которая также занимала бы много времени и места для хранения, учитывая масштаб нашей карты мира), мы хотим вычислять ее на лету, во время выполнения. Таким образом, мы можем рассчитать его также для взаимодействия с транспортными средствами, открытия мостов, анимированных объектов и так далее. Хотя есть одна загвоздка. Для такого вычислительного подхода у нас есть только данные, которые видны на экране (вспомним «экранное пространство»), поэтому, как только какая-то часть игрового мира выходит из видимой рамки, ее нельзя использовать для оценки окклюзии. Это ограничение создает различные артефакты, такие как исчезновение окклюзии на стене, первоначально вызванное объектом, который только что оказался за краем экрана и, таким образом, стал невидимым не только для вас, но и для алгоритма, поэтому он перестал вносить вклад в вычисление окклюзии.

Под капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAO
Хорошо, теперь мы знаем, что оценивать (окружающая окклюзия), и мы знаем, какие данные у нас есть (что мы видим на экране). Что мы делаем? Ну, для каждого пикселя на экране (то есть 2 миллиона пикселей в разрешении HD, умноженного на четыре (!) При 400% масштабировании!) Нашему шейдерному коду необходимо запросить значение z-буфера окружающих пикселей, пытаясь получить представление о геометрическая форма области, окружающей его. Мы можем сделать только ограниченное количество таких «отводов», поскольку резко возрастают затраты производительности при увеличении количества отводов, это операция, которая действительно облагает налогом 3D-ускоритель. Ограничение на количество нажатий, в свою очередь, влияет на точность внешней окклюзии (и в некоторых ситуациях может привести к неточностям и полосам). Представьте, что вы хотите оценить свое окружение по 2-метровой прямой линии и готовы потратить 8 нажатий, чтобы приблизиться к нему. Вы запрашиваете линию каждые 25 сантиметров, и любая деталь, меньшая, чем эта, может оказаться совершенно незамеченной, если только вам не повезет и вы не попали в нее (или не повезло, потому что вы можете пропустить ее в следующем кадре, так что окружение внезапно может измениться между кадры и вызывают мерцание). Чем дальше ваш алгоритм исследует, тем менее точным он будет. Таким образом, вам нужно ограничить размер области, которую вы анализируете, вокруг каждого игрового пикселя, что, в свою очередь, ограничивает расстояние, которое «видит» AO - поэтому он не подходит для вычисления окклюзии в больших пространствах, например, под арками моста. потому что вы можете пропустить следующий кадр, так что окружение внезапно может измениться между кадрами и вызвать мерцание). Чем дальше ваш алгоритм исследует, тем менее точным он будет. Таким образом, вам нужно ограничить размер области, которую вы анализируете, вокруг каждого игрового пикселя, что, в свою очередь, ограничивает расстояние, которое «видит» AO - поэтому он не подходит для вычисления окклюзии в больших пространствах, например, под арками моста. потому что вы можете пропустить следующий кадр, так что окружение внезапно может измениться между кадрами и вызвать мерцание). Чем дальше ваш алгоритм исследует, тем менее точным он будет. Таким образом, вам нужно ограничить размер области, которую вы анализируете, вокруг каждого игрового пикселя, что, в свою очередь, ограничивает расстояние, которое «видит» AO - поэтому он не подходит для вычисления окклюзии в больших пространствах, например, под арками моста.

Под капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAO
Мы упоминали, что методика нашего выбора основана на горизонте. Это означает, что мы не исследуем окружающую среду, снимая лучи в трехмерном мире, вместо этого мы анализируем полусферу выше / вокруг каждого пикселя, чтобы увидеть, как далеко он открывается, пока не заблокирован, сколько света пропускает окружающая геометрия используя z-буфер в качестве нашего прокси. Полушарие фактически аппроксимируется несколькими прогонами вдоль линии, повернутой вокруг данного пикселя. Если мы сможем полностью следовать вдоль этого полушария, то нет преграды. Если алгоритм выбирает значение в z-буфере, которое блокирует входящий свет, он определяет уровень окклюзии. Алгоритм оптимизирован для производительности, но его ограничение заключается в том, что как только он попадает во что-либо, даже, возможно, в небольшой объект, он прекращает дальнейшее исследование. Это может вызвать «чрезмерную окклюзию» проблема и может быть замечена как визуальный артефакт, когда какой-то относительно тонкий объект, такой как столб дорожного знака, вызывает сильную окклюзию на соседней стене. Вы можете попытаться обнаружить такие маленькие объекты и пропустить их, что, в свою очередь, может привести к «недостаточной окклюзии» на тонких уступах. Мы выбрали первое.

Под капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAO
Есть еще одно интересное и полезное свойство технологий, основанных на горизонте. В зависимости от того, какая часть полусферы выше данного пикселя перекрыта, вы можете вычислить направление, которое наименее закрыто. Степень окклюзии можно рассматривать как конус мороженого с изменяющимся углом апекса, ориентированным в этом направлении. Это направление называется «изогнутой нормалью», и мы используем его для различных вычислений света, например, для перекрытия отражения на блестящих поверхностях. Идея состоит в том, что если вы посмотрите на поверхность и направление отражения от зеркала выходит из этого конуса, мы считаем его (по крайней мере, частично) перекрытым, уменьшая интенсивность отражения. Лучший способ увидеть этот эффект - взглянуть на более крупные и круглые хромированные детали, такие как дизельные цистерны, с включенным и выключенным SSAO.

Под капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAOПод капотом: объяснение SSAO
Так что, как видите, идея не такая уж сложная, для опытного программиста в любом случае;), но здесь требуется много вычислений, что создает некоторую нагрузку на 3D-ускоритель. Итак, мы создали несколько профилей производительности, каждый из которых использует сочетание методов оптимизации:

  • Использование меньшего количества нажатий на направление - это быстрее, но позволяет AO пропускать более крупные объекты, чем при более точной выборке.
  • Репроекция результатов AO из предыдущего кадра - это позволяет нам скрыть артефакты от недостаточной выборки, но может создать ореолы, когда репроекция не удалась (когда то, что вы видите между кадрами, сильно меняется).
  • Рендеринг с половинным разрешением - уменьшает количество вычислений до 1/4, но создает менее точный AO - результат может быть слегка размытым

Мы надеемся, что вся эта информация была интересной и полезной для вас. Мы отправим вам виртуальную пятерку, если вы прочитаете эту статью до этого момента. Вы заслуживаете печенье и большую чашку горячего шоколада! Если вы все еще хотите получить более подробную информацию по этой теме, см., Например, эту ссылку [www.cse.chalmers.se].

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

Также не забывайте, что летняя распродажа Steam скоро заканчивается! Посетите нашу страницу для разработчиков.


Подписывайтесь на наши соц. сети и получайте больше новостей!


Проверить ADVEGO

Комментарии


youtube
Сайт может использовать файлы cookie для работы, улучшения сервиса и показа персональных предложений. Подробнее об этом в Политике конфиденциальности.
Продолжая использовать сайт, Вы соглашаетесь с Условиями использования и Политикой cookie.
Закрыть
licnt20A2