Найти в Дзене
KompTech

Как работает сглаживание в видеоиграх

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

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

На самом деле, методов сглаживания просто огромное количество, но наиболее популярны MSAA (Multisample anti-aliasing, дословный перевод - Сглаживание при помощи нескольких образцов) и FXAA (Fast approXimate Anti-Aliasing, дословный перевод - Быстрое примерное сглаживание). При этом, есть разные степени MSAA - х2, х4, х8, х16. Иногда сложно понять, что же представляет из себя сглаживание - если по названию как-то худо-бедно понятно, какой тип сглаживания как работает, то когда к этому типу сглаживания приписываются еще и степени, то становится еще не понятнее. Да, MSAA x2 хуже, чем MSAA x8, но какая разница между х8 и х16? В этой статье я попытаюсь объяснить, как работает сглаживание изображения и его алгоритмы.

Сглаживание MSAA

Заранее извиняюсь за блюр на изображениях - Дзен сжимает картинки.
Заранее извиняюсь за блюр на изображениях - Дзен сжимает картинки.

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

Все те же самые пиксели, но уже на нашей теоретической матрице
Все те же самые пиксели, но уже на нашей теоретической матрице

Так сказать, найди 10 отличий. Это максимально точное изображение той линии, которое монитор может воспроизвести с текущим разрешением. Красным полупрозрачным цветом отмечена линия, которая должна быть отрисована, черным - то, что получилось вывести с текущим разрешением. Если быть вкратце, то пиксели тут имеют два состояния: "ДА" и "НЕТ". Предположим, что пиксель переходит в состояние "ДА" из состояния "НЕТ", если линия покрывает хотя бы 1/3 его площади. Такую картинку мы получаем без сглаживания.

Почему MSAA использует "несколько образцов"? Как понимать эту фразу?

Нужно узнать, сколько процентов коробки занимают 3 цвета конфетти.
Нужно узнать, сколько процентов коробки занимают 3 цвета конфетти.

Предположим, что есть коробка с разноцветным конфетти: красным, зеленым и синим. Нужно узнать, какую долю конфетти составляют разные цвета. Взяв образец из левого верхнего угла, мы получаем информацию: 12 красных, 4 зеленых, 0 синих. Получается, что во всей коробке 75% красных конфетти и 25% зеленых, но нет синих.

Берем 2 образца из коробки.
Берем 2 образца из коробки.

Поэтому нам нужно больше информации: теперь берем образец из другого угла (желательно, наиболее удаленного от другого образца). Получаем 6 красных, 9 зеленых и 1 синий. Теперь у нас есть следующая информация: в общей сложности 56% красных, 40% зеленых и 3% синих конфетти. Не смотря на то, что эта информация далека от истинны, чем больше мы будем брать образцов, тем точнее будет итоговый результат. Возьмем 4 образца - получим более точную картину, возьмем 8 - почти идеальную, 16 - результаты не изменятся кардинально, но будут наиболее точными. Точно так же и работает MSAA сглаживание-

Расположение образцов на разных пикселях с разными степенями MSAA.
Расположение образцов на разных пикселях с разными степенями MSAA.

-берет несколько образцов на пикселе и высчитывает средний цвет. Давайте взглянем на то, как сглаживание повлияет на первый пример из статьи!

Можно сказать, что тут х6 сглаживание.
Можно сказать, что тут х6 сглаживание.

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

С FXAA все чуточку легче - он просто размазывает пиксели, добавляя вокруг них полупрозрачные. И он вполне хорошо работает с текстурами, у которых много мелких повторяющихся деталей по типу травы, гравия и песка, а так же хорошо работает, если нужно сгладить тонкие объекты по типу проводов и решеток. В остальных случаях на выходе получается лишь МЫЛО!!

Но что вы ожидали от быстрого сглаживания - оно дубовое, но зато почти не влияет на производительность.

Какое сглаживание лучше выбрать? На высоком разрешении можно обойтись х2 или х4. Если разрешение не HD, то х4 или х8. х16 баловаться не стоит, разницы вы почти никакой не заметите, зато ресурсов компьютера оно пожрет прилично. FXAA ставить не советую, иначе будет конкретное мыльцо, однако FXAA в паре с MSAA х2 или х4 дает то же качество картинки, что и MSAA х16, при этом такой "симбиоз" менее прожорлив.