company_banner

Бесплатные ФПС: как ИИ помогает сделать игровую графику лучше

Автор оригинала: Kshitij Kumar
  • Перевод


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

Не обошел стороной он и игровую индустрию. Пока в геймерской среде сравнивают графику вышедшей на ПК Death Stranding с технологией DLSS и без нее, на днях стало известно, что в процессорах NVIDIA Ampere будет задействована уже DLSS 3.0. При этом она будет работать с любой игрой с TAA (Temporal Anti-Aliasing) и драйвером Game Ready. Это означает, что разработчикам понадобится подстроить технологию к своим играм — впрочем, этот процесс будет проходить куда легче, чем сейчас.

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

Что такое DLSS?


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

Deep Learning Super Sampling (DLSS) — технология NVIDIA, использующая глубокое машинное обучение для повышения частоты кадров в играх, требующих сложных графических вычислений. С DLSS геймеры могут использовать более высокие настройки и разрешение, не беспокоясь при этом за стабильность fps.

В частности, DLSS выполняет задачу суперразрешения. С его помощью изображение с разрешением, скажем, 1080p может быть увеличено до 4K с минимальными потерями в качестве. Это избавляет от необходимости воспроизводить игру в 4K (и тем самым, вероятно, расплавить ваш ПК). Разрешение по-прежнему будет 1080p, что позволяет сохранить более высокую частоту кадров, однако благодаря масштабированию при помощи DLSS разницы с 4K вы практически не заметите.

image
Архитектура DLSS 2.0

По сути, DLSS — это нейронная сеть, обученная на суперкомпьютерах NVIDIA. Выход этой нейросети сравнивается с эталонным изображением с разрешением 16K, а ошибка между ними возвращается сети по петле обратной связи. Чтобы не возникло проблем со скоростью, DLSS использует тензорные ядра, являющиеся основой процессоров RTX 2000 (и в будущем RTX 3000). Это позволяет значительно ускорить тензорные операции и повысить эффективность обучения ИИ и задач, связанных с высокопроизводительными вычислениями.

image

Эволюция DLSS: от 1.0 к 2.0


DLSS 1.0 обучался для каждой игры отдельно, а оттого учился чрезвычайно долго. Еще он не поддерживал 4-х кратный апсэмплинг (upsampling), например, из 1080p до 4K, и имел ряд других недостатков в качестве изображения, которые не стоили улучшения частоты кадров.

DLSS 2.0 — более общий алгоритм, лишенный ограничений на обучение и апсэмплинг, а также имеющий меньшую задержку вывода за счет использования тензорных ядер: она составляет порядка 1,5 мс при 4K на RTX 2080ti — и в некоторых случаях обеспечивает результат даже лучше, чем исходное изображение.


Изображения с DLSS имеют конечное разрешение 1080p

В DLSS 1.0 максимально можно увеличить разрешение 720p до 1080p, тогда как DLSS 2.0 может масштабировать до 1080p даже разрешение 540p. Как видно на примере, изображение при 540p выглядит совсем размытым. При этом результат с DLSS 2.0 оказался лучше, чем с DLSS 1.0, и даже немного лучше исходной картинки. То есть, DLSS 2.0 справляется с заполнением пикселей эффективнее, чем DLSS 1.0, даже несмотря на то, что последнему нужно перемасштабировать не такую большую разницу в разрешении.

Умение DLSS 2.0 масштабировать изображение с разрешением 540p в сочетании с малой задержкой, обусловенной самим методом, дает существенное увеличение производительности по сравнению с предшественником.

image
Время рендеринга с DLSS 2.0 и без него (в мс)


Подробнее о принципе работы DLSS

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

image

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

image

С увеличением сетки сэмплирования в 4 раза — до 8x8 — изображение оказывается больше похожим на предполагаемый треугольник. В этом и заключается суть DLSS: преобразовать изображение с низким разрешением в более высокое.

image
Суть DLSS

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

image
Цель DLSS

Это фактически решает уже не новую проблему супер-разрешения.

Давайте кратко рассмотрим, как развивались методы повышения разрешения с помощью ИИ.

Single Image Super-Resolution


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

image
Single Image Super-Resolution

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


Целевое разрешение — 1080p

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

Multi-frame Super-Resolution


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

Spatial-Temporal Super Sampling


Этот метод использует несколько кадров для супер-сэмплинга изображений.



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

image
Гистограмма метода Spatial-Temporal Super Sampling

