Как устроено сглаживание — и почему DLSS перевернул игру

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

Более того, эффект от разных настроек отличается кардинально: одни почти не влияют на производительность, но на выходе дают размытую картинку; другие же могут кратно снижать количество FPS, но при этом отличия от кадра без сглаживания придётся искать с лупой.

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

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

Если плотность пикселей на мониторе недостаточно высока, то при отрисовке любой диагональной линии можно увидеть «‎лесенку»‎, то есть заметную разницу в высоте разных пикселей. Это не единственный, но самый распространенный пример так называемого алиасинга. Эффект неприятный, но неизбежный, ведь пиксели имеют квадратную форму, и изменить ее физически невозможно.

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

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

Здесь есть существенная проблема: по сей день разработчикам приходится выбирать — либо сглаживать качественно, но затратно, либо быстро, но «мыльно». Основная причина в том, что типы антиалиасинга делятся на 2 категории: одни работают с кадром прямо во время рендера, а вторые — после (это называется постпроцессинговым сглаживанием).

В первом случае у алгоритма есть возможность получить больше информации о том, что находится в кадре. Это позволяет точнее определить места, которые нужно улучшить. Однако времени на такую обработку уходит относительно много. Постпроцессинговые типы сглаживания, в свою очередь, не знают, что именно находится на мониторе, поэтому сглаживают изображение «вслепую». Это быстро, но не всегда надёжно.

Универсального варианта нет, поэтому до сих пор в настройках разных игр можно увидеть множество опций сглаживания.

Из постпроцессинговых типов сглаживания чаще всего в играх встречается FXAA. Алгоритм бездумно находит все контрастные участки на экране и добавляет промежуточные цвета каждому из них. Картинка в результате получается «мыльная», так как под нож попадают в том числе те участки, где контраст необходим. Зато на производительности FXAA почти не сказывается.

FXAA качественно избавился от «‎лесенок» на этом кадре, но если приглядеться к камню, можно увидеть, что он стал более размытым

Некоторые типы антиалиасинга могут и вовсе не влиять на ресурсы видеокарты. Например, MLAA от Intel задействует ресурсы процессора. Идея напоминает FXAA, но вместо того, чтобы сглаживать все контрастные участки, алгоритм ищет «‎лесенки» одной из трех форм: «‎L», «Z» или «U» (подробнее на картинке ниже).

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

Например, рассмотрим самый первый метод сглаживания, SSAA (или «суперсэмплинг»). Видеокарта обрабатывает кадр в избыточном разрешении, а затем, грубо говоря, сжимает картинку до нужного размера.

Предположим, что человек запускает игру в 1080p с четырехкратным SSAA. В этом случае алгоритм делит каждый пиксель итогового разрешения на четыре сегмента и анализирует цвет каждого из них. Иными словами, искусственно увеличивает разрешение. Если все четыре сегмента одинакового цвета, то он и отправляется на монитор. Если же они различаются, то берётся их промежуточный цвет.

Таким образом игрок получает корректную и гладкую картинку. Однако платить за неё приходится очень высокой нагрузкой на GPU, ведь приходится рендерить каждый кадр в более высоком разрешении. SSAA требует настолько много ресурсов, что сегодня в играх его почти не встретить.

Даже SSAA (изображение справа) не всегда справляется со сглаживанием. Обратите внимание на меховую накидку Лары Крофт

Зато в играх часто встречается MSAA. Он действует схожим образом, но подходит к задаче «умнее». Вместо того, чтобы искать дополнительную информацию на всём кадре, алгоритм фокусируется лишь на границах объектов — именно там мы зачастую видим неприятные «лесенки».

Как уже было сказано ранее, сглаживание во время рендеринга позволяет лучше анализировать, что находится в кадре. Именно этим пользуется MSAA, чтобы понять, где располагаются отдельные объекты. Их края улучшаются аналогично SSAA: разрешение искусственно увеличивается.

Кадр без сглаживания (слева) и с MSAA. Обратите внимание на мушку MP5 и на провода вдалеке. Мушка стала более гладкой, но провода потеряли в деталях из-за своей толщины.

MSAA неплохо прижился в современных играх, ведь он отлично исправляет многие дефекты изображений и, в то же время, тратит гораздо меньше ресурсов, чем SSAA. Тем не менее, назвать его идеальным методом сглаживания нельзя. Главная проблема в том, что алиасинг может проявлять себя по-разному, и «лесенки» по краям предметов — лишь частный случай. Иногда дефекты появляются внутри объектов. Такие проблемы MSAA даже не рассматривает.

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

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

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

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

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

Еще одна неприятная особенность TAA (изображение слева) — это потеря деталей. Обратите внимание на красную табличку в центре, а также на вывеску Zelen в правой части кадра.

Чтобы хоть как-то от них избавиться, программисты пользуются эвристическими алгоритмами.

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

Несмотря на серьезные проблемы, TAA, как и прочие методы временного сглаживания, — это оптимальный вариант для многих разработчиков. Сегодня он встречается во многих играх, а иногда используется в них по умолчанию, без возможности выключения (например, в DOOM Eternal). Всё потому, что у алгоритма появляется возможность работать с большим количеством информации из нескольких кадров, и при этом не нагружать систему.

