Фанат создал ремейк Alone in the Dark 1992 года на DirectX 12 с DLSS за четыре часа
Слева оригинальный фон 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-фон с размытым оригиналом, и если нейросеть начинает отсебятину или уничтожает мелкие детали, система возвращает аутентичный рисунок.

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

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

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

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


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

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

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


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

Отдельного упоминания заслуживает злосчастный индикатор ON в углу экрана. Нейросеть добросовестно перерисовала и его, придав стилизованный и полупрозрачный вид. Это явно указывает на то, что через RenoDX алгоритм обрабатывает финальный растровый кадр целиком, захватывая элементы интерфейса поверх игры. Судя по всему, задействованные мною честные векторы движения и буфер глубины модель просто проигнорировала.
Зачем всё это затевалось?
Ключевой вывод очевиден: DLSS 5 критически зависима от качества поступающих на вход данных. Низкополигональные пиксельные полотна она превращает в мозаичный хаос, а сглаженные ремастеры — в суррогат кукольного домика. Плоский фоновый рисунок без карты глубины воспринимается ею как абстрактная картинка, вольная трактовка которой порождает те самые шторы на месте опорных столбов.
Сухие цифры: около 5 500 строк нового кода, включая графический бэкенд, режим ремастеринга, шейдерные программы, подсистемы ввода и звука. Итоговый исполняемый файл весит всего 3 МБ. Временные затраты — с 13:38 до 17:43 (четыре часа с учетом создания новой собаки).
No Man’s Sky может выйти на Android — портированием займётся известный энтузиаст
Звезда шоу «Давай поженимся» сравнила игры с алкоголизмом и рассказала об угрозе GTA VI для семьи
Игроки не могут отличить кадры геймплея GTA VI от реальной съёмки
Sony решила прекратить разработку Fairgame$, появились первые оценки GTA VI — главное за 11 ноября
В Steam стартовали бесплатные выходные Deep Rock Galactic: Rogue Core
Финансовый директор NVIDIA может временно возглавить компанию после увольнения Дженсена Хуанга
Boss Fight Books анонсировала книгу о консольных версиях Doom и запусках игры на разных устройствах
Разработка Intergalactic: The Heretic Prophet находится на финальной стадии