Проблема в том, что в играх все постоянно находится в движении. Поэтому для исправления истории кадров данный метод суперсэмплинга вынужден производить эвристический поиск, например, по принципу Neighbour Clamping. Эти эвристики вносят свой вклад в размытость, временную нестабильность, муар, лаги и ghosting.


Нежелательные эффекты от Neighbour Clamping


Временное мерцание и муар на изображениях с Neighbour Clamping

DLSS 2.0: Deep Learning-based multi-frame reconstruction


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

image

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



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

Тесты производительности


image

Последний тайтл Remedy Control поддерживает как трассировку лучей, так и и DLSS. Как видно на графике выше, RTX 2060 получил прирост производительности с 8 кадров в секунду до примерно 36,8 кадров в секунду за счет DLSS, что значительно повысило играбельность проекта. Этот результат оказался даже лучше, чем в случае с RTX 2080ti без DLSS, что еще раз доказывает, насколько эффективна эта технология.

Digital Foundry сравнил качество изображения с использованием DLSS 1.9 и 2.0 в этом видео.


Слева — Control с DLSS 1.9, справа — с DLSS 2.0. Изображения получены на RTX 2060 с разрешением 1080p и затем отмасштабированы до 4K

На сравнении выше мы видим, как DLSS 2.0 отрисовывает пряди волос, искаженные в случае DLSS 1.9.

Заключение


DLSS доступен только для графических процессоров на базе RTX 2000 и Turing (и на будущих графических процессорах RTX 3000 на базе Ampere) и на данный момент поддерживает лишь несколько игр. DLSS 2.0 поддерживается еще меньшим количеством тайтлов, но уровень детализации при нем может превосходить даже оригинальное изображение, а частота кадров при этом остается высокой. Это действительно классное достижение NVIDIA, и у технологии определенно многообещающее будущее.
Pixonic
Разрабатываем и издаем игры с 2009 года

