За что отвечает рендеринг в играх

Как происходит рендеринг кадра видеоигры

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играхDeus Ex Human Revolution — это компьютерная игра 2011 года, которая является более успешным продолжением оригинальной Deus Ex, чем Invisible War. Но этот пост не о качестве игры, а о демонстрации её технических принципов. Адриан Курреж провёл несколько часов за реверс-инжинирингом, пытаясь понять с помощью инструмента Renderdoc, как происходит обработка каждого из кадров Human Revolution. Затем Адриан изложил результаты в своём блоге.

Игра построена на основе модифицированного проприетарного движка Crystal от компании Crystal Dynamics. Human Revolution была одной из первых игр, которая использовала 11 версию DirectX. На момент выхода уровень графики был на отличном уровне, похождения Адама Дженсена по вентиляционным каналам неплохо смотрятся и сейчас. При этом игра была не слишком требовательной к аппаратной составляющей компьютера.

На первый взгляд может показаться, что Human Revolution использует технику рендеринга Forward+. Но популяризация этого метода случилась куда позже выхода игры, и «Человеческая революция» обходится схемой Light Pre-Pass.

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
Карта нормалей, готово 10 %

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
Карта нормалей, готово 40 %

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
Карта нормалей, готово 70 %

Одновременно происходит рендеринг карты глубин. Всего для производства обеих компонент потребовалось 166 вызовов отрисовки.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Тени генерируются с помощью Parallel-Split Shadow Maps. Каждая из теней рендерится единожды для каждого из источников света, которые могут при взаимодействии с объектами создавать тень. В данной сцене таких источников два: один в офисе справа, другой на вершине скульптуры-руки. Каждая из карт теней представляет из себя квадрат 1024×1024 внутри текстуры 4096×3072.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Мелкие объекты пропускаются, возможно, часть невидимых для источника света не учитывается, поэтому этот проход требует всего 52 вызова отрисовки. Карты теней и карта глубин собираются для создания текстуры маски теней. Читается каждый тексель из карты глубин, и его видимость считается для каждого из источников света. Конечный результат выдаётся в 8-битной текстуре RGBA, которая работает как маска. Значение по умолчанию — белый цвет (1, 1, 1, 1), которое означает, что тексель ничем не затемнён. Если тексель попадает в тень какого-либо источника света, то отвечающий за него байт приравнивается нулю. Так можно обрабатывать 4 источника света.

Конечно, использовать байт для хранения только единицы и нуля слишком затратно, поэтому во время этого прохода также выполняется percentage close filtering (PCF), и в этих байтах хранится значение между 0 и 1, а не только крайние значения. Это нужно, чтобы края теней имели плавные переходы.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

По буферу глубины создаётся карта преграждения окружающего света в экранном пространстве (Screen Space Ambient Occlusion, SSAO). Если видеоускоритель поддерживает DirectX 11, то шейдером создаётся размытие с ядром 19×19. На старых карточках это делается пиксельным шейдером.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
SSAO, первый проход

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
Конечный результат с размытием

После генерации значение текстуры SSAO хранится в альфа-канале карты нормалей.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Каждый из точечных источников света обрабатывается по одному. Используется только карта нормалей с SSAO и буфер глубины. Эффект на пиксели зависит только от радиуса света и интенсивности. На этой стадии отражение света различными материалами пока неважно, карта освещения показывает, сколько и какого цвета потенциально отражается. Реальные отражения будут посчитаны позже на основе характеристик материалов. В конкретно этой сцене 45 точечных источников света.

Наконец происходит «реальный» рендеринг, в котором выводится сетка каждого объекта. Цвет каждого пикселя определяется картой нормалей и данными SSAO, масками теней и картами теней, картой освещения, текстурами объектов и свойствами материалов, иногда также используется карта для улучшения отражений. Сначала рендерятся непрозрачные объекты. При рендере используются данные буфера глубины, полученные при составлении карты нормалей.

Затем добавляются декали (таблички на стенах, следы от пуль), прозрачные объекты (стекла в окнах) и искусственные объёмные эффекты освещения.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
Добавлены прозрачные объекты и декали

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
Добавлены эффекты освещения

