Постпроцессинг в играх что это

Пост-эффекты в мобильных играх

Постпроцессинг в играх что это

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

Что касается пост-обработки — её волшебное действие на фотографии было открыто задолго до появления первых компьютеров, а её математический и алгоритмический базис, созданный для цифровой обработки изображений, удачно вписался в программируемый конвейер GPU.

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

Постпроцессинг в играх что это
Слегка «освежеванный» скриншот War Robots.

Как уже было сказано выше, эта статья будет посвящена в основном оптимизации. Для тех кто не в теме — отличным вводным курсом будут книги из серии GPU Gems, первые три из которых доступны на сайте NVidia [1].

Рассматриваемые примеры реализованы на Unity, тем не менее методы оптимизации, описанные здесь, применимы к любой среде разработки.

Оптимальная архитектура пост-обработки

Существует два способа рендеринга пост-эффектов:

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

Для наглядности приведу последовательную и пакетную схемы рендеринга пост-эффектов, используемых в War Robots.

Постпроцессинг в играх что это
Последовательный рендеринг: 8 чтений, 6 записей.

Постпроцессинг в играх что это
Пакетный рендеринг: 7 чтений, 5 записей.

Пакетный рендеринг для Unity реализован в модуле Post Processing Stack [2].

Последовательность применения пост-эффектов без изменения кода изменить невозможно (но и не нужно), а вот отдельные пост-эффекты отключить можно. Кроме того, в модуле интенсивно используется встроенный в Unity кэш ресурсов RenderTexture [3], так что в коде конкретного пост-эффекта, как правило, содержатся только инструкции по рендерингу.

Ресурсы же пост-эффект запрашивает непосредственно во время рендеринга, и освобождает их по его завершению. Это позволяет организовать повторное использование ресурсов в последующих пост-эффектах, поскольку кэш удаляет только те ресурсы, которые не были востребованы в течении последних нескольких кадров.

Финальный этап в пакетном рендеринге — композиционный эффект, который комбинирует результаты всех предшествующих шагов и рендерит их при помощи мультивариантного «убер-шейдера». В Unity3D такой шейдер можно сделать при помощи директив препроцессора #pragma multi_compile или #pragma shader_feature.

В целом, Post Processing Stack нам понравился, но все же без доработки напильником дело не обошлось. Нам требовался масштабируемый модуль с возможностью добавлять или заменять пост-эффекты (включая препассы), а также модифицировать захардкоженный пайплайн, задающий последовательность рендеринга, и композиционный «убер-шейдер». Плюс ко всему в эффектах были разнесены настройки качества эффекта и его параметры на конкретной сцене.

Оптимизация fillrate

Основной метод рендеринга в пост-процессинге — это блиттинг: заданный шейдер применяется ко всем фрагментам текстуры, используемой в качестве render target. Таким образом, производительность рендеринга зависит от размера текстуры и вычислительной сложности шейдера. Простейший способ повысить производительность (а именно — уменьшение размера текстуры) сказывается на качестве пост-процессинга.

Но если заранее известно, что рендеринг необходим только в определенной области текстуры, можно оптимизировать процесс, к примеру, заменив блиттинг на рендеринг 3D-модели. Разумеется, никто не запрещает вместо этого использовать настройки viewport’а, но 3D-модель отличается от блиттинга увеличенным объемом per-vertex данных, которые в свою очередь позволяют задействовать более «продвинутые» вертексные шейдеры.

Именно так мы поступили с пост-эффектом рассеивания света от солнца [4]. Мы упростили оригинальный препасс, заменив его на рендеринг биллбоарда с текстурой «солнца». Фрагменты биллбоарда, скрытые за объектами сцены, выделялись с использованием полноэкранной маски, которая по совместительству служит нам буфером теней (подробнее о рендеринге теней я расскажу чуть позже).

Постпроцессинг в играх что это
Справа: буфер теней и маска, которая получается, если применить к нему степ-функцию. Все тексели, альфа которых меньше 1, перекрывают собой “солнце”.

Сглаживание текстуры препасса также выполняется при помощи рендеринга 3D-модели.

Постпроцессинг в играх что это

Разумеется, мы пошли до конца: финальный проход тоже сделан с помощью рендеринга 3D-модели. И в отличие от предыдущих случаев, которые при желании можно заменить блиттингом во вьюпорт, здесь 3D-модель содержит дополнительные данные (цвет вертекса), которые используются в шейдере эффекта.

