Недавно компания Epic Games представила пятую версию своего игрового движка Unreal Engine. Помимо объемного звука, который был вскользь упомянут в паре сцен, основной упор был сделан на две прорывные технологии Lumen и Nanite.
Lumen
технология глобального освещения в реальном времени. Что это и зачем? В реальном мире свет - это не луч от точки на поверхности до источника. Свет взаимодействует о объектами, отражается, преломляется и окрашивается. Освещение делает пожалуй больший вклад в реалистичность, чем детализация моделей и текстур, но это очень дорого, в плане вычислительных ресурсов.
Для обработки света в реальном времени сейчас используется куча костылей, запекание света, карты теней и т.д. Сейчас вот в тренде RTX ядра в GPU которые позволят обсчитывать большее количество лучей за меньшее время, но бедные это не увидят.
Одним из способов создания глобального освещения это воксели. Воксель это как пиксель, только объемный, то есть куб. Суть способа в том, что воздушное пространство заполняется невидимой воксельной сеткой, луч света проходя через воксель взаимодействует с ним, передает часть энергии, окрашивается, преломляется и едет дальше, а воксель в свою очередь взаимодействует с соседями, отдает процент света соседу, а тот своему соседу и т.д. Рендер, при освещении объектов, знает какой объем света сейчас в этой точке и окрашивает пиксель на экране с учетом этой информации.
К реализациям воксельного освещения можно отнести технологию Nvidia VXGI (Voxel Global Illumintaion) упоминание о котором было уже 5 лет назад, SVOGI (Voxel-Based Clobal Illumination) в CryEngine и т.д. Сегодня это уже не инновация.
Этой технологии свойственна некая тягучесть света, При большом количестве вокселей, передача световой энергии во всей сетке может занимать какое то время и обычно считается в отдельном потоке. Подобное можно увидеть на демонстрации Lumen, при быстром перемещении источника света, глобальному освещению требуется время, что бы перейти в новое состояние. Lumen - это всего лишь одна из реализаций воксельного освещения.
Nanite
с Nanite все немного интереснее. По заявлениям разработчиков с UE5 художникам не обязательно задумываться о подсчете полигонов или о том, сколько места в памяти системы они займут. Можно использовать ассеты кинематографичного качества в движке напрямую, загружать модели из ZBrush и данные фотограмметрии, не тратя время на оптимизацию уровней детализации или понижение качества для того, чтобы вписаться в нужную частоту кадров.
Насколько это правда? А давайте разберемся. В первую очередь стоит отметить что Nanite это реализация технологии Mesh Shading. Первую демонстрацию провела Nvidia на демо Asteroids уже в 2018. Я не буду заставлять вас страдать, и не стану углубляться в то, как это работает.
В той демонстрации упоминалось что в сцене присутствует 350 000 астероидов, состоящих из 10 000 000 треугольников каждый. Суммарно 3 500 000 000 000 треугольников, при этом рисовалось только 50 000 000. Хорошая оптимизация, не правда ли? Но как это работает?
В основе технологии лежит тот факт, что GPU это не универсальный процессор, а процессор для обработки огромных массивов данных. Mesh Shading технически это как тесселяция, которая достраивает исходную геометрию (и этот термин нам еще пригодится, так что далее просто ИГ), только наоборот, упрощает непосредственно перед отрисовкой. Это снижает нагрузку при растеризации т.к. минимальный размер треугольника, который мы можем разглядеть это 1 пиксель на экране.
С этим разобрались. Значит теперь можно создавать огромные детализированные миры не задумываясь об оптимизации?
Немного матчасти. Треугольник состоит их трех вершин, а вершина в свою очередь это определенная структура данных, в разных движках она может отличаться, но что то общее есть во всех движках. У любой вершины есть положение в пространстве, например, задается она типом данных Vector3 или float3 на языке шейдеров. Vector3 означает координаты xyz. Размер float 32 бита или 4 байта, соответственно размер Vector3 12 байт.
Кроме положения у вершины есть и другие параметры. Например вершина в UE4 включает в себя
- position: float3
- normal: float3
- tangent: float3
- vertex color: float3
- UV0: float2
- UV1: float2
- UV2: float2
- UV3: float2
Итого размер одной вершины 80 байт. Треугольник это 3 вершины и 240 байт.
С матчастью разобрались, переходим к математике.
Для обработки исходной геометрии в GPU необходимо, что бы эта ИГ находилась в видеопамяти, или в оперативе, если мы говорим про консоль. Ни о какой догрузке в момент обработки речи не идет т.к. при 60 кадров в секунду время на обновление сцены (физика, анимация и все такое) и рендер составляет всего 16мс.
3 500 000 000 000 треугольников ИГ это 840 000 000 000 000 байт или приблизительно 764Tb. Многовато. Как же так получается, что видеокарта с 8 гигами видеопамяти умудряется в каждом кадре обрабатывать терабайты данных? Все просто, в память загружен только один астероид (ну может пара) на 10 000 000 треугольников, или 2гига. В кадре он рисуется 350 тысяч раз, с разными положениями, масштабами и углами поворотов, создавая тем самым видимость разнообразия.
Естественно ни о какой анимации подобных массивов речи не идет. Именно поэтому в демонстрации UE5. есть отдельная пещера затем бутылочное горлышко, в виде прохода через трещину, для выгрузки пещеры и загрузки статуи на 33 миллиона треугольников и комната где эта статуя рисуется сотни раз, а не сотни разных сверх детализированных статуй.
Что все это значит?
Помимо рисуемых треугольников есть еще управление памятью, о чем создатели UE5 тактично умолчали. Заявления о том, что разработчикам не нужно тратить время на оптимизацию уровней детализации или понижение качества для того, чтобы вписаться в нужную частоту кадров, верно только на половину, ведь им придется тратить время на оптимизацию уровней детализации или понижение качества для того, чтобы вписаться имеющийся объем оперативной\видеопамяти.
Новое поколение консолей будет иметь на борту по 16 гигабайт общей памяти, а значит все игры, в ближайшие несколько лет, будут ориентироваться на такой объем данных (геометрия, текстуры и все такое) при создании сцен.
До тех пор пока не произойдет революция в производстве чипов памяти, которая сильно снизит стоимость одного гигабайта, ни каких качественных инноваций ждать не стоит. Так уж получается, что технологии обработки данных бегут далеко впереди технологий хранения.
Подобные заявления и демонстрации всего лишь маркетинговый булшит. Вот и все. Зато демка действительно красивая. Играть в это мы конечно пока не будет.