Эффекты освещения являются группой спрайтов, которые отрендерены в 3D. Это не просто плоские объекты, постоянно обращённые к камере, это двадцатигранники специального масштаба. Свечение обсчитывается полностью процедурно.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Рендер непрозрачных и прозрачных объектов был выполнен с помощью 253 вызовов отрисовки.

Для добавления эффекта засвечивания bloom нужно знать, какие области очень яркие. Human Revolution использует LDR, буфера HDR нет. При предыдущем проходе в альфа-канал передавались данные по интенсивности.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

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

Важной составляющей является сглаживание, иначе изображение будет выглядеть плохо из-за «лесенок» границ. Human Revolution поддерживает множество методов: DLAA, MLAA, FXAA и так далее. В примере Адриана используется FXAA.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
Результат применения FXAA

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
До коррекции цвета

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
После коррекции цвета

Самым последним шагом является добавление пользовательского интерфейса. Это достигается за 317 вызовов отрисовки. Затем изображение выводится на экран. Всего за секунду рендеринг происходит несколько десятков раз. Комфортным считается значение в 60 кадров в секунду и выше, хотя некоторые предпочитают обходиться тридцатью.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Но есть и другие интересные детали. В катсценах и диалогах используется эффект глубины резкости (Depth of Field, DoF), когда элементы не в фокусе размыты.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
Изображение оригинальной сцены уменьшается в два раза

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
Горизонтальное размытие

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
Вертикальное размытие

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх
Готовый результат на экране пользователя. В зависимости от карты глубин пиксельный шейдер будет использовать либо части размытого изображения, либо оригинальное без размытия.

В Human Revolution неплохой эффект силуэта. Это подсветка интерактивных элементов игрового пространства, в конкретном случае золотой обводкой выделяется один объект, с которым игрок может взаимодействовать. В некоторых играх этот эффект реализован примитивно, к примеру, силуэт может отрисовываться уже после рендера всей сцены. Но в Human Revolution силуэт рисуется таким образом, что любой посторонний объект перед подсвечиваемым тоже обводится. В примере, который привёл Адриан, жёлтая линия описывает не только форму мусорного контейнера, но и проходит по фигуре полицейского.

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

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

Источник

Что такое рендеринг? И что такое рендер? Словарь разработчиков компьютерных игр!

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

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

Что такое рендеринг? (для программистов)

Итак, Википедия дает такое определение: Ре́ндеринг (англ. rendering — «визуализация») — термин в компьютерной графике, обозначающий процесс получения изображения по модели с помощью компьютерной программы.

Довольно неплохое определение, продолжим с ним. Рендеринг — это визуализация. В компьютерной графике и 3д-художники и программисты под рендерингом понимают создание плоской картинки — цифрового растрового изображения из 3д сцены.
То есть, неформальный ответ на наш вопрос «Что такое рендеринг?» — это получение 2д картинки (на экране или в файле не важно). А компьютерная программа, производящая рендеринг, называется рендером (англ. render) или рендерером (англ. renderer).

Рендер

В свою очередь словом «рендер» называют чаще всего результат рендеринга. Но иногда и процесс называют так же (просто в английском глагол — render перенесся в русский, он короче и удобнее). Вы, наверняка, встречали различные картинки в интернете, с подписью «Угадай рендер или фото?». Имеется ввиду это 3D-визуализация или реальная фотография (уж настолько компьютерная графика продвинулась, что порой и не разберешься).

Виды рендеринга

В зависимости от возможности сделать вычисления параллельными существуют:

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

В чем суть методов? Как работает растеризация и трасировка лучей? Начнем с растеризация.

Растеризация полигональной модели

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

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

*возможно следующей статьёй будет обещанный мной разбор графического пайплайна, напишите в комментариях нужен ли такой разбор, мне будет приятно и полезно узнать скольким людям интересно это всё. Я сделал отдельную страничку где есть список разобранных тем и будущих — Для разработчиков игр

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

Сложная модель персонажа состоит из мельчайших треугольников и растеризатор генерирует из неё вполне достоверную картинку. Почему тогда заморачиваться с трассировкой лучей? Почему не растеризовать и все? А смысл вот в чем, растеризатор знает только своё рутинное дело, треугольники — в пиксели. Он ничего не знает об объектах рядом с треугольником.

