Даже сегодня игры предлагают множество опций сглаживания, которые в лучшем случае сопровождаются коротким текстовым пояснением. В худшем же — это и вовсе россыпь странных аббревиатур.
Более того, эффект от разных настроек отличается кардинально: одни почти не влияют на производительность, но на выходе дают размытую картинку; другие же могут кратно снижать количество 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 стремится сделать технологию как можно более открытой и кроссплатформенной.