Постпроцессинг в играх что это

Оптимизация динамических теней

Не смотря на вычислительную сложность пост-эффектов, динамические тени зачастую ещё более ресурсозависимы. Связано это не только с вычислительной сложностью соответствующих шейдеров, но и с тем, что для получения сглаженных теней требуется дополнительный полноэкранный проход рендеринга.

Обычно, для расчета затенения для фрагмента изображения с использованием техники Shadow Mapping’а используется фильтр PCF [5]. Однако результат без дополнительного сглаживания дает только PCF с очень большим размером ядра, что неприемлемо для мобильных платформ. Более продвинутый метод Variance Shadow Mapping требует поддержки инструкций аппроксимации частных производных и билинейной фильтрации для floating-point текстур [6].

Для получения мягких теней рендер всей видимой сцены выполняется дважды — в первый раз в offscreen-буфер рендерятся только тени, затем к offscreen-буферу применяется фильтр сглаживания, и после этого на экран рендерится цвет объектов, с учетом влияния тени из offscreen-буфера. Что приводит к двойной загрузке как CPU (отсечение, сортировка, обращение к драйверу) так и GPU.

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

Для начала рендерим изображение в промежуточный буфер в формате RGBA (1). Значение альфы — отношение яркости цвета фрагмента если бы он был в тени, к яркости без тени (2). Затем, используя command buffer, перехватываем управление в момент завершения рендера непрозрачной геометрии, чтобы забрать альфу из буфера. Далее сглаживаем (3), и модулируем сглаженные тени с цветовыми каналами промежуточного буфера (4). После этого возобновляется работа пайплайна Unity: рендерятся прозрачные объекты и скайбокс (5).

Постпроцессинг в играх что это

Данный трюк ведёт к небольшой деградации цветопередачи в затенённых местах, но хитрости вычислений того, что пишется в альфу позволили снизить это влияние до минимума.

В результате мы получили заметный прирост производительности (10-15%) на устройствах средней производительности (в основном на андроидах), и на ряде устройств уменьшилась теплоотдача. Данная техника — это промежуточное решение, до перехода на отложенное освещение.

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

Плата за неё — небольшое выгорание тени в местах, где она при блюре становится не абсолютно черной, но зато в результате получается более плавный переход полутени.

Источник

Постпроцессинг в играх что это

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

Качество освещения (Lightning Quality)

То, насколько правдоподобно симулируется освещение в игре. Если это единственный подобный параметр в игре, то именно в эту настройку заложили уйму других, будь-то и объемный свет, и рассеивание лучей, и отражения, а иногда даже глобальное затенение. Освещение — это, пожалуй, вообще едва ли не самое основное из всего, что влияет на красоту картинки: оно делает ее объемной, натуралистичной, правдоподобной. Но и ресурсов все это дело «кушает» тоже немало. Именно поэтому, например, Nvidia так расхваливает свои новые RTX-видеокарты — они изначально разработаны под Ray Tracing — метод рендеринга, предполагающий правдоподобную симуляцию каждого луча.

Влияние на производительность

Зависит от движка, но почти во всех современных играх — очень сильное. Симулировать свет — это очень непросто, так что врубайте «ультра» только если у вас действительно мощная видеокарта.

Постпроцессинг в играх что это

Качество эффектов (Effects Quality)

Влияние на производительность

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

…Качество шейдеров (Shader Quality)

Шейдеры — это специальные программы для вашей видеокарты, исполняемые ее процессором. Грубо говоря, это такие «инструкции» от игры вашей GPU, по которым та понимает, как именно нужно отрисовывать тот или иной эффект. Чаще всего шейдеры используются для улучшения освещения, затенения, создания эффектов преломления лучей в воде (помните, как взрывала мозг та самая «шейдерная водичка из Half-Life 2: Lost Coast?), отражений, рассеиваний и так далее. Так что да, эта опция работает в тандеме с другими параметрами: качеством освещения и качеством теней. Существует три вида шейдеров: вершинные, геометрические и пиксельные, но игры, где можно отрегулировать качество каждого из них отдельно, встречаются невероятно редко.

Соответственно, чем выше качество шейдеров, тем лучше описанные выше эффекты, красивее тени и свет, реалистичнее геометрия — и тем сильнее нагрузка на видеокарту. Именно на видеокарту — потому что шейдеры считаются только GPU.

Влияние на производительность