А это значит что все физические процессы которые происходят в реальном мире он учесть не в состоянии. Эти процессы прямым образом влияют на изображение. Отражения, рефлексы, тени, подповерхностное рассеивание и так далее! Все без чего мы будем видеть просто пластмассовые модельки в вакууме…
А игроки хотят графоний! Игрокам нужен фотореализм!

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

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

Трасировка лучей (англ. ray tracing)

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

Мы ограничимся относительно малым количеством, и будем трассировать лучи по нужным нам направлениям.
А какие направления нам нужны? Нам надо определять какие цвета будут иметь пиксели в результирующей картинке. Тоесть количество лучей мы знаем, оно равно количеству пикселей в изображении.

Что с направлением? Все просто, мы будем трассировать лучи в соответствии с точкой наблюдения (то как наша виртуальная камера направлена). Луч встретится в какой-то точке с объектом сцены (если не встретится, значит там темный пиксель или пиксель неба из скайбокса, например).

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

Рендеринг для художников

Но рендеринг это не только программная визуализация! Хитрые художники тоже используют его. Так что такое рендеринг с точки зрения художника? Примерно то же самое, что и для программистов, только концепт-художники выполняют его сами. Руками. Точно так же как рендерер в видео-игре или V-ray в Maya художники учитывают освещение, подповерхностное рассеивание, туман и др. факторы, влияющие на конечный цвет поверхности.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

К примеру картинка выше, поэтапно прорабатывается таким образом: Грубый скетч — Лайн — Цвет — Объем — Рендер материалов.

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

Растеризация векторной графики

Суть примерно такая же, есть данные 2д кривых, это те контуры, которыми заданы объекты. У нас есть конечное растровое изображение и растеризатор переводит данные кривых в пиксели. После этого у нас нет возможности масштабировать картинку без потери качества.

Читайте дальше

Статьи из рубрики «Ликбез для начинающих разработчиков игр«, скорее всего окажутся очень для Вас полезными, позвольте-с отрекомендовать:

Послесловие

В этой статье, я надеюсь, вы осили столько букв, вы получили представление о том, что такое рендеринг, какие виды рендеринга существуют. Если какие-то вопросы остались — смело задавайте их в комментариях, я обязательно отвечу. Буду благодарен за уточнения и указания на какие-то неточности и ошибки.

Дорогой друг! Тебе есть что сказать? Понравился пост? Не стесняйся! Оставь комментарий, нам очень важно ТВОЕ мнение

Источник

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Любая 3D-игра состоит из тысяч и даже миллионов всевозможных цветных линий. Но из-за того, какими способами они появляются на экране, они часто могут выглядеть неровными и отвлекать от игрового процесса.

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

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

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играхРазрешения 10 х 7 пикселей недостаточно для отображения этого треугольника без алиасинга

Некоторые сигналы меняются во времени, а не в пространстве, и в таком случае при выборке значений через заданные интервалы тоже образуется алиасинг. Например, преобразование аналоговой звуковой дорожки в цифровую включает в себя изменение уровня звука каждые несколько долей секунды: так, в случае аудио компакт-диска это происходит каждые 0,02 миллисекунды. Различия между дискретным и исходным сигналом создают временной алиасинг и обычно устраняются путем более быстрой выборки.

Но что, если сигнал представляет собой последовательность движений? В реальном мире кажется, что вещи вокруг нас движутся непрерывно — поэтому, когда мы преобразуем это в поток кадров, мы получаем алиасинг. В мире кино это приводит к странно выглядящему движению — например, когда колеса автомобиля как будто бы вращаются в обратном направлении. Также и в 3D-графике, когда частота кадров рендеринга недостаточно высока для полного представления движения объектов, это приводит к тому, что края выглядят размытыми или неровными, что еще больше усугубляется пространственным алиасингом.