Комментарии 27

    +6
    И ни один скриншот не масштабируется (как тут можно сравнить)
    image
      +11
      простите, не могу удержаться


        +5
        Просто нужно пройтись DLSS по этим скринам, апскейльнуть до 4К и потом разглядывать
        +1
        Пересняли скриншоты, сейчас должно быть получше
          0

          но ссылки так и не вставили. хочется приблизить и повертеть

            0
            Теперь все есть!
              +1
              Не всё.
              В результате папоротники в случае DLSS 2.0 выглядят даже более детальными, чем на оригинальном изображении.

              Где оригинальное изображение-то?

              P.S. А ещё хотелось бы сравнения в движении(gif?). Сами же обратили внимание
              Временное мерцание и муар на изображениях с Neighbour Clamping

              Лично для меня временное мерцание это самый раздражающий эффект с которым борется АА.(Лесенки конечно хуже, но их уже победили на достаточном для меня уровне)
                0
                Где оригинальное изображение-то?

                В примерах по умолчанию включен TAA, так что считаем 1080 TAA

                Временное мерцание и муар на изображениях с Neighbour Clamping

                Этот эффект в динамике показывается здесь на моменте 32:49:
                Видео

                Ну и в статье эффект покадрово:
                  0
                  1)Т.е. вы попортили чёткость оригинала ТАА, а потом сравнивая DLSS с TAA говорите что DLSS чётче оригинала? TAA настолько жутко мажет картинку, что я использовал его буквально в одной игре.
                  2)Про мерцание «претензия» не к тому что не сравнили, а что не выложили сэмплы для сравнения в удобном виде. Ну это же классика-параллельно запустить 2 отрезка. Один с одними настройками, а другой с другими.
                    +2

                    Это переводная статья — конспект презентации NVIDIA, мы сами четкость ни у чего не портили.

                      0

                      Ну это гениальный рекламный ход! По сравнению с TAA чёрт с рогами покажется в хорошем качестве

        • НЛО прилетело и опубликовало эту надпись здесь
            +1
            на канале «этот компьютер» автор рассказывал про это очень интересно. технологии, конечно… жаль живём мало, очень бы хотелось технологическое будущее пощупать
              +4
              DLSS искажает картинку. При этом сравнение почему-то проводится с TAA без DLSS, который тоже может искажать картинку — на канале Digital Foundry в сравнении Death Stranding есть примеры. При том сравнений «обычная картинка — DLSS» на том же канале едва пара штук и на них видно, что при включённом DLSS пропадает «туман», дымка синего светофильтра, являющегося частью картинки.
              Вообще, не спорю, алгоритм даёт двойную производительность при 90% картинке, если не тянет ПК — это спасение, но, во-первых, нельзя ли это включить для всех игр на уровне драйвера, если его больше не требуется обучать для каждой игры отдельно, а во-вторых, не окажется ли это типичным vaporware от Nvidia вроде PhysX, когда сначала благодаря рекламе пользователи покупают железо, потом технология оказывается заброшена, а на рынке появляется общая альтернатива? Для DLSS даже версии 2.0 всё ещё требуется драйвер под определённую игру.
                0
                Следующий шаг — улучшение качества фотографий, как в дурацких фильмах, где из пары пикселей собирают качественное фото?
                  0
                  Ты должен понимать что это физически не возможно. Из 2 пикселей нельзя получить картинку 320x240 пикселей, это возможно только в фильмах. Если получить фото то искажения будут очень сильными. Посмотри как сейчас увеличивают картинки используя нейросети, там очень много шумов и не естественных деталей.
                    0

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

                      +1
                      Повышение разрешения – вполне типичная обратная задача, при решении которой мы страдаем от слишком большого (бесконечного) числа допустимых решений, а не от их отсутствия.

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

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

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

                      Пример как поможет GAN
                      Пусть есть сеть G, которая по какому-то входному вектору x генерирует реалистичное лицо, сеть D оценивающая реалистичность изображения и дифференцируемая операция понижения разрешения F(y). Составим цепочку: xG(x)F(G(x)).
                      Если изображение одно, то ищем оптимальный x* (например, градиентным спуском), чтобы минимизировать различие между F(G(x)) и исходным изображением, а также максимизировать реалистичность, то есть оценку D(x). С различными начальными приближениями можно получать различные x, по ним генерировать реалистичные изображения G(x), соответствующие условиям.
                      Важно, что таким образом мы значительно сузили пространство поиска среди изображений до реалистичных (действительно ли максимизация D гарантирует реалистичность – отдельный для каждого метода вопрос), поэтому искажений скорей всего не будет.
                      Когда доступны несколько снимков объекта, можно искать набор близких друг к другу x_i, таких, чтобы каждый x_i минимизировал различие со своим снимком – это поможет ещё больше сузить пространство поиска и более точно восстановить каждое изображение.
                      0
                      Мне кажется следующим (ну или скорее одним из следующих, в неопределённом будущем) шагом будет генерация картинки без исходного изображения — просто данные сцены перевариваем в удобоваримый для нейронки формат, а она генерирует изображение с практически любым разрешением и с учётом предыдущих кадров (чтобы изображение не «плыло»). От разработчиков требуется только скормить ей в начале частичный набор данных предобучения, аналог нынешних мешей и текстур, и, так сказать, тяп-ляп и в продакшн.
                        0
                        А как вообще такое будет редактироваться? Сейчас больше развивается генерация материалов из просты текстур, генерация моделек органики. В будущем скорее всего будет тот же PBR, но в профиль: материалы получат реальные физические свойства, смогут размазываться и крошиться, разваливаться и получаться повреждения. Нормальная система физики и их вида. Сейчас это тоже можно шейдерами добиться, но это надо нехилый скилл иметь, что-бы оно нормально выглядело.
                          0
                          Нормальную физику уж много лет как можно реализовать. Когда-то вышел Red Faction, где можно было крушить почти всё, и тогда многим казалось, что будущее игр — за полной разрушаемостью окружения. Но этого не наступило, и очевидно проблема тут вовсе не в технической сложности, а в сложности игровой разработки — если игрок может разрушить всё (а в условиях реальной физики он вполне может разрушить практически всё), то его ничем нельзя будет ограничить, нельзя будет предсказать, куда игрок попытается пролезть и это будет ломать игровые скрипты, либо делать их невероятно сложными.
                          Я всё-таки про другое говорил, исключительно про технику рендеринга. Опять же, глядя в прошлое, когда-то многие верили, что будущее за воксельной графикой, которая позволила бы полностью избавиться от ограничений на количество полигонов. Но этого так и не произошло. Сейчас смотрят на рейтресинг как технологию будущего (в смысле, полный и полноценный, а не как сейчас, когда он используется в первую очередь как дополнение к классическому рендерингу, которое подкрашивает картинку более реалистичными цветами, тенями и отражениями). Но ведь вполне несложно представить, как вместо классического пайплайна картинку генерирует нейросеть на базе данных о сцене и предобучения. И тут пожалуйста, теоретически, если нейронка достаточно большая и обучена на достаточном массиве данных, то если игрок захочет рассмотреть кожу вплотную, то он сможет увидеть каждую волосинку на ней, каждую дорожку папиллярного узора, и при этом нагрузка на вычислитель всегда будет практически одинаковой.
                          Но это так, измышлизмы, разумеется, до такой технологии пока ещё далеко (однако же, стоит ли мне напомнить, что шаги в этом направлении уже есть — нейронки, которые дорисовывают картинку по данным от пользователя, или же нейронки, которые рисуют картины с нуля со словесного описания).
                            0
                            По моему это будет очень дорогая технология, если можно будет увидеть каждую волосинку на коже при приближении. Даже если теоретически как-то ОЧЕНЬ ХИТРО это лодировать и отсекать, всё равно объем генерирующихся данных будет гигантский. Хотя, идея мне нравится)
                              0
                              Как сказать, и да, и нет. ДА — в том плане, что это будет в принципе очень дорогая технология, нужна огромная нейронка, обученная на огромной базе, да и к ней ещё и жирненький такой вектор инициализации под конкретную игру. Естественно, чтобы её обработать, потребуется недюжая вычислительная мощность (впрочем, вполне допустимая, с учётом темпов технологического развития и специализированных тензорных процессоров).
                              НЕТ — потому что нагрузка будет более-менее одинаковой всегда, куда ни посмотри, сколько бы деталей ни было в кадре, потому что нейронка одна и та же, ей без разницы, нужно ли сгенерировать лохматую шкуру, планету Земля и всё, что на ней или поле ржи, она сделает это за один проход.
                                0
                                Понимаете, вы всё это представляете что всё это будет генерироваться каким-то совершенно волшебным способом. Если у меня, допустим есть текстура бетона, просто серое месиво, как оно поймёт что нужно сгенерировать? Как вообще такое хранить, или просто на лету генерировать? А «вектор инициализации под конкретную игру» как вообще будет настраиваться? Инструменты то откуда возьмуться? Я думаю что всё это будет очень долго развиваться, скорее к 10 годам, ибо и трудоёмко, и железо которое такие страшные заморочки потянет подтянется. И скорее всего оно прийдёт к какому-то намного более простому и менее ресурсоёмкому результату и скорее всего в реальном времени оно генерироваться не будет, а будет какой-то паттерт генерации материала в масштабе или что-то типа того. Судя по увеличению объёмов носителей, это просто будет хранится на компе.
                                  0
                                  Похоже, вы совсем не понимаете, как работают нейросети. У вас нет текстуры бетона. Текстуры всевозможных бетонов есть в самой нейросети, так же, как и модели, и они не отделены друг от друга, они все в обучающей выборке, и обучающая выборка в таком сценарии вообще должна состоять практически полностью из фотографий. Нейросеть структурирует, классифицирует данные из обучающей выборки «на свой вкус», выделяет в ней отдельные объекты, понимает их ракурсы по отношению к камере, их освещение по отношению к источникам света, и строит для всего этого свою внутреннюю модель, по которой она может сгенерировать то, чего в обучающей выборке не было. Какую модель — никто не знает, потому что нейросети состоят из миллиардов если не на порядки больше параметров. В этом есть своего рода магия — оно просто работает (но не всегда так, как надо).
                                  Вот насчёт вектора инициализации уже чистые спекуляции, я не представляю как это возможно сделать, только что в нём примерно должно быть. А должна быть общая тема, чтобы нейросеть знала что примерно в игре находится, в каком стиле/тематике. Скажем, что дорожные знаки, например, в европейском или американском стиле.
                                  Я думаю что всё это будет очень долго развиваться, скорее к 10 годам

                                  Я и не утверждаю, что это будет завтра. Я и не утверждаю, что это вообще будет. Но чисто гипотетически это возможно. При этом
                                  менее ресурсоёмкому результату

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

                                  Короче, предлагаю вам высказать очередное «фе» и за сим закрывать дискуссию, потому что она начиналась со спекуляций и никуда дальше она не придёт. За объяснением принципов работы нейросетей — тут на хабре более чем достаточно и статей, и примеров.
                                    0
                                    Согласен. Спасибо что многое разъяснили. Просто сегодня перспектива нейросетей звучит очень мутно, и кажется что адекватно что-то из этого получить хоть что-то невозможно. В общем, поживём увидим.
                      0
                      В некоторых моментах статья напоминает скорее рекламную, чем техническую («в этом и заключается суть DLSS: преобразовать изображение с низким разрешением в более высокое» — «мы специально добавили в Gala компоненты из дорогого стирального порошка»).

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

                      Самое читаемое