Чаще всего — высокое. Например, в GTA V это один из самых «тяжелых» параметров в игре — снизив качество шейдеров с «Ультра» на средниее значение, вы получите прирост больше, чем в 15 FPS. Но бывает и так, что снижение этого параметра почти ничего не дает, как, например, в Mass Effect Anromeda.

Источник

Постпроцессинг в играх что это

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

1) Анизотропная фильтрация спойлер Наиболее продвинутый способ. Устраняет заметные искажения на объектах, сильно наклоненных относительно камеры. При использовании билинейной или трилинейной фильтрации с увеличением расстояния текстура становится все более размытой, анизотропная же этого недостатка лишена.

Учитывая объем обрабатываемых данных (текстуры высокого разрешения), анизотропная фильтрация особенно требовательна к пропускной способности памяти. На современных начиная с среднего уровня производительности видеокартах она почти не влияет на fps.

Анизотропная фильтрация имеет лишь одну настройку – коэффициент фильтрации (2x, 4x, 8x, 16x). Чем он выше, тем четче и естественнее выглядят текстуры. Значений 4x и 8x, как правило, вполне достаточно для избавления от львиной доли визуальных искажений. 2) Шейдеры спойлер Небольшие программы, которые могут производить определенные манипуляции с 3D-сценой, например, изменять освещенность, накладывать текстуру, добавлять постобработку и другие эффекты.

Шейдеры делятся на три типа:
А) Вершинные (Vertex Shader) оперируют координатами;
Б) Геометрические (Geometry Shader) могут обрабатывать не только отдельные вершины, но и целые геометрические фигуры, состоящие максимум из 6 вершин;
В) Пиксельные (Pixel Shader) работают с отдельными пикселами и их параметрами.

Так же как и тесселяция требует видеокарту с поддержкой DirectX 11. 6) HDR (High dynamic range) спойлер часто используется в игровых сценах с контрастным освещением. Если одна область экрана является очень яркой, а другая, наоборот, затемненной, многие детали в каждой из них теряются, и они выглядят монотонными. HDR добавляет больше градаций в кадр и позволяет детализировать сцену. HDR часто применяется для реализации эффекта приспособления зрения, когда герой в играх выходит из темного туннеля на хорошо освещенную поверхность.
Включение HDR в зависимости от настроек может значительно понизить FPS. В некоторых случаях его совместная работа с Anti-Aliasing невозможна в принципе. 7) Bloom спойлер нередко применяется совместно с HDR, ( не путать с Glow).
Bloom симулирует эффект, который можно наблюдать при съемке очень ярких сцен обычными камерами. На полученном изображении кажется, что интенсивный свет занимает больше объема, чем должен, и «залазит» на объекты, хотя и находится позади них.
При использовании Bloom на границах предметов могут появляться дополнительные артефакты в виде цветных линий. 8) Glow спойлер визуальный световой эффект в трёхмерной или растровой графике. В трёхмерной графике, эффект заключается в том, что у ярких областей объекта наблюдается засвеченность по периметру этих областей, из-за чего создаётся впечатление, что на поверхности яркого объекта виден световой ореол. Часто путают с Bloom. 9) Film Grain спойлер зернистость – данный эффект влияет на восприятие и не везде применим, например в Silent Hill, шум на экране, добавляет атмосферности, а в FEAR 2 лично мне он абсолютно не понравился. 10) Motion Blur спойлер эффект смазывания изображения при быстром перемещении камеры. Применим, когда сцене следует придать больше динамики и скорости. Опять же лично по мне прекрасно выглядит в гоночных симуляторах, а в шутерах я его отключаю.
Правильное применение Motion Blur способно добавить кинематографичности в происходящее на экране, завуалировать низкую частоту смены кадров, добавить плавности в игровой процесс. 11) Ambient Occlusion спойлер модель затенения, используемая в трёхмерной графике и позволяющая добавить реалистичности изображению за счёт вычисления интенсивности света, доходящего до точки поверхности. В отличие от локальных методов, как например затенение по Фонгу, AO является глобальным методом, то есть значение яркости каждой точки объекта зависит от других объектов сцены. В принципе, это достаточно отдалённо напоминает глобальное освещение.
При включении AO, нагрузка на компьютер существенно возрастает.