Хотя методы, используемые для решения этих проблем, в совокупности известны как сглаживание (анти-алиасинг, сокращенно AA), в кино и 3D-играх они совершенно разные. Для последних по факту используется множество методов, имеющих самые разные названия. Но прежде, чем мы рассмотрим подробнее наиболее часто встречающиеся алгоритмы, давайте поговорим о разрешении и частоте кадров. Ведь если бы они всегда были сверхвысокими, то и не возникало бы никаких проблем.

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Приведенное выше изображение (оригинал) из теста Wings of Fury было снято с разрешением 1280×720 пикселей. Четырнадцать лет назад, когда Radeon 9800 XT и GeForce FX 5900 Ultra были лучшими из доступных видеокарт, самые большие мониторы имели разрешение около 1600×1200 пикселей — так что разрешение, которое мы используем для тестов сейчас, можно было бы принять за среднее либо низкое (сродни сегодняшнему 1080p).

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Беглый взгляд на крылья самолетов ясно указывает на проблему алиасинга, и особенно это заметно в движении. Большой контраст между цветом пикселей на крыле и фоном неба и облаков создает мерцание при движении самолета по небу. Виной всему относительно низкая частота дискретизации, а потому наиболее очевидным решением было бы ее увеличение. Давайте снова посмотрим ту же сцену в разрешении 4K, или 3840×2160 пикселей (оригинал):

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

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

Каждый пиксель требует обработки, если не указало иное: к нему нужно применить несколько текстур и обработать его многочисленными шейдерами для расчета окончательного цвета. Обычно это узкое место в большинстве игр, и общая частота кадров обратно пропорциональна разрешению. Если верить столь старому бенчмарку, как 3DMark03, переход с 1280х768 до 3840×2160 пикселей снижает среднюю частоту кадров с 1670 до 1274 кадров в секунду — то есть, увеличение количества обрабатываемых пикселей на 740% приводит к снижению производительности всего на 24%. Однако с новыми бенчмарками все выглядит несколько иначе. Это можно легко продемонстрировать, запустив последний 3DMark в различных разрешениях. На графике ниже показана средняя частота кадров первого графического теста в бенчмарке Time Spy.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Переход от 720p к 4K означает увеличение разрешения на 800%, но частота кадров при этом падает на 81%. Хотя игры не обязаны соответствовать этой закономерности, современные AAA-тайтлы, скорее всего, покажут схожие результаты. Это говорит о том, что если мы хотим максимально уменьшить влияние алиасинга, нам понадобится метод получше, чем просто повышение разрешения — ведь чем ниже частота кадров, тем хуже временной алиасинг.

Избыточная выборка сглаживания, или суперсэмплинг (Supersampling anti-aliasing, SSAA)

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

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

На изображении ниже показан классический 4x SSAA в действии. 4x указывает на смешение четырех сэмплов путем вычисления среднего арифметического значения цвета для вывода его на экран. Для этого разрешение увеличивается в 2 раза по обеим осям.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

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

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

Сейчас суперсэмплинг используется уже редко, хотя и нашел новое применение в качестве настроек в драйверах для видеокарт AMD и NVIDIA: в первых эта технология называется виртуальное суперразрешение (Virtual Super Resolution, VSR), во второй — динамическое суперразрешение (Dynamic Super Resolution, DSR). Их можно использовать для сглаживания в некоторых старых играх, в которых нет никакой встроенной системы, или просто для улучшения уже имеющегося изображения.

