В этой статье я начинаю серию сообщений, посвященных моему персональному проекту по модификации игры Fallout 4. Цель этого проекта заключается в улучшении качества прорисовки объектов посредством переработки LOD’а, который в игре оставляет желать лучшего.
Как известно, в Fallout 4 отрисовкой объектов управляют несколько параметров. Объекты с высоким уровнем детализации загружаются вокруг игрока на расстоянии, которое определяется параметром uGridsToLoad. Он определяет, сколько ячеек игрового мира надо загрузить, считая центром ячейку, в которой находится игрок. Стандартное значение параметра равно 5, оно означает загрузку объектов с высокой детализацией в квадратной области, одна сторона которой образована пятью ячейками.
Все, что находится за пределами этой области, управляется параметрами LOD (Levels Of Detail, уровни детализации). LOD делится на 2 части и 4 уровня. Первая часть - LOD объектов, вторая - LOD ландшафта, включающий землю и воду. Обе части LOD’а составлены из квадратных блоков. Каждый блок включает фиксированное количество ячеек игрового мира, кратное двум. Уровень LOD’а, к которому относится блок, обозначается через длину стороны этого блока, что позволяет определить его размерность: LOD 4 (16 ячеек), LOD 8 (64 ячейки), LOD 16 (256 ячеек) и LOD 32 (1024 ячейки). По умолчанию размер блока обратно пропорционален степени детализации, но при желании можно сгенерировать LOD с любым уровнем детализации.
В игровых архивах готовый LOD представлен файлами трех типов: меши ландшафта .btr, меши объектов .bto и текстуры .dds. Файлы материалов он не использует, свойства шейдеров зашиты в файлы мешей, хотя материалы в виде отдельных файлов используются в процессе генерации LOD'а. Имена файлов с мешами сформированы по единому принципу:
worlds_name.lod_level.X.Y.[bto|btr],
где worlds_name - имя игрового мира, в ванильной игре это Commonwealth (Содружество), DiamondCity (Даймонд-сити) и SanctuaryHillsWorld (Сэнкчуари Хиллз); lod_level - это число, определяющее уровень LOD (4, 8, 16 или 32); X и Y - это координаты левой нижней ячейки блока, имеющего протяженность lod_level по осям X и Y вправо и вверх соответственно. Имена текстур LOD’а земли сформированы по аналогичному принципу.
Например, посмотрим на два файла:
- meshes/terrain/Commonwealth /Commonwealth.32.0.0.btr - это файл мешей, извлеченный из архива “Fallout4 – Meshes.ba2”, представляет собой блок LOD’а ландшафта размером 32х32 ячейки (см. на картинке квадрат слева - скриншот, сделанный в программе NifSkope);
- textures/terrain/Commonwealth/Commonwealth.32.0.0.dds - это файл текстуры, извлеченный из архива “Fallout4 – Textures4.ba2”, представляет собой диффузную карту земли для данного блока ландшафта (см. на картинке квадрат справа).
На координатной сетке мира Falout 4 фрагмент 32.0.0 заполняет верхнюю правую четверть карты: это квадрат 32х32, левая (X) нижняя (Y) ячейка которого имеет координату 0, 0 (см. картинку).
Чтобы не запутаться, работая с координатной сеткой и файлами LOD’а, надо помнить, что LOD формируется по принципу избыточности, поэтому блоков разных уровней, и в особенности 32-го, может быть больше, чем их помещается физически на координатной сетке мира. Например, если внимательно посмотреть на карту, станет ясно, что в мире Fallout 4 помещается лишь 4 квадрата размером 32х32. Но в одном только Commonwealth мы найдем 36 блоков этого уровня. Как же так? Очень просто: блоки выходят за пределы пространства, доступного для перемещения игрока. В противном случае границы игрового мира выглядели бы не очень хорошо. (Кстати, границы можно отключать и гулять с “той стороны”.)
Посмотрим, где все это лежит физически.
Меши LOD’а ландшафта - в папке Data/Meshes/Terrain/[worlds_name] (например, это 3060 файлов для мира Commonwealth).
Меши LOD’а объектов - в папке Data/Meshes/Terrain/[worlds_name]/Objects (461 файл для мира Commonwealth).
Текстуры LOD’а ландшафта - в папке Data/Textures/Terrain/[worlds_name] (6123 файла для Commonwealth).
Атласы текстур LOD’а объектов - в папке Data/Textures/Terrain/[worlds_name]/Objects (для любого из миров это всегда три большие “сборные” карты текстур - диффузная, нормалей и бликов).
На картинке ниже можно посмотреть пример атласа диффузных карт, в левом верхнем углу которой видна перерисованная мной вручную карта для LOD-версии эстакад.
Может сложиться впечатление, что все необходимое как будто находится в двух местах - папках Meshes/Terrain и Textures/Terrain. Но это не так. Здесь расположены готовые файлы LOD’а ландшафта и объектов и ресурсы для генерации LOD’а ландшафта. Ресурсы же для генерации LOD’а объектов, которые нужны моему проекту, находятся в другом месте. Это в первую очередь папки Materials/LOD, Meshes/LOD и Textures/LOD, в которых расположены необходимые материалы, меши и текстуры. Кроме того, для работы с LOD’ом объектов полезно знать, откуда берется информация о том, какие объекты должны быть включены в него в ходе генерации. Эти сведения содержатся в виде ссылок от базовых игровых моделей на их LOD-версии, что можно увидеть через программу FO4Edit. С ее помощью можно также добавить в LOD любой отсутствующий там объект. Для этого достаточно создать новый плагин .esp, перенести в него запись о нужном объекте, добавить в эту запись флаг Has Distant LOD и указать ссылку на один или несколько LOD-мешей, разумеется, предварительно создав его (их) физически. На следующей картинке видно, как выглядит запись об элементе экстерьера DiamondCity, который имеет меши на трех уровнях LOD.
Обратите внимание, что на всех трех уровнях используется один и тот же меш с постфиксом _LOD_0. Т. е. так можно. Более того, в игре существует множество LOD-мешей, в имени которых постфикс вообще не имеет числового индекса, и там мы найдем просто _LOD или LOD. (Между прочим, замечу, что подобные ситуации характерны для стиля разработки Bethesda, по крайней мере, в отношении Fallout 4.)
Во внутриигровых ресурсах, находящихся за пределами папок ../Terrain, а также в настройках Fallout 4 LOD объектов делится на 4 уровня:
нулевой (LOD_0, LOD #0, Level0 или Level 0),
первый (LOD_1, LOD #1, Level1 или Level 1),
второй (LOD_2, LOD #2, Level2 или Level 2),
третий (LOD_3, LOD #3, Level3 или Level 3).
При загрузке LOD’а во время игры точкой отсчета является ячейка с игроком. Объекты LOD_0 относятся к уровню LOD 4, загружаются непосредственно за областью высокой детализации, которая, как мы помним, по умолчанию представляет собой квадрат размерностью 5х5 ячеек. Объекты LOD_1 относятся к уровню LOD 8 и расположены за областью объектов LOD_0. И так далее. Объекты LOD_2 относятся к уровню LOD 16, объекты LOD_3 относятся к уровню LOD 32, т. е. находятся на наибольшем удалении от игрока и обладают наименьшей детализацией. Для уровня LOD 16 игра предлагает всего 47 файлов LOD_2, из которых 44 - модели деревьев. Уровень LOD 32 включает три файла с моделями деревьев и пять файлов .bto: четыре из мира Commonwealth, в которые избирательно включены самые крупные объекты игры: высотные здания и дирижабль; один из мира SanctuaryHillsWorld, в который попали только деревья. Для наглядности списки всех 50 мешей LOD_2 и LOD_3 и все пять блоков LOD 32 показаны на следующих картинках.
Дальность отрисовки объектов разных уровней LOD относительно игрока регулируется настройками в файлах .ini: fBlockLevel0Distance, fBlockLevel1Distance, fBlockLevel2Distance и fBlockMaximumDistance.
Большинство объектов игрового мира представлены в LOD на уровнях LOD 4 и LOD 8: это 938 файлов мешей с постфиксом _LOD_0, 198 файлов мешей с постфиксом _LOD_1, один (!) файл мешей с постфиксом _ LOD_1 (т. е. с пробелом между _ и LOD, отчего его было хлопотно выловить) и 2805 файлов с постфиксом LOD, отнесенность которых к тому или иному уровню LOD можно узнать только одним способом: изучив записи об объектах с помощью FO4Edit. Кроме того, есть 5 файлов с префиксом LOD_Fake (модели высотных зданий из папки lod/architecture/unique) и 2 файла с постфиксом LOD_FLAT в папке landscape/trees. В значительной своей части все это не полные модели объектов, а их фрагменты, нередко просто плоскости из двух треугольников, которые при генерации LOD составляются в полные объекты. Почти все эти объекты весьма грубы, и даже LOD нулевого уровня выглядит не очень хорошо. Модели здесь характеризуются очень неровным качеством, которое варьирует от терпимого до откровенно неприемлемого, что особенно заметно на больших экранах, при использовании оптического прицела и в VR версии игры. Думаю, что все, кто играл в Fallout 4, понимают, о чем идет речь, но все же приведу пару примеров того, что мне не хотелось бы видеть на экране, потому что это портит впечатления от игры.
Центральная идея проекта заключается в том, чтобы перенести самые заметные высокодетализированные игровые объекты в LOD нулевого уровня, предварительно оптимизировав меши и текстуры. Это отражено в кодовом обозначении проекта uGridsToLOD. Игра слов с uGridsToLoad отражает альтернативный способ повысить детализацию прорисовки удаленных объектов, не повышая, а при желании даже понижая значение uGridsToLoad, т. е. улучшить качество графики в игре не только не увеличивая, но в некоторых случаях уменьшая нагрузку на компьютер. В общем случае повышение детализации через улучшение LOD не должно вести к заметному падению производительности, потому что прорисовка объектов LOD организована в игре иначе, чем вблизи игрока. Главное отличие заключается в том, что все объекты каждого блока LOD объединяются в несколько громадных мешей, а текстуры всех объектов всех блоков объединяются в один большой атлас. Этот прием в сотни раз снижает количество объектов для обработки, вследствие чего в несколько раз снижается нагрузка на компьютер.
Например, если мы возьмем самый большой файл LOD (Commonwealth.8.0.-8.bto), в распакованном виде имеющий размер ~4.7 Мб, в котором собран центр Бостона с большинством высотных зданий, и откроем его в программе NifSkope, то мы сможем наблюдать, что это не создает никакой видимой нагрузки на видеокарту (в нашем примере используется 1050 Ti). Чтобы визуально окрасить пример, приведу скриншот (кстати, если вы обратите внимание на местоположение фрегата “Конститьюшн”, то сможете сделать вывод о том, как я решил задачку Капитана Айронсайда).
Если же мы пересоберем LOD, запретив генератору объединять сетки (существует по меньшей мере 17 параметров тонкой настройки xLODGen, не отраженных в документации по этой программе, которые можно извлечь методом анализа исходного кода из .cs файлов, доступных на GitHub
Первые результаты уже получены и они вполне обнадеживают. Об этом, а также о необходимом для реализации проекта ПО и о среде исполнения задач я расскажу в следующем материале.
Всем хорошего дня.
Любое использование данной статьи должно содержать ссылку на эту публикацию.
Sir, перейдя по ссылке я нашел видео и слово "Fallout 4", но не понял, в чем связь с игрой. Возможно, впоследствии напишу статью о генерации LOD.