Разница между разными типами сглаживания. Слева направо: без сглаживания, FXAA, TAA

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

Основная идея реконструкции DLSS звучит так: вместо того, чтобы рендерить кадр в высоком разрешении, видеокарта создает несколько кадров в пониженном. По аналогии с TAA, каждый из них незначительно смещается относительно предыдущего таким образом, чтобы захватить больше информации. Затем алгоритм при помощи нейросети совмещает их в единый кадр высокого разрешения и старается избавиться от неприятных артефактов.

Сравнение обычного кадра (по умолчанию используется TAA) и кадра с DLSS (пресет «автоматический») в Cyberpunk 2077

По схожему принципу работает и знакомый консольным игрокам шахматный рендеринг. Чтобы получить 4K изображение, алгоритм сначала рендерит кадр в 2K по принципу шахматной доски. Второму кадру остается обработать недостающие пиксели. Наложение этих изображений дает в результате искусственное 4К, которое по качеству порой не уступает нативному.

Принцип работы шахматного рендеринга

Но если TAA и шахматный рендеринг — давно известные техники, то почему DLSS вызывает такой ажиотаж, а также при чём здесь нейросети и тензорные ядра? Дело в том, что TAA справляется со своей задачей неидеально. Совмещение даже двух кадров регулярно создаёт графические артефакты.

DLSS же работает с большим количеством кадров: чтобы превратить Full HD в 4K, алгоритму нужно совместить четыре изображения пониженного разрешения. Если отдать обработку таких кадров классическим методам вроде TAA и присущим им эвристическим алгоритмам, то артефактов будет слишком много.

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

Чтобы нейросеть понимала, что именно достраивать в кадре и как это делать, её нужно предварительно натренировать. Делается это на специальных суперкомпьютерах Nvidia. Запись с игрой превращают в серию эталонных изображений в очень высоком разрешении (в актуальной версии — 16K). Самой нейросети на входе даётся версия изображения в низком качестве, которую и нужно довести до эталонного вида.

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

Нейросеть раз за разом улучшает отдельные изображения и сравнивает их с эталонными. Переведённая анимация, взятая из видео-презентации Nvidia. Источник

Как только это происходит, нейросеть отправляется на компьютер пользователя через обычный драйвер. Далее в работу вступают тензорные ядра. Именно они анализируют нейросеть для каждого кадра игры с включенным DLSS.

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

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

Чтобы понимать, почему тензорные ядра важны, нужно знать две вещи. Во-первых, работа с матрицами состоит из большого количества небольших вычислений. Конечно, ими могут заниматься любые вычислительные ядра, но тензорные делают это намного быстрее. По заявлениям Nvidia, они в 30 раз быстрее, чем их классические CUDA-ядра. Во-вторых, нейросеть можно представить в виде нескольких матриц.

В результате достраивание каждого изображения становится тензорным вычислением, а так как тензорные ядра справляются с такими задачами очень быстро, то эту процедуру можно выполнять прямо во время рендеринга в реальном времени.

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

Кадр с DLSS (слева) и без сглаживания

Например, игра без DLSS идет в 60FPS. В таком случае, на рендер каждого кадра уходит по 16,6 миллисекунд. Если DLSS включить, то обработка изображения в пониженном разрешении займет в несколько раз меньше времени. Затем за работу принимаются тензорные ядра. Nvidia уверяет, что для обработки им достаточно 1,5 миллисекунд.

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

Иногда изображение с DLSS даже превосходит картинку в нативном разрешении (Digital Foundry)

Несмотря на то, что поначалу технологию воспринимали со скепсисом, сегодня DLSS всё более популярен. Работу нейросетей в актуальных играх порой сложно отличить от рендера в нативном разрешении, и даже баловство вроде апскейлинга картинки в 540p показывает удивительно хороший результат.

DLSS создал непривычный для индустрии прецедент. Обычно переход от одного поколения видеокарт к другому повышает производительность в играх на 20-25 процентов. Технология от Nvidia же в некоторых случаях удваивает фреймрейт в игре. Конечно, так происходит далеко не всегда, поскольку иногда «бутылочным горлышком» для системы оказывается не видеокарта, а процессор.

Тем не менее, скачок в производительности оказался настолько сильным, что игнорировать его нельзя. Поскольку DLSS — это проприетарная технология, использовать её в исходном варианте могут только устройства Nvidia. Это очень на руку Nintendo, которые используют чипы Tegra в своих Switch. По заявлениям Bloomberg, компания действительно планирует добавить поддержку DLSS в обновленные версии Switch на новых графических процессорах.

Но что делать владельцам карт от AMD и обладателям консолей от Sony и Microsoft? AMD уже анонсировала появление аналога DLSS под названием Fidelity FX Super Resolution (FFXSR), но подробностей о н1м мы пока не знаем. Вполне возможно, что алгоритм компании будет принципиально отличаться от того, что предложила Nvidia, ведь AMD стремится сделать технологию как можно более открытой и кроссплатформенной.

Комментарии: 0