uGridsToLOD: проект по улучшению LOD Fallout 4. Постановка задачи

В этой статье я начинаю серию сообщений, посвященных моему персональному проекту по модификации игры 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”, представляет собой диффузную карту земли для данного блока ландшафта (см. на картинке квадрат справа).

01 - LOD 32 terrain.png

На координатной сетке мира Falout 4 фрагмент 32.0.0 заполняет верхнюю правую четверть карты: это квадрат 32х32, левая (X) нижняя (Y) ячейка которого имеет координату 0, 0 (см. картинку).

02 - Fallout 4 World Coords.jpg

Чтобы не запутаться, работая с координатной сеткой и файлами 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-версии эстакад.

03 - Commonwealth.Objects.png

Может сложиться впечатление, что все необходимое как будто находится в двух местах - папках Meshes/Terrain и Textures/Terrain. Но это не так. Здесь расположены готовые файлы LOD’а ландшафта и объектов и ресурсы для генерации LOD’а ландшафта. Ресурсы же для генерации LOD’а объектов, которые нужны моему проекту, находятся в другом месте. Это в первую очередь папки Materials/LOD, Meshes/LOD и Textures/LOD, в которых расположены необходимые материалы, меши и текстуры. Кроме того, для работы с LOD’ом объектов полезно знать, откуда берется информация о том, какие объекты должны быть включены в него в ходе генерации. Эти сведения содержатся в виде ссылок от базовых игровых моделей на их LOD-версии, что можно увидеть через программу FO4Edit. С ее помощью можно также добавить в LOD любой отсутствующий там объект. Для этого достаточно создать новый плагин .esp, перенести в него запись о нужном объекте, добавить в эту запись флаг Has Distant LOD и указать ссылку на один или несколько LOD-мешей, разумеется, предварительно создав его (их) физически. На следующей картинке видно, как выглядит запись об элементе экстерьера DiamondCity, который имеет меши на трех уровнях LOD.

04 - FO4EditExample.png

Обратите внимание, что на всех трех уровнях используется один и тот же меш с постфиксом _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 показаны на следующих картинках.

05 - LOD_2, LOD_3 meshes.png

06 - LOD 32 Blocks.png

Дальность отрисовки объектов разных уровней 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, понимают, о чем идет речь, но все же приведу пару примеров того, что мне не хотелось бы видеть на экране, потому что это портит впечатления от игры.

07 LODExample 1.jpg

07 LODExample 2.jpg

07 LODExample 3.jpg

07 LODExample 4.jpg

07 LODExample 5.jpg

07 LODExample 6.jpg

07 LODExample 7.jpg

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

Например, если мы возьмем самый большой файл LOD (Commonwealth.8.0.-8.bto), в распакованном виде имеющий размер ~4.7 Мб, в котором собран центр Бостона с большинством высотных зданий, и откроем его в программе NifSkope, то мы сможем наблюдать, что это не создает никакой видимой нагрузки на видеокарту (в нашем примере используется 1050 Ti). Чтобы визуально окрасить пример, приведу скриншот (кстати, если вы обратите внимание на местоположение фрегата “Конститьюшн”, то сможете сделать вывод о том, как я решил задачку Капитана Айронсайда).

08 - Commonwealth_8_0_-8_bto.jpg

Если же мы пересоберем LOD, запретив генератору объединять сетки (существует по меньшей мере 17 параметров тонкой настройки xLODGen, не отраженных в документации по этой программе, которые можно извлечь методом анализа исходного кода из .cs файлов, доступных на GitHub), и после этого снова попытаемся открыть этот же файл, то увидим, что он увеличился в 2 раза и работать с ним практически невозможно, так как даже простое вращение сцены превращается в слайд-шоу с частотой кадров, не превышающей 10 в секунду. Т. е. производительность компьютера падает в несколько раз, хотя речь идет об одном только блоке уровня LOD 8 (LOD_1). Если при этом учесть, что очень многие объекты LOD_0 далеко не так экономно построены, как следовало бы ожидать, то идея проекта обретает хорошие шансы на жизнь. Разумеется, повторюсь, обязательным условием здесь является уменьшение числа граней мешей и размера текстур для атласа текстур. В этой связи надо отметить одну особенность LOD'а, полезную с точки зрения задачи ретопологии мешей: он допускает возможность обращения к материалам и текстурам за пределами атласа, что позволяет без каких-либо дополнительных усилий использовать развертки, выходящие за границы координат U1V1 текстуры.

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

Всем хорошего дня.

Любое использование данной статьи должно содержать ссылку на эту публикацию.

391 0 850 6
5
2022-12-21
Как вписаться в команду? Опыта мало, но есть желание учиться и поучаствовать
2022-12-21
Сергей БерезовКак вписаться в команду? Опыта мало, но есть желание учиться и поучаствовать
Спасибо за внимание к моему проекту. Изначально я не задумывался о командной работе, это неожиданный поворот. Вы можете написать мне личное сообщение, обсудим вопрос.
2022-12-26
Хех забавно, я как раз модами для игры занят и пилю машиниму, и как раз собирался узнать как генерировать лоды Вот для этой локи https://youtu.be/xnQYPz5tmKM
2022-12-26
Sir, потом закину анимированный танк в эндорфине, если кому интересно Ну, когда его наконец сделаю))0
2023-01-07
Sir AlbusХех забавно, я как раз модами для игры занят и пилю машиниму, и как раз собирался узнать как генерировать лоды Вот для этой локи

Sir, перейдя по ссылке я нашел видео и слово "Fallout 4", но не понял, в чем связь с игрой. Возможно, впоследствии напишу статью о генерации LOD.
RENDER.RU