Вместо конвертации ассетов перепишу с нуля рантайм игры - QubStore

Вместо конвертации ассетов перепишу с нуля рантайм игры

Вместо конвертации ассетов перепишу с нуля рантайм игры

Вместо конвертации ассетов перепишу с нуля рантайм игры
Вместо конвертации ассетов перепишу с нуля рантайм игры
Вместо конвертации ассетов перепишу с нуля рантайм игры
Обычный способ переноса модели между играми выглядит предсказуемо: вытащить объект из исходника, прогнать через конвертер, подогнать под чужой движок и собрать заново. Звучит логично, и инструментов для этого хватает — OpenAssetTools и ZoneTool умеют автоматически перегонять данные для Call of Duty, а UE Viewer экспортирует ассеты Unreal в GLTF, PSK или DDS. Но есть и другой, куда более дерзкий подход: вместо муторной перекодировки просто переписать рантайм целевой игры с нуля и заставить его «из коробки» понимать чужие файлы. Именно так родился экспериментальный движок IW4L, построенный на базе IW4 — то есть Call of Duty: Modern Warfare 2 2009 года. На скриншотах видно, как карта Afghan из MW2 тащит на себе снайперку MSR из MW3, а локация Firing Range из Black Ops мирно соседствует с метательным ножом оттуда же.

Вместо привычной цепочки «ассет игры A → конвертация → формат игры B → рантайм игры B» IW4L идёт напролом: ассеты сразу из трёх игр — MW2, Black Ops и MW3 — отправляются прямиком в рантайм, который сам должен разобраться, откуда пришли данные, как их декодировать и в каком виде исполнять. Казалось бы, все три тайтла используют родственные поколения одного движка, но их fastfile-архивы различаются и разрядностью, и внутренней структурой. Однако чтение файлов оказалось самой лёгкой частью задачи — настоящие проблемы начались дальше.

Представьте кадр, где одновременно присутствуют карта из MW2, пушка из Black Ops и модель за спиной из MW3. Геометрию и текстуры ещё можно свести к общему знаменателю, но за отображение отвечают шейдеры — мини-программы, живущие на GPU. В оригинальных играх они хранятся как байт-код Shader Model 3 для Direct3D 9, а тут рантайм написан на Rust и Bevy с графическим API wgpu. Значит, нужен транслятор из SM3 в WGSL. Спасает то, что аналогичная проблема уже решена: DXVK переводит Direct3D-вызовы в Vulkan, в том числе умеет конвертировать D3D9 в SPIR-V. Так что внутреннее устройство SM3, декодирование инструкций и куча подводных камней уже изучены.

Но даже здесь есть загвоздка: хотя MW2, Black Ops и MW3 говорят на одном языке Shader Model 3, смысл инструкций у них заметно расходится. Два шейдера с одинаковым именем могут радикально отличаться друг от друга, поэтому простая таблица «название → готовый код» не работает. Приходится хранить целую матрицу соответствий: (игра, шейдер) → переведённый вариант. И это не просто техническая деталь — происхождение ресурса нужно помнить до самого момента отрисовки. Если в руках у игрока модель из Black Ops, системе нельзя ограничиться именем материала: необходимо понять, что он относится к T5, подобрать технику отрисовки для T5, загрузить соответствующие вершинные и пиксельные шейдеры, подготовить константы — матрицы, камеру, свет, туман, параметры материала — и лишь потом запустить общий конвейер. Набор и трактовка этих данных между MW2, Black Ops и MW3 различаются как по составу, так и по смыслу.

На видео можно увидеть, как карта Afghan живёт по законам освещения IW4, а FAMAS в руках игрока пришла из Black Ops и ждёт данные по правилам T5. Геометрия, текстуры и шейдер оружия загружены корректно, но выглядит оно слишком ярким — шейдер отрабатывает без ошибок, однако получает совсем не те величины, на которые рассчитывал. В итоге в одном кадре могут столкнуться IW5-карта, IW4/T5-оружие, IW5-освещение и IW4-пайплайн отрисовки. И вот здесь поддержка чужих файлов превращается в игру по совместимости нескольких поколений движка внутри единого кадра. Решаемо ли это для всех пограничных случаев с картами и оружием? Автор честно признаётся, что понятия не имеет. Для сравнения он показывает скриншоты от 11 августа — тогда, меньше четырёх недель назад, движок выглядел куда скромнее, например, карта MW2 Scrapyard уже грузилась, но до полноценной картинки было далеко. Автор обещает вернуться через месяц и показать прогресс, если проект зайдёт сообществу. Кстати, кодовая база IW4L сейчас насчитывает порядка 370 тысяч строк и написана десятками больших языковых моделей, однако сама статья создана человеком.

Ссылка на основную публикацию