12) SSAO (Screen Space Ambient Occlusion) спойлер техника, применяемая для придания сцене фотореалистичности за счет создания более правдоподобного освещения находящихся в ней объектов, при котором учитывается наличие поблизости других предметов со своими характеристиками поглощения и отражения света. Является модифицированной версией Ambient Occlusion и тоже имитирует непрямое освещение и затенение. Появление SSAO было обусловлено тем, что при современном уровне быстродействия GPU Ambient Occlusion не мог использоваться для просчета сцен в режиме реального времени. За повышенную производительность в SSAO приходится расплачиваться более низким качеством, однако даже его хватает для улучшения реалистичности картинки.
Не смотря на работу по упрощенной схеме, у SSAO есть множество преимуществ: метод не зависит от сложности сцены, не использует оперативную память, может функционировать в динамичных сценах, не требует предварительной обработки кадра и нагружает только графический адаптер, не потребляя ресурсов CPU. 13) V-Sync (вертикальная синхронизация) спойлер синхронизация кадров игры с частотой вертикальной развертки монитора. Ее суть заключается в том, что полностью просчитанный игровой кадр выводится на экран в момент обновления на нем картинки. Важно, что очередной кадр (если он уже готов) также появится не позже и не раньше, чем закончится вывод предыдущего и начнется следующего.
Если частота обновления монитора составляет 60 Гц, и видеокарта успевает просчитывать 3D-сцену как минимум с таким же количеством кадров, то каждое обновление монитора будет отображать новый кадр. Другими словами, с интервалом 16,66 мс пользователь будет видеть полное обновление игровой сцены на экране.

Следует понимать, что при включенной вертикальной синхронизации fps в игре не может превышать частоту вертикальной развертки монитора. Если же число кадров ниже этого значения, то во избежание потерь производительности необходимо активировать тройную буферизацию, при которой кадры просчитываются заранее и хранятся в трех раздельных буферах, что позволяет чаще отправлять их на экран.

Главной задачей вертикальной синхронизации является устранение эффекта сдвинутого кадра, возникающего, когда нижняя часть дисплея заполнена одним кадром, а верхняя – уже другим, сдвинутым относительно предыдущего.

На заметку:
— в случае избыточной производительности видеоадаптера, V-Sync снижает нагрузку на GPU и как следствие, продлевает жизнь вентиляторам;

— в редких случаях активация V-Sync может снижать FPS;

— при тестировании видеоадаптера бенчмарками, V-Sync следует отключить. 14) Post-processing спойлер общее название всех эффектов, которые накладываются на уже готовый кадр полностью просчитанной 3D-сцены (иными словами, на двухмерное изображение) для улучшения качества финальной картинки. Постпроцессинг использует пиксельные шейдеры. Применим в случаях, когда для дополнительных эффектов требуется полная информация обо всей сцене.

Изолированно к отдельным 3D-объектам такие приемы не могут быть применены без появления в кадре артефактов. 15) Anti-Aliasing спойлер технология, использующаяся в обработке изображений с целью сделать границы кривых линий визуально более гладкими, убирая «зубцы», возникающие при растеризации на краях объектов. В большинстве случаев, а так же в зависимости от типа (об этом ниже) может существенно снижать fps в играх, хотя при должной оптимизации, что встречается сейчас крайне редко, влияет на количество кадров незначительно.

Типы сглаживания (Anti-Aliasing)

15.1) SSAA (Super Sampling Anti-Aliasing)
известный также как Full-Scene Anti-Aliasing (FSAA). Его применение приводит к значительному снижению быстродействия. Учитывая, даже то, что за последние несколько лет быстродействие видеокарт заметно увеличилось, полноценно использовать данный тип сглаживания в современных играх не получится, поскольку количество кадров/с будет очень низким. SSAA окажется эффективной лишь в проектах предыдущих лет, либо в нынешних, но со скромными настройками других графических параметров. AMD реализовала поддержку SSAA только для DX9-игр, в NVIDIA функционирует также в режимах DX10 и DX11.

15.2) MSAA (Multisample Аnti-Аliasing).
Несмотря на, то что данный способ даёт худшие результаты относительно SSAA(FSAA), он гораздо производительнее. В отличие от SSAA(FSAA) сглаживает лишь края объектов, что значительно экономит ресурсы видеокарты, однако такая техника может оставлять артефакты внутри полигонов.

15.3) CSAA (nVidia) / CFAA (Radeon)

15.3.1) CSAA
запатентованная технология nVivia. По сути является расширением MSAA позволяющий выбирать дополнительные отсчёты «перекрытия» пикселя, по которым можно уточнять итоговое значение цвета попадающего на край треугольника экранного пикселя.

NVIDIA создала небесспорную, но сравнительно стройную линейку режимов:
•Off
•2x (MSAA)
•4x (MSAA)
•8x (4x MSAA + 8x CSAA)
•8xQ (8x MSAA)
•16x (4x MSAA + 16x CSAA)
•16xQ (8x MSAA + 16x CSAA)

Спорным в этой схеме выглядит расположение режима 16х выше, чем режима 8xQ, так как «настоящий» MSAA 8x зачастую оказывается лучше CSAA 16x, в котором используется только 4 отсчёта цвета на пиксель. В принципе достаточно уяснить, следующее. Все режимы от 4х до 16х по сути – MSAA. Но в случаях 8х и 16х это «4x MSAA с улучшением (CSAA)». Так же, видно, что режим 8xQ это 8xMSAA, а 16xQ – «8xMSAA с улучшением (CSAA)».

Все режимы выше MSAA 4x выдают очень близкое качество сглаживания, а в динамике разница будет еще меньше, чем на статичных скриншотах.

15.3.2) CFAA (custom-filter antialiasing)
является технологией расширения MSAA от АМД.

По сути, CFAA включает в себя три метода сглаживания, достаточно сильно различающихся между собой:
А) фильтр wide tent;
Б) фильтр narrow tent;
В) с адаптивным детектированием граней (adaptive edge detect).

Режимы narrow и wide tent, которые можно активизировать в сумме с любым из режимов MSAA, представляют собой MSAA с захватом цветовых отсчётов из соседних пикселей. Это позволяет улучшить качество сглаживания (за счёт использования в расчёте цвета пикселя дополнительных значений), однако приводит к «замыливанию» картинки, поскольку значения цветов соседних экранных пикселей, по сути, перемешиваются. По этой причине эти фильтры в основном попросту бесполезны.

15.4) TXAA
Технология от nVidia. По заявлениям разработчиков, TXAA доступно в двух вариантах: TXAA 2x и TXAA 4x. TXAA 2x обеспечивает четкость изображения, сравнимую с 8xMSAA, при равных с 2xMSAA затратах производительности, а TXAA 4x обеспечивает четкость изображения выше, чем при 8xMSAA, при этом затраты производительности сравнимы с 4xMSAA.
Для сглаживания пикселей в TXAA используется выборка субпикселей как внутри так и снаружи пикселя, да ещё в сочетании со значениями из предыдущих кадров (опциональная временная компонента), что обеспечивает отличное качество фильтрации. В сценах с движением камеры, при помощи TXAA достигается качество сглаживания, аналогичное тому, что мы видим при оффлайновом рендеринге, например, в 3D-мультфильмах.
Сглаживающий фильтр методом TXAA работает качественнее, чем MSAA, и особенно это заметно на растительности и прочих подобных объектах.

К сожалению, есть и небольшой недостаток — TXAA-фильтрация многим пользователям покажется слишком «замыливающей» изображение — оно немного теряет в резкости из-за того, что берутся сэмплы вне пикселя, а также из предыдущих кадров.

TXAA поддерживают новые карты Geforce 600 серии.

Фильтр работает покадрово с уже отрендеренным изображением, и его производительность можно чётко просчитать заранее. Она не зависит от сложности сцены, так что можно гарантировать отсутствие «подтормаживаний» в любой момент.

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

Примеры:
А) Метро 2033 при включении АА4Х картинка сильно замыливается, а технология DOF сильно снижает FPS, притом, что всю её красоту можно увидеть только на открытых пространствах. Учитывая, что 99% времени мы проводим в тоннелях включение данной технологии в данном случае не оправдано.

При выявлении неточностей, противоречивых ситуаций, более логичных пояснений, а так же арфаграфических ошипак, не стесняйтесь, отписыватесь в теме. Сам вникнул еще далеко не во все, потому просьба сильно не пинать. Было бы не плохо, если есть грамотно подкованный камрад, по совместительству желающий стать куратором темы! Если администрация не против могу взять на себя данную обязанность. Постпроцессинг в играх что это

Убедительная просьба воздержатся в теме от извечного противостояния AMD/nVidia/Intell, а так же давать непроверенные либо ложные рекомендации, не имея понимания и представления технической стороны вопроса.

Источник

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

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