Что такое постобработка в играх
Что такое постобработка в играх
Это вторая часть нашего гайда. Первая, где собраны основные настройки вроде разрешения, качества текстур и теней, вы можете прочитать по ссылке.
Качество освещения (Lightning Quality)
То, насколько правдоподобно симулируется освещение в игре. Если это единственный подобный параметр в игре, то именно в эту настройку заложили уйму других, будь-то и объемный свет, и рассеивание лучей, и отражения, а иногда даже глобальное затенение. Освещение — это, пожалуй, вообще едва ли не самое основное из всего, что влияет на красоту картинки: оно делает ее объемной, натуралистичной, правдоподобной. Но и ресурсов все это дело «кушает» тоже немало. Именно поэтому, например, Nvidia так расхваливает свои новые RTX-видеокарты — они изначально разработаны под Ray Tracing — метод рендеринга, предполагающий правдоподобную симуляцию каждого луча.
Влияние на производительность
Зависит от движка, но почти во всех современных играх — очень сильное. Симулировать свет — это очень непросто, так что врубайте «ультра» только если у вас действительно мощная видеокарта.
Качество эффектов (Effects Quality)
Влияние на производительность
Тоже зависит от игры, чаще всего не особенно высокое. Но чем выше этот параметр, тем сильнее будет нагружаться ваша видеокарта в загруженных сценах, например, при масштабных перестрелках. Так что если игра начинает «подлагивать» в особо динамичные моменты, можно попробовать поиграться с этим ползунком, прежде чем снижать, например.
…Качество шейдеров (Shader Quality)
Шейдеры — это специальные программы для вашей видеокарты, исполняемые ее процессором. Грубо говоря, это такие «инструкции» от игры вашей GPU, по которым та понимает, как именно нужно отрисовывать тот или иной эффект. Чаще всего шейдеры используются для улучшения освещения, затенения, создания эффектов преломления лучей в воде (помните, как взрывала мозг та самая «шейдерная водичка из Half-Life 2: Lost Coast?), отражений, рассеиваний и так далее. Так что да, эта опция работает в тандеме с другими параметрами: качеством освещения и качеством теней. Существует три вида шейдеров: вершинные, геометрические и пиксельные, но игры, где можно отрегулировать качество каждого из них отдельно, встречаются невероятно редко.
Соответственно, чем выше качество шейдеров, тем лучше описанные выше эффекты, красивее тени и свет, реалистичнее геометрия — и тем сильнее нагрузка на видеокарту. Именно на видеокарту — потому что шейдеры считаются только GPU.
Влияние на производительность
Чаще всего — высокое. Например, в GTA V это один из самых «тяжелых» параметров в игре — снизив качество шейдеров с «Ультра» на средниее значение, вы получите прирост больше, чем в 15 FPS. Но бывает и так, что снижение этого параметра почти ничего не дает, как, например, в Mass Effect Anromeda.
Пост-эффекты в мобильных играх
Большинство публикаций по графике для консолей и десктопов рассказывают о чем-то новом, а для мобильных платформ во главе угла всегда стоит оптимизация уже существующего.
Что касается пост-обработки — её волшебное действие на фотографии было открыто задолго до появления первых компьютеров, а её математический и алгоритмический базис, созданный для цифровой обработки изображений, удачно вписался в программируемый конвейер 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, что позволяет добиться более плавного перехода в освещенных местах.
Плата за неё — небольшое выгорание тени в местах, где она при блюре становится не абсолютно черной, но зато в результате получается более плавный переход полутени.
За что отвечают настройки графики в играх, и как они влияют на FPS. Часть 2
Это вторая часть нашего гайда. Первая, где собраны основные настройки вроде разрешения, качества текстур и теней, вы можете прочитать по ссылке.
Качество освещения (Lightning Quality)
То, насколько правдоподобно симулируется освещение в игре. Если это единственный подобный параметр в игре, то именно в эту настройку заложили уйму других, будь-то и объемный свет, и рассеивание лучей, и отражения, а иногда даже глобальное затенение. Освещение — это, пожалуй, вообще едва ли не самое основное из всего, что влияет на красоту картинки: оно делает ее объемной, натуралистичной, правдоподобной. Но и ресурсов все это дело «кушает» тоже немало. Именно поэтому, например, Nvidia так расхваливает свои новые RTX-видеокарты — они изначально разработаны под Ray Tracing — метод рендеринга, предполагающий правдоподобную симуляцию каждого луча.
Влияние на производительность
Зависит от движка, но почти во всех современных играх — очень сильное. Симулировать свет — это очень непросто, так что врубайте «ультра» только если у вас действительно мощная видеокарта.
Качество эффектов (Effects Quality)
Влияние на производительность
Тоже зависит от игры, чаще всего не особенно высокое. Но чем выше этот параметр, тем сильнее будет нагружаться ваша видеокарта в загруженных сценах, например, при масштабных перестрелках. Так что если игра начинает «подлагивать» в особо динамичные моменты, можно попробовать поиграться с этим ползунком, прежде чем снижать, например.
…Качество шейдеров (Shader Quality)
Шейдеры — это специальные программы для вашей видеокарты, исполняемые ее процессором. Грубо говоря, это такие «инструкции» от игры вашей GPU, по которым та понимает, как именно нужно отрисовывать тот или иной эффект. Чаще всего шейдеры используются для улучшения освещения, затенения, создания эффектов преломления лучей в воде (помните, как взрывала мозг та самая «шейдерная водичка из Half-Life 2: Lost Coast?), отражений, рассеиваний и так далее. Так что да, эта опция работает в тандеме с другими параметрами: качеством освещения и качеством теней. Существует три вида шейдеров: вершинные, геометрические и пиксельные, но игры, где можно отрегулировать качество каждого из них отдельно, встречаются невероятно редко.
Соответственно, чем выше качество шейдеров, тем лучше описанные выше эффекты, красивее тени и свет, реалистичнее геометрия — и тем сильнее нагрузка на видеокарту. Именно на видеокарту — потому что шейдеры считаются только GPU.
Влияние на производительность
Чаще всего — высокое. Например, в GTA V это один из самых «тяжелых» параметров в игре — снизив качество шейдеров с «Ультра» на средниее значение, вы получите прирост больше, чем в 15 FPS. Но бывает и так, что снижение этого параметра почти ничего не дает, как, например, в Mass Effect Anromeda.
Как улучшить графику в старых играх: HD-текстуры, разрешение и постобработка
Разрешение экрана
Универсального инструмента для «расширения» изображения нет. Если хорошо поискать, можно найти подходящий фикс для нужной игры.
Улучшенные текстуры
Есть разные типы модов на текстуры, каждый из них отличается своим уровнем проработки. Одни пакеты заменяют их во всей игре, другие лишь на некоторых локациях. В любом случае если поискать, вы найдете ту сборку HD-текстур, которая сделает нужную игру несколько симпатичнее.
Главное, строго следуйте инструкции к моду, так как отклонение от нее может сломать игру, и вам придется заново ее устанавливать.
Постобработка с помощью ReShade
ReShade — это бесплатный набор фильтров для постобработки. Инструмент настолько полезен, что при желании можно применить его и к современным релизам, если вам кажется, что эффекты выглядят не так, как должны были.
Для начала бесплатно скачайте ReShade с официального сайта. Советуем сохранить файл где-нибудь под рукой, так как он применяет эффекты только к одной указанной вами игре. Запустите файл и выберите игру, после чего отметьте нужные настройки рендеринга.
После выполнения вышеописанных действий в игре появится масса новых настроек графики, но не спешите делать вашу игру лучше. Во избежание ухудшения картинки, советуем поискать в сети пресеты, которые другие пользователи уже создали и опробовали.
Некоторые шаблоны есть на сайте ReShade, но лучше прогуляться по форумам и специализированным ресурсам. Когда найдете нужный шаблон, сохраните его на своем PC и снова запустите ReShade. После выбора игры и установки нужных настроек нажмите на Edit ReShade Settings, в первом поле открывшегося окошка укажите путь к сохраненному ранее файлу с пресетами.
Помните, что некоторым пресетам ReShade может потребоваться версия утилиты постарше. Все версии программы лежат в репозитории ReShade Mediafire. Учитывая эти факторы, еще раз настоятельно советуем не игнорировать файл readme, который неспроста так называется и порой действительно может вам помочь.
Запустив игру после работы с ReShade, она предложит вам нажать клавишу Home для доступа ко всем добавленным параметрам. Не бойтесь, если у вас начнет рябить в глазах от огромного количества настроек. Благодаря пресетам мы избавились от часов проб и ошибок. У нас уже все установлено. Разумеется, никто вам не запрещает всячески экспериментировать с настройками, но старайтесь делать это как можно аккуратнее.
Фильтры SweetFX
Для того, чтобы установить SweetFX вам необходимо сделать несколько несложных шагов:
Скачать уже готовый пресет просто, но иногда хочется полностью настроить все под себя, а делать это в текстовом файле не самый удобный процесс. Небезразличные моддеры сделали специальную утилиту SweetFX Configurator, которая позволяет из удобного меню включить или выключить необходимые эффекты.
В SweetFX Configurator достаточно просто нажать «Add New Game» и выбрать нужную игру. После этого утилита сама создаст и скопирует в папку все нужные файлы. Теперь вы можете через окно конфигуратора настроить все, как душе угодно. Однако и у такого удобного решения есть свои недостатки.
Сетевые игры могут распознать SweetFX Configurator как чит. Поэтому стоит быть крайне осторожным с настройками в онлайн-проектах.
Реалистичное освещение с помощью ENBSeries
Все, ENBSeries установлена. Осталось лишь ее настроить. Раньше делать это в ENB приходилось с помощью редактирования файла ini., но теперь появилась возможность менять настройки непосредственно в игре. Просто нажмите сочетание клавиш Shift+Enter и поставьте галочки у тех параметров, которые вы бы хотели активировать.
Если вы боитесь своими руками настраивать ENB из-за страха что-то поломать, можете поискать в сети уже готовые пресеты. Готовых сборок много, но внимательно читайте инструкции по их установке, так как они могут отличаться.
Совместная работа ENBSeries и SweetFX
Все, теперь SweetFX и ENBSeries работают вместе.
Улучшение графики с помощью «Панели управления Nvidia»
Если вы обладатель видеокарты от Nvidia, можно обратиться к настройкам в программе «Панель управления Nvidia»:
По большей части тут различные варианты сглаживания и фильтрации текстур, но они действительно способны изменить внешний вид игры, пусть и не сильно.
Часть №9: Постобработка в игре «Breakout» на C++/OpenGL
Обновл. 20 Дек 2020 |
Представьте, как было бы круто, если бы мы оживили нашу игру, добавив в нее несколько эффектов постобработки? Например, создали бы эффект «Встряски», инвертировали все цвета сцены, сделали хаотичное перемещение вершин и/или использовали другие необычные эффекты.
Примечание: На этом уроке широко используются теоретические материалы из уроков про фреймбуферы и сглаживание.
На уроке о фреймбуферах мы продемонстрировали, как можно применять постобработку для достижения интересных эффектов при помощи всего одной текстуры. Мы собираемся сделать нечто подобное и в игре «Breakout»: создать фреймбуфер с прикрепленным к нему мультисэмплированным рендербуфером. Весь код рендеринга игры должен рендерить сцену в данный мультисэмплированный фреймбуфер, который, затем, копирует свое содержимое в другой фреймбуфер с прикрепленной к нему текстурой. Данная текстура — это сглаженное изображение игры, которое мы будем рендерить на экранный 2D-прямоугольник с применением (или без) эффектов постобработки.
Итак, подводя итог всего вышесказанного, для осуществления процесса рендеринга с использованием постобработки, мы должны проделать следующие шаги:
Шаг №1: Привязать мультисэмплированный фреймбуфер.
Шаг №2: Выполнить обычный рендеринг игры.
Шаг №3: Скопировать мультисэмплированный фреймбуфер в обычный фреймбуфер с прикрепленной текстурой.
Шаг №4: Отвязать фреймбуфер (использовать заданный по умолчанию фреймбуфер).
Шаг №5: В шейдере постобработки использовать текстуру цветового буфера из обычного фреймбуфера.
Шаг №6: Выполнить рендеринг выходного изображения шейдера постобработки.
Шейдер постобработки позволяет активировать три типа эффектов: Shake, Confuse и Chaos.
Shake (Встряска) — слегка встряхивает и кратковременно немного размывает сцену.
Chaos (Хаос) — использует ядро обнаружения граней для создания интересных визуальных эффектов, а также перемещает текстурированное изображение по кругу для получения забавного эффекта «Хаоса».
Ниже приведен краткий обзор того, как будут выглядеть данные эффекты: