Сколько полигонов в современных играх
Перейти к содержимому

Сколько полигонов в современных играх

  • автор:

Как делаются модели для AAA-игр. Полный гайд по AAA-пайплайну

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

Без лишней воды сегодня мы разберём:

Зачем нужен ААА-пайплайн, из каких этапов он состоит;
Что и когда нужно делать, пошаговое руководство;
Какие ошибки на одном этапе ведут к провалу всей модели;
Каждый из 5+1 этапов пайплайна будем разбирать по отдельности.

01. Что такое AAA-пайплайн

Что означает сокращение ААА?

— A lot of time (много времени);
— A lot of resources (много ресурсов);
— A lot of money (много денег).

ААА-игра — это игра с огромными вложениями на её разработку и маркетинг. Например, бюджет Grand Theft Auto V оценивается в 265 000 000 $.

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

Пайплайн — это конвейер разработки всех 3D моделей

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

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

  • В каком стиле должна быть модель;
  • Сколько полигонов в ней будет;
  • Нужена ли карта неровностей (normal);
  • Используем современные физический корректные материалы (PBR) или делаем плоский цвет с картой блика (а может и без карты блика вовсе);
  • Какое разрешение текстур на квадратный метр (тексель) , и какого разрешения сами текстуры;
  • C какого ракурса ее будут видеть чаще всего, модель на переднем или заднем плане, и будет ли она анимироваться;
  • Как и где печь карты (не забыть сделать скосы для запечки!);
  • Скульптить или создавать фактуры в фотошопе/пеинтере;
  • Правильно разбить все полигоны на треугольники;
  • Нужна ли карта прозрачности, стоит ли разворачивать несколько моделей в один атлас, и как паковать текстуры;
  • Как экспортнуть в движок;
  • Сделать упрощенные модели, которые загружаются на расстоянии (лоды), создать геометрию для просчета физикии (колижн).

Пайплайн состоит из 5 этапов, каждый из которых мы разберём в середине статьи:

  • Драфт (формы и силуэт)
  • Сетка (хайполи, лоуполи)
  • Развертка
  • Запечка
  • Текстуры
  • Подача (это не этап пайплайна, но о подаче мы тоже поговорим)
Важность пайплайна

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

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

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

Всё, что нужно знать об этапах ААА-пайплайна
1. Последовательность

Это значит, что до тех пор, пока ты полностью не закончишь, например, этап блокинга, ты не начинаешь делать low poly, high poly, развертку и прочее. Звучит очевидно, но половина ошибок всех новичков вызана путаницей в последовательности работы

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

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

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

2. Вариации пайплайна

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

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

Пайплайн последователен и универсален

3. Недоработка одного этапа зачастую ведёт к провалу других этапов

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

4. Пайплайн универсален и вездесущ

Не важно, в какой программе и для какого движка ты работаешь.

Ты можешь моделить для Cyberpunk 2077 или делать инди-игру. Ты можешь моделить в Maya или Blender — этапы останутся преждними и их порядок сохранится.

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

Давай подробно разберёмся с каждым из этапов пайплайна на примерах наших 3D моделей.

02. этапы пайплайна

Этап 1: Драфт

Любая модель начинается с драфта, т.е. наброска твоей модели. А любой драфт начинается с референсов. Сбор референсов настолько важен, что про него мы максимально подробно напишем в следующей статье (8 сентября).

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

Драфт — это упрощённая версия ВСЕЙ модели.

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

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

Блокинг — это работа над читаемым силуэтом, правильными пропорциями модели и работа над крупными формами.
В среднем на блокинг уходит до 40 минут.

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

Важно, что на этом этапе мы все еще не заморачиваемся за сетку (слово дня – топология). На геометрии может быть много мусорных ребер и точек, блик может странно вести себя, некоторые полигоны могут иметь больше 4-х точек (n-gon), а булиан может превратить сетку в кашу. И это нормально! Мы все еще ищем формы. Запариваться за сеткой на этом этапе — это нарушение последовательности пайплайна. Именно поэтому это всё ещё «детальный драфт», а не готовая модель.

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

Драфт нашего студента

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

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

Модель преподавателя школы — Антона Агеева

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

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

— Понятно ли, что это за объект?
— Читается ли силуэт модели? Интересный ли получился силуэт?
— Попал ли ты в пропорции? Сравни с референсом
— Понятно ли, как работает эта модель?
— Все ли ключевые объекты ты замоделил?
— Добавил ли ты базовые цвета?
— Тебя устраивает то, как выглядит модель?

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

Как видишь, крупные формы не изменились! Добавились только детали.

Если всё готово, идём дальше.
__________

С этого момента будет много терминов. В последующих статьях мы подробнее каждый из них разберём и расскажем что они означают. Задача этой статьи — показать последовательность и связь этапов пайплайна.

Этап 2: Сетка (lowpoly и highpoly)

Когда драфт готов, ты уверен в своих формах и силуэте, точно знаешь, что модель выглядит круто — можешь приступать к работе с сеткой. Есть 3 вида топологии: легкая LowPoly, супер детализированные HighPoly и MidPoly (о последнем мы говорить не будем, это для опытных чуваков). Обычно для видео игр делают 2 модели: хайполи и лоуполи.

Лоуполи — это максимально легкая 3D модель, в которой каждая плоскость, грань и вершина имеют функциональную задачу: влияют на силуэт, правят блик, решают задачи развертки и так далее.

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

Это та самая модель, которая будет в игре. Именно ее мы будем разворачивать (этап 3), печь (этап 4) и текстурить (этап 5). Задача лоуполи — найти идеальный баланс между выразительностью и легкостью модели. На реальных проектах часто выдают бюджет на полигоны. Например, почти все танки для WoT содержат меньше 50 тысяч треугольников (но бывают исключения).

Помните времена, когда у Сиджея из GTA San Andreas было всего три с половиной пальца? Это было обусловлено ограничениями тогдашних компьютеров. Современные игры работают на тех же технологиях, просто компьютеры стали мощнее, поэтому полигонов на персонажах Rdr 2 в сотни раз больше.

Оптимизированная лоуполи выглядит вот так:

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

Следующим нужно сделать хайполи.

Подробнее о том, как сделать хайполи и лоуполи мы разберём 13 сентября в огромной статье про Сетку. Подписывайся на нас! В разных вариациях пайплайна меняется порядок работы. Где-то сначала делают лоуполи, потом хайполи, например в работе над прямоугольными объектами: домами, пушками, танками и так далее. Где-то наоборот, например в персонажке или на стилизованных проектах. В конечном счёте, это не так важно. На современных играх, как правило, делают и то, и другое.

Хайполи — это супер детализированная модель. На ней нет ограничений по количеству полигонов (главное ограничение — чтобы модель вообще можно было открыть на твоем компе).

Первая задача на хайполи — сделать круглые фаски, фактуры и детали, которые не попали на лоуполи. Хайполи — это этап, когда можно все. Несколько технологий хайполи: SubD, Crease edge и скульпт мы разберем в отдельной статье. Хайполи нужна только для запечки деталей и фасок на лоуполи (этап 4).

SubD хайполи канистры. Главная задача — сделать круглые фаски и чистый блик

Скульпт канистры. Главная задача — добавить вкусных фактур и помятостей.

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

Этап 3: Развёртка

На этом этапе мы разворачиваем лоуполи модель на плоскость.

Зачем это нужно? Запеченные карты (этап 4) и текстуры (этап 5) — это простые плоские картинки, и без развёртки 3D редактор не понимает как применить текстуру к объемной модели.

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

Если на модель печется карта неровностей – то на всех жестких ребрах делается разрез на развертке, но об этом в отдельной статье (19 сентября).

Чекер на всей модели равномерный и квадратный. Потягов нет.

Все стороны 3д модели разложены на плоскость. Это почти как выкройка для одежды

Полный гайд именно по развёртке выйдет 19 сентября как продолжение статей из цикла про пайплайн. Подписывайся на нас!

Этап 4: Запечка

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

Помнишь, какая простая у нас канистра на лоуполи, и какая сложная на хайполи? А теперь посмотри, как выглядит та же самая лоуполи после запечки:

Статья по запечке будет опубликована 26 сентября. Подписывайся на нас!

Этап 5: Текстуры

Это этап покраски лоуполи модели.

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

Все карты канистры в одной картинке. Листай вправо чтобы увидеть их отдельно

Альбедо — чистый цвет канистры

Металнес. Белый цвет означает, что перед нами металл и он отражает весь падающий свет. Черный отвечает за диэлектрики

Рафнес — карта неровности. Белый означает максимальное рассеивание бликов, а черный максимально гладкое отражение.

Нормал мап — карта неровности. Именно она делает то самое волшебство с лоуполи, и именно для этой карты делается хайполи.

АО — карта амбиентного затенения. Черный цвет отвечает за углубления а белый за плоскости без теней

Этап 6: Подача

Этап не очень важный для моделлера в студии, но важный для портфолио. Моделлеру стоит учиться красиво подавать свою модель. Хреновая подача может запороть крутую модель, а классный рендер спасает средние модельки.

На подаче важно поставить симпатичный свет, подчеркнуть объем, нарулить контраста и постобработку. В идеале — добавить окружение или клевое оформление. Эш Торп все свои работы оформляет как постеры, и это выглядит круто!

Финальная подача канистры.

Примеры моделей полного цикла

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

Пайплайн — можно разделить на 2 части:Художественную и техническую.Давай разберёмся, какой из них следует уделить больше внимания.

03. Art vs Технологии

Что важнее для работодателей?

У студий есть 2 требования к хорошей модели:

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

Так вот, именно от драфта (по большей части) зависит, будет модель выразительной или нет. А от остальных этапов зависят технические моменты: достаточно ли оптимизарована модель для игры? И реально ли поместить её в движок?

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

Будущее трёхмерки

Большинство технических этапов смогут автоматизировать роботы. Когда я начинал работать в индустрии — мы мапили и раскладывали большие объекты руками, чтобы текстурить их в фотошопе. Но сейчас, благодаря сабстанс пеинтеру и мари, паковку отдают алгоритмам. Раньше на развертку и текстуры одного огромного ассета уходил месяц, а сейчас всего 2 недели. Трехмерка развивается стремительно. Дальше больше.

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

Очевидно, через 5-10 лет технические этапы станут на порядок проще.

Но пока что ни один робот не сможет моделить КРАСИВО!

Это до сих пор задача художника.

Не будь роботом, который думает только о развёртке и нормале. Стань художником!

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

Принцип 20 на 80

Драфт занимает 20% работы (по времени), и даёт ей 80% выразительности.
Технические этапы занимают 80% работы. Они делают модель идеальной для видео игры, но дают всего лишь 20% выразительности.

Время на изучение

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

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

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

Этот навык прокачивается всю жизнь. Я встречал очень опытных чуваков, которые даже спустя 10 лет крутой карьеры продолжают открывать для себя новые стороны искусства.

А теперь самое интересное:

Какой контент есть в интернете?

80% контента рассказано про кнопки и техническую составляющую.

20% контента (а то и меньше) посвящено АРТ части.

Мы заметили, что именно по художественной части в трёхмерке крайне сложно найти информацию.

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

Поэтому мы настоятельно рекомендуем тебе:

— Изучить весь пайплайн
— Освоить все технические этапы, они будут с тобой всю жизнь
— Но большую часть времени уделяй именно драфтам! Именно в них кроется настоящий АРТ.

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

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

Мы объединили несколько сотен трёхмерщиков в закрытом Дискорде, которые помогают друг другу. Искренне, безвозмездно и без хейта.

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

Изучи весь ААА-пайплайн с упором на Драфтыи стань воином вместе с нами!

04. Изучи полный цикл


Уже 1 ноября мы запускаем четвертый поток курса Draft Punk!

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

Будут топовые преподы и нереально прокачивающая программа. На данный момент это лучший наш курс, где ты узнаешь всё как про АРТ часть, так и про кнопки и весь пайплайн.

Обучение начинаем 1 ноября.

Читай все подробности в этой статье.

Отзывы о XYZ School можно прочитать здесь: https://headkurs.com/

И ещё тебя ждёт целых 6 статей по пайплайну!

Это была большая статья, и я рад, что ты дочитал до конца.Но это ещё не всё! Скоро выйдут новые статьи из цикла про пайплайн.

3D в играх: Полигоны

Полигон (Polygon) – это плоскость в евклидовом пространстве. Пространство имеет размерность три, соответственно, имеются три координаты: X, Y, Z. Условно их можно обозвать как длина, высота и глубина. В программном обеспечении для 3D нет единого стандарта относительно, так сказать, ориентации данных координат, хотя, как правило, координата X параллельна условном горизонту, т.е. это длина, а вот условной высотой может быть как Y так и Z. Соответственно, условной глубиной может быть как Z, так и Y. Но нам это не столь суть важно, примем для последующего материала представление, показанное ниже.

У полигона есть вершины, минимум три, максимум, теоретически, бесконечность. Практически максимум – много. Но в играх используются треугольные полигоны, т.е. полигон имеет три вершины. Почему именно три? Через три точки в пространстве можно провести только одну плоскость, что упрощает расчеты и позволяет избежать искажений (артефактов) на итоговой картинке связанных с тем, что вершины полигона могут лежать не в одной плоскости.

Однако в программах трехмерного моделирования принято пользоваться 4-х угольными полигонами, а вот 5-ти и больше, как правило, под запретом. Поэтому при моделировании приходится следить за тем, чтобы все 4 вершины полигона были в одной или почти одной плоскости. А как же игры? спросите вы. Полигон с 4-мя вершинами математически очень просто превратить в два треугольных с двумя общими вершинами, что и делается автоматически при экспорте в игровой движок.

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

Почему сетка? Из полигонов создаются трехмерные объекты для игр (и не только), и если рассматривать все эти полигоны издалека включив отображение сторон полигона, они же ребра, то все это похоже на сетку.

Вообще, полигон – это то, чего на самом деле не существует, это всего лишь математика. У него нулевая толщина. Это координаты трех (для игр, далее будем говорить только о треугольных полигонах, если не будет указано иное) точек в трехмерном пространстве. И то, как отображать эти несуществующие полигоны, — зависит исключительно от той или иной компьютерной программы. Как правило, существуют три основных вида отображения: каркасная сетка, полигональная сетка, «чисто» полигональное представление. На рисунке ниже даны все три вида.

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

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

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

Так вот, та сторона, из которой «выходит» вектор нормали — и определяет лицевую сторону полигона, поэтому с противоположной стороны полигон прозрачен при визуализации, вернее обратной стороны просто не существует. Именно поэтому когда игровой персонаж из-за некорректных коллизий проваливается сквозь текстуры, то почти все сверху кажется полупрозрачным – текстур, вернее обратной стороны у полигона не существует.
Ниже скриншот из игры Batman Arkham Knight.

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

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

Ниже показан фрагмент модели здания со стеной, имеющей реальную толщину. Синим показано направление нормали у полигонов.

Для совсем тонких предметов, таких как лист бумаги, применяется другой подход и зависит он от конкретного игрового движка. Например, может применяться специальный двухсторонний материал или отключаться параметр Backface culling, и в этом случае объект будет выглядеть одинаково с обеих сторон. (Подробнее про Backface culling можно почитать тут: Полигоны, свободная камера и MGS 5)

Теперь поговорим о том, какие бывают трехмерные полигональные модели.

3D модели принято делить на низкополигональные (low poly) и высокополигональные (high poly). Как несложно догадаться – разница в количестве полигонов, причем разница не абсолютная, а, как и все в нашем мире, относительная.

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

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

Низкополигональные модели применяются в основном в играх или для анимации, когда визуальный реализм не имеет первостепенного значения. Есть два основных способа получения низкополигональной модели: непосредственное моделирование с прицелом на малое количество полигонов или упрощение высокополигональной модели. То же справедливо и для high poly моделей (если не брать в расчет 3D сканирование): их получают путем усложнения и добавления полигонов низкополигональной модели, либо моделируют сразу из расчета максимально необходимого количества полигонов. Какой подход применятся в том или ином случае зависит от многих факторов, как то: геометрии самой модели, применяемого программного обеспечения, наличия похожих моделей, принятого в студии-разработчике порядка разработки, предпочтений 3D-художника и т.п.

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

Ниже показаны сферы одинакового диаметра с различным количеством полигонов.

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

Ниже представлена эволюция полигональной Лары Крофт.

Как же получают 3D модели? Традиционно для этого используется полигональное моделирование в специальных программных пакетах, как то: 3ds Max, Maya, Cinema 4D и т.п. В последнее время к разработке также подключают программы для так называемой трехмерной лепки, к примеру ZBrush и 3D-Coat. Ну, и с развитием технологии 3D сканирования, модели получают путем этого самого сканирования с последующей оптимизацией полигональной сетки.

Если используется традиционное полигональное моделирование, то 3D художнику необходимо от чего-то отталкиваться. Для этого используются так называемые референсы, или, по-другому, изображения того, что необходимо смоделировать. Это могут быть фотографии (для реальных предметов или персонажей), концепт-арты (для вымышленных), или даже существующие объекты. К примеру, необходимо смоделировать существующие кубики Lego. Самая в данном случае хорошая идея – иметь их под рукой и моделировать, непосредственно вертя в руках эти самые кубики.
Ниже изображение референса и 3D модели (без текстур).

Теперь вернемся к вопросу: а зачем при разработке 3D игры иметь в наличии сразу две модели одного и того же объекта — high poly и low poly? Высокополигональная модель непосредственно в игре использоваться не будет, но она необходима для такого важного процесса, как запекание текстур. Так называют подготовку целого ряда текстур или, как их еще называют, карт. Это обычные файлы изображений (с необычными, на первый взгляд, рисунками в них) цель которых как можно реалистичнее представить модель в игре и взять на себя, так сказать, часть геометрии. По сути – это создание 3D иллюзии там, где добиться этого полигонами сложно, неподъемно по производительности или просто нецелесообразно.

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

Ниже упрощенно схематически показано как смешивание запеченных с high poly модели карт, в сочетании с текстурой дерева, в результате дает реалистичное изображение.

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

Правда, тут есть один недостаток: эффект лучше всего действует когда наблюдатель расположен под углом 90° относительно полигонов с такой вот имитацией дополнительной геометрии. С уменьшением или увеличением угла обзора «обман» становится виден все отчетливее и отчетливее. Но это неизбежная плата за возможность приблизить картинку к реализму, не превратив игру в неиграбельную.

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

Если уж мы говорим про 3D в играх, то следует обязательно упомянуть такую технологию, как LOD, сокращенно от Level of Detail, она же уровень детализации. Суть ее сводится к тому, что в зависимости от того, насколько тот или иной объект близко располагается от игрового персонажа, или какой процент высоты экрана занимает, то используются модели с различного рода детализацией. Опять же, все ради оптимизации. Чем ближе к виртуальной камере тот или иной объект, тем более детализированная модель подставляется. На практике часто количество таких моделей ограничивается тремя: для переднего, среднего и заднего планов. И обозначаются, как правило: LOD_0, LOD_1, LOD_2. Это все варианты низкополигональной игровой модели.

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

Вот, наверно, вкратце и все про полигоны. Если остались необозначенные или нераскрытые моменты – пишите про это в комментариях.

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

Сколько полигонов в современных играх

Фанаты видеоигр решили составить список персонажей с самым высоким количеством полигонов. Из любопытства геймеры пришли к достаточно неожиданным выводам.

Как стало известно Gamebomb.ru, игроки составили достаточно внушительный список главных героев современных блокбастеров, которые могут похвастать одними из самых детализированных персонажей. К примеру, количество полигонов главных героев GTA V достигает отметки в 30 тысяч. Герои The Last of Us насчитывают до 40 тысяч полигонов, а мужская и женская версия Райдера в Mass Effect: Andromeda — около 65 тысяч полигонов.

Список персонажей с наивысшим количеством полигонов:

  • Тревор и Майкл в GTA V — 24 тысячи и 30 тысяч
  • Элли и Джоел в The Last Of Us — 31 тысяча и 40 тысяч
  • Райдер в Mass Effect: Andromeda — 65 тысяч
  • Джек Джойс в Quantum Break — 75 тысяч
  • Мариус в Ryse: Son of Rome — 80 тысяч
  • Джек Бейкер в Resident Evil 7 — 121 тысяча
  • Автомобиль Ruf в Project CARS — 180 тысяч
  • Лара Крофт в Rise of the Tomb Raider — около 200 тысяч
  • Элой в Horizon: Zero Dawn — 600 тысяч

Джоел The Last of Us

Тревор Grand Theft Auto V

Майкл Grand Theft Auto V

Лидерами в списке оказались такие игры, как Resident Evil 7 и Rise of the Tomb Raider, персонажи в которых представлены несколькими сотнями тысяч полигонов. Но даже это не идет ни в какое сравнение с Horizon: Zero Dawn. По словам разработчиков, только прическа Элой насчитывает 100 тысяч полигонов, а вся модель, по оценка геймеров достигает отметки в 600 тысяч полигонов.

Герои игр, занимающие первые места в списке, безусловно выглядят невероятно реалистично. Тем не менее, современные движки способны работать с персонажами с количеством полигонов на несколько порядков выше. Так, по данным Gamebomb.ru, в 2015 году издатель представил демонстрацию Square Enix под названием WITCH CHAPTER 0, в которой только прическа героини создана из 6 миллионов полигонов, а вся модель насчитывает более 11 миллионов.

WITCH CHAPTER 0

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

Введение

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

Я начинал карьеру как 3D-художник ещё в эпоху первой PlayStation, а позже стал программистом графики. Хотел бы я прочитать эту статью перед тем, как впервые начал создавать 3D-модели для игр. Рассмотренные в ней фундаментальные основы пригодятся многим художникам. Хотя бОльшая часть информации из этой статьи не повлияет значительно на продуктивность вашей ежедневной работы, она даст вам базовое понимание того, как графическая карта (graphics processing unit, GPU) отрисовывает создаваемые вами меши.

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

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

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

Рисунок 1. Массив значений простого полигона.

В данном случае четыре вершины в трёх измерениях (x, y и z) дают нам 12 значений. Для создания полигонов второй массив значений описывает сами вершины, как показано на рисунке 2.

Рисунок 2. Массив ссылок на вершины.

Эти вершины, соединённые вместе, образуют два полигона. Заметьте, что два треугольника, в каждом из которых по три угла, можно описать четырьмя вершинами, потому что вершины 1 и 2 используются в обоих треугольниках. Чтобы эти данные мог обработать GPU, предполагается, что каждый полигон является треугольным. GPU ожидают, что вы работаете с треугольниками, потому что они предназначены именно для их отрисовки. Если вам нужно отрисовать полигоны с другим количеством вершин, то необходимо приложение, разделяющее их на треугольники перед отрисовкой в GPU. Например, если вы создаёте куб из шести полигонов, каждый из которых имеет по четыре стороны, то это не более эффективно, чем создание куба из 12 полигонов, состоящих из трёх сторон; именно эти треугольники будет отрисовывать GPU. Запомните правило: считать нужно не полигоны, а треугольники.

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

Отрисовка полигона

При отрисовке полигона GPU первым делом определяет, где нужно рисовать полигон. Для этого он вычисляет позицию на экране, где должны находиться три вершины. Эта операция называется преобразованием (transform). Эти вычисления в GPU выполняет небольшая программа под названием «вершинный шейдер».

Вершинный шейдер часто выполняет и другие типы операций, например, обработку анимаций. После вычисления позиций всех трёх вершин полигона GPU вычисляет, какие пиксели находятся в этом треугольнике, а затем начинает заполнять эти пиксели с помощью ещё одной маленькой программы под названием «фрагментный шейдер» (fragment shader). Фрагментный шейдер обычно выполняется один раз на пиксель. Однако в некоторых редких случаях он может выполняться несколько раз на пиксель, например, для улучшения сглаживания (антиалиасинга). Фрагментные шейдеры часто называются пиксельными шейдерами, потому что в большинстве случаев фрагменты соответствуют пикселям (см. рисунок 3).

Рисунок 3. Один полигон, отрисованный на экране.

На рисунке 4 показан порядок действий, выполняемый GPU при отрисовке полигона.

Рисунок 4. Порядок действий GPU, отрисовывающего полигон.

Если разделить треугольник на два и отрисовать оба треугольника (см. рисунок 5), то порядок действий будет соответствовать рисунку 6.

Рисунок 5. Разделение полигона на два.

Рисунок 6. Порядок действий GPU, рисующего два полигона.

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

Использование кэша вершин

Если посмотреть на два полигона из предыдущего примера, то можно увидеть, что у них есть две общие вершины. Можно предположить, что эти вершины придётся вычислять дважды, но механизм под названием «кэш вершин» (vertex cache) позволяет использовать результаты вычислений повторно. Результаты вычислений вершинного шейдера для повторного применения сохраняются в кэш — небольшую область памяти, содержащую несколько последних вершин. Порядок действий при отрисовке двух полигонов с использованием кэша вершин показан на рисунке 7.

Рисунок 7. Отрисовка двух полигонов с использованием кэша вершин.

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

Разбираемся с параметрами вершин

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

  • Текстурные координаты
  • Нормали

При UV-наложении на 3D-объект любой создаваемый шов будет означать, что вершины вдоль шва не могут быть общими. Поэтому в общем случае стоит избегать швов (см. рисунок 8).

Рисунок 8. UV-наложение швов текстуры.

Для правильного освещения поверхности каждая вершина обычно хранит нормаль — вектор, направленный от поверхности. Благодаря тому, что все полигоны с общей вершиной задаются одной нормалью, их форма кажется плавной. Это называется плавным затенением (smooth shading). Если каждый треугольник имеет собственные нормали, то рёбра между полигонами становятся выраженными, а поверхность кажется плоской. Поэтому это и называется плоским затенением (flat shaded). На рисунке 9 показаны два одинаковых меша, один со сглаженным затенением, а второй — с плоским.

Рисунок 9. Сравнение сглаженного с плоским затенением.

Эта геометрия со сглаженным затенением состоит из 18 треугольников и имеет 16 общих вершин. Для плоского затенения 18 треугольников нужно 54 (18 x 3) вершины, потому что ни одна из вершин не является общей. Даже если два меша имеют одинаковое количество полигонов, скорость их отрисовки всё равно будет разной.

Важность формы

GPU быстро работают в основном потому, что они могут выполнять множество операций параллельно. В маркетинговых материалах GPU часто делается упор на количество их конвейеров (pipeline), определяющих количество операций, которые может выполнять GPU одновременно. Когда GPU отрисовывает полигон, он отдаёт множеству конвейеров задание заполнять квадраты пикселей. Обычно это квадрат размером восемь на восемь пикселей. GPU продолжает это делать, пока не будут заполнены все пиксели. Очевидно, что треугольники не являются квадратами, поэтому некоторые пиксели квадрата окажутся внутри треугольника, а другие снаружи. Оборудование работает со всеми пикселями квадрата, даже с теми, которые находятся за пределами треугольника. После вычисления всех вершин в квадрате оборудование отбрасывает пиксели за пределами треугольника.

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

Рисунок 10. Три тайла для отрисовки треугольника.

Полигон на рисунке 11 с точно таким же количеством пикселей, но растянутый, требует для заполнения большего количества тайлов; бОльшая часть результатов работы в каждом тайле (красная область) будет отброшена.

Рисунок 11. Заполнение тайлов в растянутом изображении.

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

Рисунок 12. Поверхности, триангулированные двумя разными способами.

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

Перерисовка

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

Рисунок 13. Два разных способа отрисовки шестилучевой звезды.

Можно решить, что быстрее отрисовать два полигона, чем 10. Однако в данном случае это скорее всего неверно, потому что пиксели в центре звезды будут отрисовываться дважды. Это явление называется перерисовкой (overdraw). По сути оно означает, что пиксели перерисовываются больше одного раза. Перерисовка естественным образом возникает во всём процессе рендеринга. Например, если персонаж частично скрыт колонной, то он будет отрисован целиком, несмотря на то, что колонна перекрывает часть персонажа. Некоторые движки используют сложные алгоритмы, позволяющие избегать отрисовку объектов, невидимых на конечном изображении, но это трудная задача. Центральному процессору часто труднее выяснить, что не нужно отрисовывать, чем GPU отрисовать это.

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

Реализация ящика на полу

На рисунке 14 показана простая сцена: стоящий на полу ящик. Пол состоит всего из двух треугольников, а ящик состоит из 10 треугольников. Перерисовка в этой сцене показана красным цветом.

Рисунок 14. Стоящий на полу ящик.

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

Рисунок 15. Дыра под ящиком, позволяющая избежать перерисовки.

В подобных случаях всё зависит от вашего выбора. Иногда стоит уменьшить количество полигонов, получив взамен перерисовку. В других ситуациях стоит добавить полигонов, чтобы избежать перерисовки. Ещё один пример: две показанные ниже фигуры являются одинаково выглядящими мешами поверхности с торчащими из неё остриями. В первом меше (рисунок 16) острия расположены на поверхности.

Рисунок 16. Острия расположены на поверхности.

Во втором меше на рисунке 17 в поверхностью под остриями прорезаны отверстия, чтобы уменьшить объём перерисовки.

Рисунок 17. Под остриями вырезаны отверстия.

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

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

Когда у Z-буферов возникает Z-конфликт

Когда GPU отрисовывает два накладывающихся друг на друга полигона, то как он определяет, какой из них находится поверх другого? Первые исследователи компьютерной графики потратили много времени на исследование этой проблемы. Эд Кэтмэлл (который позже стал президентом Pixar и Walt Disney Animation Studios) написал статью, в которой изложил десять различных подходов к решению этой задачи. В одной части статьи он замечает, что решение этой задачи будет тривиальным, если у компьютеров будет достаточно памяти для хранения одного значения глубины на пиксель. В 1970-х и 1980-х это был очень большой объём памяти. Однако сегодня так работает большинство GPU: такая система называется Z-буфером.

Z-буфер (также известный как буфер глубин) работает следующим образом: с каждым пикселем связывается значение его глубины. Когда оборудование отрисовывает объект, оно вычисляет, как далеко от камеры отрисовывается пиксель. Затем оно проверяет значение глубины уже существующего пикселя. Если он дальше от камеры, чем новый пиксель, то новый пиксель отрисовывается. Если уже имеющийся пиксель ближе к камере, чем новый, то новый пиксель не отрисовывается. Такой подход решает множество проблем и работает, даже если полигоны пересекаются.

Рисунок 18. Пересекающиеся полигоны, обработанные буфером глубин.

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

Рисунок 19. У поверхностей на одинаковой глубине появляются проблемы с отображением.

Это называется Z-конфликтом (Z-fighting) и выглядит очень забагованно. Часто Z-конфликты становятся тем хуже, чем дальше поверхность от камеры. Разработчики движков могут встраивать в них исправления, позволяющие сгладить эту проблему, но если художник создаёт достаточно близкие и накладывающиеся друг на друга полигоны, то проблема всё равно может возникать. Ещё одним примером может служить стена с висящим на ней постером. Постер находится почти на той же глубине от камеры, что и стена за ним, поэтому очень высок риск Z-конфликтов. Решение заключается в том, чтобы вырезать в стене отверстие под постером. При этом также снизится объём перерисовки.

Рисунок 20. Пример Z-конфликта накладывающихся друг на друга полигонов.

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

Использование вызовов отрисовки

GPU стали чрезвычайно быстрыми — настолько быстрыми, что ЦП могут за ними и не успевать. Так как GPU по сути предназначены для выполнения одной задачи, их гораздо проще заставить работать быстро. Графика по своей природе связана с вычислением множества пикселей, поэтому можно создать оборудование, вычисляющих множество пикселей параллельно. Однако GPU отрисовывает только то, что ему приказывает отрисовывать ЦП. Если ЦП не может достаточно быстро «кормить» GPU данными, то видеокарта будет простаивать. Каждый раз, когда ЦП приказывает GPU что-то отрисовать, называется вызовом отрисовки. Простейший вызов отрисовки состоит из отрисовки одного меша, в том числе одного шейдера и одного набора текстур.

Представьте медленный процессор, способный передавать 100 вызовов отрисовки за кадр, и быстрый GPU, который может отрисовывать по миллиону полигонов за кадр. В таком случае идеальный вызов отрисовки (draw call) может отрисовывать 10 000 полигонов. Если ваши меши состоят всего из 100 полигонов, то GPU сможет отрисовывать только 10 000 полигонов за кадр. То есть 99% времени GPU будет простаивать. В таком случае мы можем запросто увеличить количество полигонов в мешах, ничего при этом не потеряв.

То, из чего состоит вызов отрисовки, и затраты на него сильно зависят от конкретных движков и архитектур. Некоторые движки могут объединить в один вызов отрисовки множество мешей (выполнить их батчинг, batch), но все меши при этом обязаны будут иметь одинаковый шейдер, или могут иметь другие ограничения. Новые API наподобие Vulkan и DirectX 12 разработаны специально для решения этой проблемы при помощи оптимизации того, как программа общается с графическим драйвером, увеличивая таким образом количество вызовов отрисовки, которые можно передать за один кадр.

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

Заключение

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

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

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

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

Первое и довольно распространенное заблуждение — модель состоит из квадратных поликов с четырьмя углами. На самом деле в полигоне может быть сколько угодно углов (вершин), но только в рамках 3D редактора, для удобства. Видеокарта все равно видит их триангулированными.

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

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

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

Слева окно юви координат, используется цветная текстура для удобства работы над разверткой. Любая манипуляция вершин слева приводит к смещениям текстуры по модели:

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

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

Средний полигонаж — тут все относительно, это может зависеть от стилистики игры, от того как часто и как близко будет виден предмет для игрока. Персонажи, они больше всего заслуживают внимания, среднее количество трисов на их моделях разнится от 13k до сотни тысяч, к примеру игра Assassin’s Creed 3: Бенджамин Франклин-18k, Ли Чарльз-26k, Коннор-28k, Дезмонд-15k, Хэйтем-20k ( тысяч трисов). Как видите есть разница и иногда большая, например от того какая у них одежда и внимание к лицевой анимации в кат сценах, к примеру у Дезмонда нет никаких плащей или одежды что могла бы плавно колыхаться при движении персонажа, потому и хватило ему 15 тыс.

Джоэл. Главный герой игры “the last of us” 40 000 трисов, лицо и руки — основные места плотности сетки ибо нуждаются в качественной анимации.

Что касается объектов окружения, оружия, то там уже уже более высокая разница.

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

Текстура — разглядывая пиксели на модели вы на самом деле смотрите не на одну конкретную текстуру (если это не старенькая игрушка), а на материал, который создается с использованием нескольких текстур, вроде Base Color, Normal Map и прочих, характерных для PBR — physically based rendering (физически корректный рендеринг). PBR это довольно сложная тема для краткого описания, потому постараюсь не нудить: Используется почти во всех (99%) современных играх с реалистичной графикой. На одной модельке используется особый набор текстурных карт, состоящий как минимум из четырех, Base color — придает основные цвета модели, Roughness — карта отвечает за микро поверхность материала, придавая шероховатость или глянцевость, Metalness — карта металлических свойств, Normal — создает фейковые неровности на совершенно ровном полигоне, весь текстурный сет называют материалом. Это далеко не весь список а лишь основной, вот один из примеров PBR материала:

Всю игру можно сделать в 3ds max — Да, встречались мне такие люди, по какой то причине в их голове процесс разработки укладывается лишь один, когда то и где то услышанный софт по 3D. Для разработки полноценного персонажа порою хватает двух программ, но не для всех, некоторые владеют более пятью программами связанными с 3D и им проще работать, потому как есть моменты которые легче сделать там или в другом месте, как например замоделить в blender3d, развернуть в UVlayout, затекстурить в Substance Painter, отрендерить в Marmoset toolbag — это кстати то чем владею на данный момент я, довольно скромный список. И это только создание модели, дальше ее нужно импортировать и настроить в игровом движке, если это персонаж, то сюда можно вставить еще пару программ, например скульптить в Zbrush и анимировать в Maya, все это можно сделать и в том же blender3d, там даже есть свой игровой движок, при желании можно вообще не выходить оттуда, но как я уже сказал — некоторые процессы проще и быстрее в другом софте.

Я написал достаточно много, но не описал я еще больше. Скриншоты как мои так и с сайта с Artstation — кстати там можно увидеть полно примеров 2d, 3d как игровых так и рендеров (ссылку найдете в гугле). Спасибо за внимание

Дубликаты не найдены

Можно посмотреть на твои работы ?)

Просто сам 3D моделингом увлекаюсь)

Одна их моих последних работ) делаю на работе в свободное время)

1. описание нормалмапы неточное так можно и паралакс и теселяцию и . под это описание подвести. Основной сути в описание не упоминается.

2. важны в модели, если говорить про "оптимизацию", не количество треугольников, а количество вершин. (К примеру, при обработки движком модели происходит сплит модели по "группам сглаживания" и как следствие дублирование вершин на эйджах с разными группами, именно поэтому обработка модели проходит меднение в сравнение аналогичной с одной группой (софт эйджы). Соответственно в проеденном случае на модели к примеру с 90 углом где не обойтись 1 группой есть смысл добавить фаску при этом увеличив количество треугольников, но так как это будет нивелироваться тем что будет отсутствовать дублирование вершин при обработки модели движком, то такое увеличение количество треугольников ни как не скажется на производительности, но выигрыш по внешнему виду модели будет очевидный.) Именно по этому говоря про оптимизацию более корректно говорить про количество вершин в модели.

3. Упоминая про ПБР нужно упомянуть и про его виды, ибо разница даже с точки зрения текстурирования велика.

з.ы читал выдержками может чего те так понял сори

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

Кстати, сам тоже занимался моделлингом. лет 7+ суммарно, наверное.
По принципу "Learned it hard way" пришел к выводу касательно геймдев(да и в целом) моделлинга:
НИКОГДА не модельте под subdivide, если это не органика.

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

Особенно это роляет, когда делаете машины. Тут ручками отлично получается и без мусора(а это, напомню, дает вам правильные отражения на материале).
Сетку,опять же, лучше делать ручкам по технике "antinurbs"(гуглите — но тут я бы не делал чисто boolean’ом, а резал бы руками с привязкой к вершинам второго обьекта, который нужно "врезать" в основной).

Все сглаживания стандартным группами сглаживания(или hardedge если maya), а затем, по острым граням фаски.

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

+ не забывайте про edit normals. Модель должна выглядеть ОТЛИЧНО даже без карт нормалей. Если есть "темные места" — ваш косяк.

А еще в 3sMax очень хороший инструмент ретопологии. Топоганы и Збраши, НЕ лучше того,что и так есть в максе.

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

//Под сабдив говорите не стоит делать?
Да не стоит(всю модель, так чтобы нажать "дивайд" и получить готовую хайполи). Такая техника сокращает время моделлинга раза в два. Но можете игнорировать, если хотите — ваше право ��

Запекать нужно для небольшого "улучшения" качества вертекс нормала( в сочетании со спекуляр картой) и мелких рельефных деталей. Нормал мап, грубо говоря, для фактуры. Объема он не добавляет. Это миф.

c дисплейсментом вы не знакомы? И нормалом можно не только мелкие детали запекать

Дисплейсмент в геймдеве? Мы про геймдев лоу поли ��
Параллакс маппинг, да, используется, но относительно редко я его видел и в основном для ландшафтов.

ну если ты играл последний раз в 2005, то да дисплейс в играх новинка)

Еще раз, читай внимательно — я сказал РЕДКОСТЬ, а не в новинку.
И это не называется дисплейсом. И да, оно фактически нигде не используется, кроме как для ландшафтов.

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

// Одно то что адекватная привязка вершины к плоскости хайполи которую ты ретопишь там отсутствует
Grafit tools.Там офигенная привязка вертекса к поверхности( и вообще, снап на любой вкус) и сетка по вертексам строится быстро. Возможно, конкретно тебе неудобно/не привык/ не разобрался. Тоже, по-началу, плевался, а потом дал этой штуке шанс и.
Я спокойно делаю в максе ретоп без малейшего дискомфорта. Не нужно ничего экспортить никуда — все в рядом.И вертекс нормали можно выправить, если что, на лету и развертку.
И тем не менее, в максе достаточно хорошая ретопология, чтобы не использовать, если уж не топоган(хотя, он мне не очень нравится), то зибраш точно.

Freeform — PolyDraw шикарная весч для ретопо, с ее введением в макс забыл про вылетающий топоган как про страшный сон

Почитал, поржал, пиши еще, такого бреда слышать не приходилось еще).

"Ржут" подростки у которых проблемы с агрессией ввиду нереализованной самооценки, друг мой. А взрослые люди указывают на ошибки с примерами и без высмеивания.
От тебя никакой конкретики, кроме необоснованных выпадов я не вижу. Хотя, видимо, я слишком много жду.

Дружище, я на работе делаю эти самые лоу поли. Не перед тем ты "знаниями" выпендриться решил и не том посте, сочувствую.
//Невозможно что-то конкретное выделить, так как все что ты написал это полный бред.
Про "невозможно" расскажи кому-нибудь другому, глупая уловка.
Это и называется — нечего сказать. Лишь бездарные попытки вбросить.
Нет примера как надо, нет конкретики — извини, но твои слова не более, чем болтовня, что нелестно характеризует тебя, в данной ситуации. Увы, ты не показал, что способен на большее.

Да какие вбросы), я бы с удовольствием посмотрел на твои работы (без подколов, я серьезно)

"Нормал мап, грубо говоря, для фактуры. Объема он не добавляет. Это миф." — нормал для того чтобы шейдинг объекта лоупольного был, как у хайпольного.

"НИКОГДА не модельте под subdivide, если это не органика." — ты про хардсурфейс моделинг слышал? (техника, роботы и тд, например делаются)

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

Ничего себе у тебя работы 0_0, вот это зависть, очень круто чувак) А с кем/с чем учился если не секрет? Уж безумно сильно мне нравится такой стиль

//нормал для того чтобы шейдинг объекта лоупольного был, как у хайпольного.
Я где-то это отрицал в оригинальном посте? Такое ощущение, что по диагонали читаешь. Хотя, я бы сказал, "похожим" на хайполи, нежели "как хайполи".

Многие новички считают, что нормал — это магия, которая нахаляву дает объем. Это не так. вот об этом я говорил. Для новичков. Но зачем вдумываться в написанное. главное нахамить поскорее и поржать!

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

// ты про хардсурфейс моделинг слышал? (техника, роботы и тд, например делаются)
Слышал, делал и. Я считаю принцип "все под дивайд, а там все равно ретоп" избыточным в плане трудозатрат. Если у вас другой пайплайн — ок.

Руками очень удобно и быстро моделить сложные участки. При этом, не получая погрешностей, которые дает сглаживание. Особенно, если делаешь сетку автомобиля — там мельчайший косяк это убитые отражения(нормал мап не используется).

// а то может я тут мастеру что-то пытаюсь сказать.
При чем тут "мастеру"? Опять какой-то максимализм.

//Вот пой портфель
Прикольные четыре меха ты сделал, но я бы не сказал, что это повод для для такой самооценки.

И да, очень рад, что ты аутсорсишь для ЕА и прочих на Васильевском (если в Питере, конечно), но, что, нельзя общаться нормально? Хреновое впечатление о компании создаешь.

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

//Чел, ты пришел поделиться "мудростью"
А вот это уже ты сам придумал. Я поделился ОПЫТОМ. Своим личным. Если для тебя такие слова ассоциируются с чем-то неприятным, извини, но это твои заскоки.
И заметь, ты ничего не отвечаешь мне по делу и опять пытаешься сместить обсуждение на мою личность, намекая на то, что я, мол, не имею портфолио и поэтому со мной не о чем говорить.
При этом, показал совершенно обыкновенные работы со своей стороны, непонимания используемых технологий и тактично забыл про то, что я тебе ответил и по делу и про твою хамскую монеру ведения диалога, потому что. сказать тебе нечего. Дешевый трюк, чтобы аккуратненько выйти из невыгодной для тебя ситуации.

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

Дружище, произошло вот что: ты пришел, нахамил и облажался.

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

//в которых ты ничего не понимаешь, судя по всему.
Да ну? То то я один из нас двоих рассказываю о технических подробностях. Вот еще немного, для наших читателей:
Вероятно, ты забыл, что нормал — это, все лишь, карта, которая используется в шейдере. Именно шейдер решает что ему сделать с данными, которые дает ему карта о пикселе. Решает математической формулой, которую ты можешь заменить на что угодно.
Таким образом, нормал мап это лишь данные, который помогают шейдеру затенять и засветлять некоторые пиксели на диффузе.
Нормал мап( вместе с другими картами) может работает как средство добавления всевдо-объема при соблюдении определенных условий(угол обзора, карта бликов, подходяшая дифуз карта и т п) но не отрицает лоу геометрию.
Шейдинг лоу поли, если уж по делу, никогда не будет "точно как на хайполи".
Найдется полигон, который будет под острым углом к точке обзора и. ну ты понял.

Попытаюсь еще раз объяснить, что я имел виду в первом посте(должен же кто-то говорить по делу):
Никакой нормал не скруглит тебе цилиндр, если на нем будет нарисована горизонтальная полоса(кольцо). При взгляде под углом 45 гр эта полоса спалит всю твою лоуполи геометрию. Если бы нормал еще и диффуз магически "загуглял" бы — тогда ты был бы прав на все сто.

//И заметь, я тебя не оскорблял и не хамил, я тебя не знаю,
Давай вспомним еще раз:
"поржал, пиши еще, такого бреда слышать не приходилось еще)." — высокомерное принижения автора сообщения.
Не веришь — с начальством попробуй так поговорить. ��
"а то может я тут мастеру что-то пытаюсь сказать." — передергивание в виде издевки. Не нужно быть мастером, чтобы знать как работает технология. Нарушение простейшей логики.
"то твое представление дилетантское о вещах, в которых ты ничего не понимаешь" — Беспочвенное обвинение.

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

А еще ты произвел деанон и сейчас хвастаешь всем, что сотрудник Sperasoft не имеет представления о принципе работы "Normal map". Умница.

Оптимизация: почему время важнее полигонов

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

В этом материале преподаватель курса OutBlock и левел-дизайнер VOID Interactive Денис Куандыков объясняет, как устроена оптимизация, и почему количество полигонов тут — не ключевой фактор.

Если 3D-артист со стороны попытается самостоятельно оценить сложность кадра, то может получиться недоразумение. Художник не знает, какое количество треугольников будет оптимальным, если нет чёткого технического задания.

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

Как устроена отрисовка кадра

Процесс отрисовки кадра — это та самая «магия под капотом движка». У отрисовки, как и у работы художника, есть стоимость, и рассчитывается она исходя из необходимого времени.

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

«Время кадра» — это время в милисекундах, за которое может быть построен и отрисован один кадр. Чтобы получить 60 кадров в секунду, один кадр должен быть обсчитан за 16 милисекунд или еще быстрее.

Draw Call (вызов отрисовки) — это одна графическая команда, которая должна что то отрисовать.

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

И наоборот — чем меньше вызовов отрисовки, тем быстрее считается кадр, и тем выше FPS.

Примерный разброс лимитов на Draw Call можно описать так:

— Мобильные игры — примерно 100 на средне-высоких настройках, на топовых устройствах можно и больше.

— Игры для ПК и консолей — до 4000.

Например, Battelfield и третий «Ведьмак» в среднем работают на 1000-2000 вызовах отрисовки.

В то же время, некоторые внутренние движки Ubisoft спокойно работают на значениях вплоть до 20 тысяч. Дело в том, что Draw Call — это тоже не идеальное мерило производительности. Вызовы отрисовки бывают разные, и тут всё зависит от того как работает конкретный рендер-пайплайн в конкретном проекте. Подробно разобраться в том, как это устроено, можно здесь.

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

Однако вы можете самостоятельно проанализировать отрисовку кадра любой ПК игры, используя специальные инструменты:

— Intel Graphics Perfomance Analisys

Подробнее обо всех этих инструментах можно узнать здесь.

Самое важное: нужно оценивать стоимость кадра. А первичное мерило стоимости — это время. Уже затем можно всё раскладывать на процессы, то есть, на те самые вызовы отрисовки.

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

Вызовы отрисовки

Теперь разберёмся, как именно можно подсчитать количество этих вызовов.

Простой пример: у нас есть 10 ящиков и одно дерево. Все десять ящиков имеют один и тот же шейдер, материал и количество полигонов. Логично предположить, что у нас будет 11 вызовов, ведь в кадре 11 объектов.

Всё почти так и есть. Программа рендерит так: «ящик, ящик, ящик, ящик, ящик. и потом дерево. Кадр построен».

Однако, судя по статистике, у нас всего три батча (вызова отрисовки):

Дело в том, что движок сам понимает, что перед ним десять одинаковых ящиков. Он сам «сшивает» ящики в один объект, и теперь процессор отдает нашей видеопамяти на отрисовку один кусок меша, который мы видим как 10 отдельных ящиков.

Этот процесс называется «батчинг». Он бывает динамическим и статическим.

Как устроен батчинг

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

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

Как устроен батчинг

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

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

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

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

Отличие от динамического батчинга в том, что он позволяет перерабатывать огромное количество объектов. За один батч Unity может сшить объектов общим количеством до 64 000 треугольников.

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

Чтобы батчинг сработал, объекты должны быть «одинаковы». Объекты должны иметь один и тот же шейдер, материал на этом шейдере (в Unreal это инстанс материала), текстуру и остальные параметры объекта, а также не должны иметь Non Uniform Scale и не должны быть разбиты светом.

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

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

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

Так например, два одинаковых ящика, которые в обычной ситуации превратились бы в один батч, разделят на два батча, так как они привязаны к разным лайт-пробам (Light Probe).

Освещение в реальном времени тоже будет влиять на то, какие объекты сбатчатся, а какие — нет.

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

Поэтому иногда применяют «ручной» батчинг, он же просто «мердж» (merge). Берём геометрию, и в любой программе сшиваем так, как нужно под конкретную сцену.

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

Иногда гораздо выгоднее скормить движку огромный меш в 64 тысячи треугольников, чтобы отрисовать всю локацию целиком. Так поступили, например, разработчики Guns Of Boom.

Уровни детализации

Level of Detail (LOD, или уровень детализации) — простая техника, которая позволяет уместить огромное количество объектов в кадре, не отнимая время на обработку лишней геометрии.

LOD может разбить объекты на разные батчи: и в этом нет ничего страшного, ведь зачастую несколько сотен лишних DrawCall будет быстрее обсчитаны на лодированых мешах чем рисовать их оригиналы — но сбатченные.

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

Обычно используют четыре уровня детализации. LOD-0 — это оригинальная модель, а LOD-3 — дальняя. LOD4 может быть просто 2D спрайтом который всегда смотрит на игрока.

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

Это касается даже мелких объектов: например, у обычной кружки в одной из стартовых сцен Dead Space 2 было достаточно полигонов, чтобы она не казалась «квадратной», в то время как в остальной игре в LOD-0 у аналогичных объектов не было такого сглаживания.

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

Если модель, например, можно разглядеть вблизи с максимальным приближением, то просто сделайте LOD-0 достаточно детализированным, — а в самой сцене основным рабочим уровнем будет LOD-1.

Подход, основанный на роли модели в кадре полностью защищает вас от критики сторонников «идеальной сетки», которые без понимания контекста — просто по скриншоту, — заявят, что вы сделали 10 лишних треугольников.

Alpha overdraw

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

Чем больше площадь прозрачности в кадре, и чем больше прозрачные объекты наслаиваются друг на друга — тем дольше рендер-пайплайн будет рисовать итоговый пиксель, ведь ему придётся каждый раз его перерисовывать. Это называется Alpha overdraw.

Чем меньше альфы, тем быстрее будут обсчитаны пиксели. По сути, шейдер и сам рендер — это процесс/программа, которая рисует конкретный цвет конкретного пикселя на экране. И в этом случае пара десятков лишних треугольников, наоборот, ускорит рендер.

Z-Fight — артефакт, который образуется, если поставить несколько полигонов в одной плоскости. Рендеру не хватает точности глубины, чтобы отсортировать отрисовку этих полигонов в правильном порядке.

Но кроме визуального артефакта, который заметит игрок, это повлияет и на время рендера — ведь пиксели в этом месте будут постоянно «спорить» друг с другом об очереди отрисовки.

Итог

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

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

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

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

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