Множественная выборка сглаживания, или мультисэмплинг (Multisample anti-aliasing (MSAA)

Этот метод впервые появился в исследовательских лабораториях Silicon Graphics в начале 90-х годов. По сути, это тот же SSAA, но с выборочным применением только там, где это действительно необходимо. Ладно, пожалуй, это все-таки не просто SSAA, но такая формулировка должна помочь в понимании, как работает этот алгоритм.

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

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Эта информация может храниться в z-буфере (или буфере глубины), а затем использоваться для определения видимости краев. В приведенном выше примере все крайне просто: белый цвет обозначает фон, черный — примитив.

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

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

А теперь перейдем к самому интересному. Отложив эту карту глубины, вернемся к кадру с исходным разрешением и запустим все наши пиксельные шейдеры для формирования конечного цвета. Затем вернемся к детализированному буферу глубины и для каждого пикселя, что находится в примитиве (т.е. для черных пикселей), выделим цвет шейдера на выходе. Очевидно, что это нужно где-то хранить, так что нам понадобится относительно небольшой буфер для каждой точки из выборки в пикселе. Затем, как и в SSAA, мы сэмплируем и смешиваем детализированный буфер до требуемого разрешения — и получаем фрейм со сглаживанием. Что касается производительности, то мы запускали пиксельные шейдеры только на относительно небольшом количестве точек, но при этом нам пришлось создать и сохранить пару буферов с высоким разрешением.

Таким образом, для мультисэмплинга необходимо большее количество VRAM и более высокая пропускная способность памяти (а также возможность быстрого чтения/записи в z-буферы), но зато он не требует большой мощности от шейдеров. Давайте для сравнения с SSAA воспользуемся старым примером кода AMD.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Код запускает простую сцену с базовыми текстурами и освещением, но большим количеством геометрии, так что алиасинг по краям видно особенно хорошо. Если приблизить изображение, то в верхнем левом углу можно увидеть следующую информацию: каждому кадру требуется в среднем 0,18 миллисекунды на рендеринг и всего 0,02 мс на смешивание для окончательного вывода. Цветовой буфер имеет размер 7,4 МБ, как и буфер глубины.

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Обратите внимание, что на изображении выше время рендеринга увеличилось до 0,4 мс (то есть, на 122%), а время смешивания удвоилось. Кроме того, размер буферов цвета и глубины увеличился в 4 раза. Такова стоимость использования SSAA, и хотя современному графическому процессору не составит особой проблемы произвести такое сглаживание на столь простом примере, но современные 3D-игры — совсем другое дело.

Теперь взгляните на увеличенный фрагмент. Обратите внимание на гладкость линий. Да, осталось еще много «лесенок», но результат выглядит заметно лучше. Было бы это еще не так дорого.

Но теперь рассмотрим MSAA:

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Здесь время рендеринга сцены почти вернулось к тому значению, каким оно было без применения сглаживания (что хорошо), хотя время вывода еще больше увеличилось. Общий объем памяти — где-то на полпути между отсутствием AA и 4x SSAA, отчего может показаться, что MSAA определенно лучший вариант, чем SSAA. Можно сказать, что даже уменьшение алиасинга на краях примитивов выглядит лучше, хотя это больше связано с выбором шаблона сэмплинга, а не с природой самого MSAA. Но если посмотреть на текстуру стены в увеличенной области, станет очевидным один недостаток MSAA.

Там, где SSAA улучшает все, MSAA влияет только на края геометрии, и хотя это не представляет большой проблемы для статических изображений, в движении разница будет куда более заметной. Другая проблема заключается в том, что алгоритм плохо работает с отложенным рендерингом, и, хотя есть способы обойти это, ни один из них не будет «бесплатным» с точки зрения производительности.

Так что же делать, если методы супер- и мультисэмплинга — не лучший выбор?

Быстрое приблизительное сглаживание (Fast approximate anti-aliasing, FXAA)

В 2009 году Nvidia представила новый метод очистки неровных краев фигур в 3D-сценах. В отличие от SSAA и MSAA, реализация FXAA был разработана полностью при помощи шейдеров. С момента выпуска он претерпел не одно улучшение и сегодня активно используется в играх.

Алгоритм представляет собой проход постобработки — то есть, запускается после того, как большая часть рендеринга уже завершена, но до применения таких элементов, как HUD, — и обычно имеет вид однопиксельного шейдера. Первая итерация алгоритма работает следующим образом: сначала мы выбираем буфер, содержащий изображение, которое мы хотим отобразить, и преобразуем значение sRGB в линейную оценку яркости этого пикселя (это мера того, сколько света проходит через заданную область в заданном направлении). Эта часть шейдера состоит всего из нескольких строк и даже может использовать зеленый канал для оценки уровня освещенности. Зачем это нужно? Что ж, следующий шаг в шейдере включает проверку относительного контраста окружающих пикселей по отношению к выбранному пикселю: если разница велика, то это место, скорее всего, окажется границей.

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играхПоследовательность FXAA: найти пиксели на границе, определить ее ориентацию, сдвинуть их, размыть конечное изображение

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

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

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

Пример использования FXAA представлен ниже:

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играхБез AA (слева) и FXAA (справа) — обратите внимание, что деревья и элероны на крыле выглядят намного более гладкими

Какие же минусы? При заполнении кадра высококонтрастными областями, такими как яркие пиксели на темном фоне, они будут смешаны независимо от того, было ли это нужно или нет.

Метод имеет меньшую точность, чем в SSAA или MSAA, ведь он не улавливает детали субпикселей и по сути просто является своеобразным фильтром, который размывает некоторые текстуры. Но принимая во внимание его дешевизну при относительной эффективности, нетрудно понять, почему FXAA все еще часто применяют 12 лет спустя, пусть и переработанный.

Существуют и другие полноэкранные алгоритмы обнаружения границ, аналогичные этому: морфологическое сглаживание (MLAA), разработанное Intel, в свое время послужило вдохновением для создания FXAA; далее оно было доработано разработчиком игр Crytek и университетом Сарагосы в Испании и получило новое название Enhanced Sub-pixel MLAA (SMAA). Самое лучшее во всех этих алгоритмах — что, в отличие от SSAA и MSAA, они могут постоянно обновляться и модифицироваться программистами, настраивающими их в соответствии с приложениями или играми, которые они создают.

Временное сглаживание (Temporal anti-aliasing, TAA)

До сих пор мы рассматривали только методы борьбы с визуальным воздействием пространственного алиасинга. Чтобы противостоять временному алиасингу, вызываемому тем, что 3D-игры генерируют дискретные выборки непрерывного движения, чаще всего используют следующий алгоритм.

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играхОсновная предпосылка временного сглаживания

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

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

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играхСамый распространенный алгоритм TAA

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

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

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

Так выглядит результат TAA:

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играхБез AA (слева) и TAA (справа) — обратите внимание на размытие деталей на крыле

Для разработчиков запрограммировать все это гораздо сложнее, чем добавить в игру SSAA или MSAA. Но современные графические процессоры могут довольно быстро обрабатывать все требуемые шейдеры, и там, где алгоритмы супер- и мультисэмплинга требуют множество сэмплов для каждого кадра (а значит, большей работы модуля вывода рендеринга (ROP) и пропускной способности памяти), TAA эффективно распределяет эти сэмплы по нескольким кадрам. Это значит, что для игр, не сильно ограниченных количеством затенения, можно включить TAA с относительно небольшой потерей производительности.

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

И это еще не все!

Четыре описанных выше метода широко используются в играх для ПК и консолей, особенно в FXAA и TAA. Но на них дело не ограничивается.

Например, когда NVIDIA выпустила видеокарты серии GeForce 9, она также анонсировала модифицированную версию MSAA под названием Multi-Frame Sampled Anti-aliasing (MFAA). По сути, в этом алгоритме с каждым кадром графический процессор изменяет шаблон сэмплирования, и таким образом каждый раз берется и смешивается меньшее количество сэмплов. При усреднении по нескольким кадрам эффект оказывается такой же, как и при обычном MSAA, но с меньшими затратами на производительность. К сожалению, этот алгоритм можно было реализовать только в играх, разработанных под руководством NVIDIA. Тем не менее, он все еще существует, и вы можете получить к нему доступ, включив опцию в панели управления драйвером GeForce.

Совсем недавно та же компания вложила значительные ресурсы в разработку алгоритма AA, использующего искусственный интеллект. Алгоритм, появившийся в 2018 вместе с чипами Turing, имеет название суперсэмплинг при помощи глубокого обучения (DLSS).

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

Сравнение оригинального 1080p и с применением DLSS:

За что отвечает рендеринг в играх. Смотреть фото За что отвечает рендеринг в играх. Смотреть картинку За что отвечает рендеринг в играх. Картинка про За что отвечает рендеринг в играх. Фото За что отвечает рендеринг в играх

Сейчас AMD работает над собственным аналогом DLSS. Можно предположить, что со временем алгоритмы глубокого обучения AA заменят традиционные, но сейчас до этого еще далеко. Такие системы не легче внедрить, чем, скажем, TAA, а визуальные результаты при этом не всегда идеальны.

Мы прошли уже долгий путь со времен Riva TNT и Half-Life, когда просто приходилось мириться с неровными полигонами повсюду, ведь не было никаких технологий, чтобы можно было что-то с этим сделать, но исследования улучшенных методов сглаживания продолжаются и продолжаются.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *