Фанат создал ремейк Alone in the Dark 1992 года на DirectX 12 с DLSS за четыре часа

Прокомментировать Просмотры: 0

Слева оригинальный фон 320×200, справа он же после Real-ESRGAN

Сразу раскрою все карты: пса пришлось воссоздавать с нуля. Но обо всём по порядку. При этом львиная доля времени ушла на скульптинг бюста 😉

В прошлый раз Claude за каких-то полтора часа пересобрал досовский Quake под нативный DirectX 12, пока я заваривал чай. В соседней папке хранилась Alone in the Dark, рядом пылились Heroes 2, и простой перенос на DX12 показался мне слишком банальным…

Концепция

Поначалу амбиции были скромными: повторить фокус с Quake — рекомпиляция, чистый DX12, никаких сторонних врапперов, плюс честные векторы движения для DLSS 5.

Оценив промежуточный результат, я осознал, что хочу большего. И он меня понял. Пожалуй, это и есть квинтэссенция вайбкодинга: техническое задание составлено на ходу, без единого знака препинания там, где он вроде бы нужен, и завершается безальтернативным «кк?».

Часть 1. Базовый порт

Разумеется, исходный код игры образца 1992 года утерян. Зато существует FITD (Free in the Dark) от разработчика yaz0r — открытая реализация движка под лицензией GPL, способная работать с оригинальными ассетами. Правда, рендеринг там завязан на bgfx, за окна отвечает SDL, а за аудио — SoLoud.

Claude безжалостно всё это отбросил, написав альтернативу: графический конвейер на DirectX 12, оконную систему на Win32 и звуковой движок на XAudio2. Культовая музыка в формате AdLib никуда не делась — эмулятор чипа YM3812 интегрирован прямо в ядро и бесперебойно наполняет буферы XAudio2. Рабочее разрешение выставлено на излюбленные 1600×1200.

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

С DLSS приключилась любопытная история. В оригинальной Alone in the Dark все трехмерные модели обсчитываются процессором на уровне каждой отдельной вершины. Благодаря этому начальные координаты Эмили и оппонентов считываются абсолютно точно, поэтому векторы движения генерируются подлинные, без каких-либо аппроксимаций. А вот задники в игре представляют собой плоские растровые рисунки. У них нет ни глубины, ни векторов, да и камера в каждой локации статична.

Запомните этот нюанс, к фонам мы еще вернемся.

Весь процесс портирования занял 40 минут: директория проекта была инициализирована в 13:38, а первый жизнеспособный билд улетел в коммит в 14:18.

Часть 2. Цифровая алхимия (Numpad 5)

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

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

Текстурирование. Этот этап впечатлил меня сильнее всего. Изучив палитру художника 1992 года, ассистент по оттенку каждого полигона определил тип материала: синие и зеленые тона на одежде Эмили были классифицированы как текстиль, коричневые элементы мебели — как древесина, теплые светлые оттенки — как человеческая кожа, а темные — как обувь и ремни. Затем, по моему запросу, через специальное расширение для Chrome он самостоятельно посетил Poly Haven и загрузил пять лицензионных CC0-материалов: твидовую шерсть, древесный массив, металл, кожу и штукатурку. Каждый из них сопровождался картами нормалей и шероховатости. Художественная палитра осталась основой, а фотограмметрия добавила достоверную фактуру.

Мое участие в этом технологическом чуде свелось к клику по кнопке «Разрешить массовую загрузку файлов».

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

Фоновые изображения. В дело вступил апскейлер Real-ESRGAN, увеличивающий разрешение в четыре раза. Облачных GPU под рукой не оказалось, поэтому алгоритм выполнялся силами центрального процессора, затрачивая по 3–5 минут на апскейл каждого кадра 320×200. Подмена задников происходит покадрово: элементы интерфейса и текстовые оверлеи остаются нетронутыми, а оригинальные палитровые затемнения при смене сцен продолжают исправно функционировать.

Казусы и курьезы разработки

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

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

Проблемы с пианино. Нейросеть Real-ESRGAN решила, что клавиши инструмента должны быть угольно-черными, и замазала их жирными пятнами. Проблема решилась внедрением защитного шейдера: теперь движок сопоставляет HD-фон с размытым оригиналом, и если нейросеть начинает отсебятину или уничтожает мелкие детали, система возвращает аутентичный рисунок.

Сверху: оригинал и чистый Real-ESRGAN. Снизу: первая версия защиты и финальная
Сверху: оригинал и чистый Real-ESRGAN. Снизу: первая версия защиты и финальная

Анатомические правки. Процитирую самого себя: «сделай грудь всё-таки покруглее… но чтобы без крайностей в духе Lara Croft». Сделал. Позднее, исправляя форму окон, ИИ невольно вернул героине угловатость. Заметив оплошность, я потребовал отката, заодно скорректировав лицо: оригинальный художник раскрашивал каждый полигон индивидуальным оттенком, что при корректном освещении создавало эффект рубленых граней. Теперь кожа имеет однородный тон, а объем формируется честными световыми лучами.

Эмили: оригинал слева, Numpad 5 справа
Эмили: оригинал слева, Numpad 5 справа

Трансформация монстра

Чудовище с чердака в оригинале состояло из 17 примитивных сфер: туловище, голова, суставы и шейные позвонки. В лоу-поли исполнении это смотрелось вполне сносно. Однако стоило сферам обрести физически корректное освещение, как монстр превратился в жутковатый пузырчатый конгломерат с зубами.

Мое указание звучало недвусмысленно: «просто перерисуй эту собаку с нуля… ты уловил суть? посмещай полигоны… сделай так, чтобы она не выглядела как гроздь пузырей».

Для начала ассистент извлек скелетную структуру: 114 вершин, 24 иерархические группы анимации. Затем он выстроил новое тело на базе 39 капсул, сформировав исхудалый сутулый торс, рельефные бицепсы, вытянутый череп, мощную шею, тонкий хвост и гребень из шипов вдоль позвоночника. Капсулы были объединены в сплошной меш с помощью signed distance fields и surface nets (загуглив термины, я предпочел просто довериться результату), получив в итоге около 19 000 полигонов. Каждая вершина была привязана к оригинальным костям, благодаря чему чудище двигалось в точности как тридцать лет назад. Зубы, когти, глаза и лапы при этом остались аутентичными.

Сверху оригинал из шаров, снизу новая модель, с четырёх сторон
Сверху оригинал из шаров, снизу новая модель, с четырёх сторон

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

Анимация смерти, сверху оригинал, снизу новая модель
Анимация смерти, сверху оригинал, снизу новая модель

Самое забавное, что сам Claude обновленного монстра вживую так и не увидел. Его виртуальная Эмили при каждом тестовом прогоне упрямо шла к столу за масляной лампой, после чего игра неизменно замирала на диалоговом окне «You Find An Oil Lamp». Два продолжительных цикла симуляции, три десятка кадров — и везде запечатлена заветная лампа.

Зато мне довелось лицезреть зверя во всей красе:

Numpad 5 включён, монстр лезет в окно
Numpad 5 включён, монстр лезет в окно
То же самое в оригинале
То же самое в оригинале

Особенности QA-процесса

Методика тестирования не изменилась со времен Quake: облачный экземпляр Linux, Wine, vkd3d и процессорный рендеринг через программный Vulkan. Никакой дискретной графики. Производительность в таких условиях едва достигала 7 FPS, однако скрипты отрабатывали безупречно: эмуляция нажатия Enter, пауза, движение вперед, захват кадра, активация режима Numpad 5 и новый снимок.

Моя RTX 5090 на этом этапе оставалась не задействованной. Все проверки проходили в песочнице, а запуск на «железе» оставался финальным аккордом.

К слову, игровой оверлей NVIDIA проект поначалу игнорировал. Проблема кроется не в графическом движке: утилита цепляет хуки лишь к известным ей приложениям, поэтому исполняемый файл пришлось добавлять в NVIDIA App вручную. А для удобства записи роликов я попросил добавить переключаемый по клавише F8 статус-индикатор (ON/OFF) в углу экрана.

Интеграция DLSS 5

Инструментарий задействовался через RenoDX на ноутбуке с связкой RTX 5090 Laptop и Core Ultra 9 275HX. Без задействования DLSS игра выдает стабильные 60 FPS при загрузке графического чипа на уровне 45%. Активация DLSS 5 утилизирует видеокарту на все 100%, при этом кадровая частота проседает до 18 (редко поднимаясь до 33 FPS).

Каков итог? Всё упирается в исходное качество входного потока.

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

DLSS 5, Numpad 5 выключен
DLSS 5, Numpad 5 выключен

Ремастированный вариант (ON). Картина начинает напоминать интерьер кукольного домика. Где-то симпатично, а где-то… ну вы сами всё видите. Деревянные балки преобразились в красные портьеры, бочки ощетинились жестяным блеском, а черты лица Эмили размылись до состояния призрачного силуэта.

DLSS 5, Numpad 5 включён. Обратите внимание на столбы
DLSS 5, Numpad 5 включён. Обратите внимание на столбы

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

DLSS 5, жёлто-синие цвета, ON
DLSS 5, жёлто-синие цвета, ON
То же самое на оригинале
То же самое на оригинале

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

Самый спокойный кадр, 33 FPS
Самый спокойный кадр, 33 FPS

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

Зачем всё это затевалось?

Ключевой вывод очевиден: DLSS 5 критически зависима от качества поступающих на вход данных. Низкополигональные пиксельные полотна она превращает в мозаичный хаос, а сглаженные ремастеры — в суррогат кукольного домика. Плоский фоновый рисунок без карты глубины воспринимается ею как абстрактная картинка, вольная трактовка которой порождает те самые шторы на месте опорных столбов.

Сухие цифры: около 5 500 строк нового кода, включая графический бэкенд, режим ремастеринга, шейдерные программы, подсистемы ввода и звука. Итоговый исполняемый файл весит всего 3 МБ. Временные затраты — с 13:38 до 17:43 (четыре часа с учетом создания новой собаки).

Обещаю, в следующий раз проект сразу отправится на GitHub

 

Источник

Похожие статьи

Поиск по играм, новостям и статьям…

Введите не менее двух символов

Введите не менее двух символов