Энтузиаст написал OpenGL 3.3 рендерер с Normal Map для UT2004, не зная C++ и используя ИИ за 500 рублей
Разработчик-любитель без знания C++ и без исходников игры создал современный DLL-рендерер для Unreal Tournament 2004. Проект, занявший три месяца, реализует поддержку Normal Map, Blinn-Phong Specular и постпроцессинга на OpenGL 3.3, используя ИИ-агента за 500 рублей.
Энтузиаст, известный под ником, опубликовал историю о том, как он за три месяца написал нативный рендерер для Unreal Tournament 2004, используя исключительно ИИ-агента Gemini Flash через консольный Antigravity CLI. Не имея ни знаний C++, ни исходников игры, он смог создать DLL, реализующую интерфейс URenderDevice движка Unreal Engine 2, с поддержкой современных графических возможностей, включая карты нормалей и постпроцессинг. Основной мотивацией стал эксперимент после выхода 64-битного патча от OldUnreal, который добавил в игру поддержку OpenGL 3.3, что открыло дорогу для новых рендереров. Этот патч стал важной вехой для ретро-сообщества, так как позволил запускать классику на современных системах без потери производительности, а для автора — отправной точкой для проверки возможностей ИИ в сложной reverse-engineering задаче.
Первые две недели ушли на реверс-инжиниринг бинарников игры, изучение слитых исходников Unreal Championship 2 и Unreal Warfare и подбор смещений в VTable. Из 32 функций, которые движок ожидает от рендерера, достоверно известны были только 14, и автору пришлось действовать вслепую, пересобирая DLL каждые 5–10 минут и анализируя логи крашей. Первый успех пришёл, когда движок принял DLL и игра запустилась с чёрным экраном, но без падения — по звуку можно было понять, что матч идёт. Затем потребовалось наладить передачу вершин и вывод каркасной геометрии, что заняло ещё несколько дней из-за различий между DirectX и OpenGL в координатных системах и управлении состоянием. Этот этап был критически важен, так как любая ошибка в смещении функции приводила к мгновенному крашу, и только методичный перебор и анализ адресов падений позволили добиться стабильной работы.
Следующий этап — воссоздание системы материалов UE2 в GLSL — оказался самым трудоёмким и занял 4–6 недель. Оригинальная игра использовала Fixed-Function Pipeline с комбинаторами, Shader и FinalBlend, а современный OpenGL 3.3 Core Profile требует шейдеров. Пришлось реализовать систему «регистров комбинеров», которая разворачивает нодовый граф материалов UE2 в линейный GLSL-код с фиксированным числом шагов, поддерживая до 32 нод, 16 текстурных слотов с UV-трансформациями, кубические карты и проективные текстуры. Исходники 32-битной версии, найденные позже, почти не помогли, так как были завязаны на Direct3D 8, но позволили исправить пару логических багов. Интересно, что автор сознательно отказался от использования чужих исходников после того, как ИИ начал путаться в них, и решил полагаться только на собственный анализ и подсказки модели, что в итоге привело к более чистому коду.
Самая сложная часть — интеграция карт нормалей и Blinn-Phong Specular — потребовала неделю напряжённой работы. Автору пришлось вручную искать смещения полей UTexture в памяти, используя перебор и логические проверки, так как исходников не было. После этого постпроцессинг (Depth of Field, Bloom, Chromatic Aberration) был добавлен всего за неделю, поскольку логика экранных эффектов на GLSL не зависит от особенностей движка. В итоге рендерер стал полноценной заменой стандартному, обеспечивая современное качество картинки на старом движке. По сравнению с альтернативными рендерерами, такими как Direct3D 9 или Vulkan, этот OpenGL 3.3 вариант обеспечивает максимальную совместимость со старым железом и современными ПК, что было целью патча OldUnreal. Тем не менее, автор отмечает, что его реализация пока не поддерживает некоторые продвинутые эффекты, такие как динамические тени или HDR, и остаются вопросы с производительностью на слабых GPU.
Для российского сообщества моддеров и ретро-энтузиастов этот проект — демонстрация того, что современные ИИ-инструменты могут серьёзно снизить порог входа в сложную reverse-engineering разработку. Автор потратил всего 500 рублей на подписку на ИИ, что делает такой подход доступным. Однако в истории подчёркивается, что ИИ часто галлюцинировал, и приходилось перепроверять каждый ответ через другой ИИ, а также что без базового понимания логики программирования и отладки проект был бы невозможен. Это поднимает важные вопросы о роли ИИ в разработке: с одной стороны, он демократизирует доступ к технологиям, с другой — требует от разработчика критического мышления и умения проверять результаты.
История, опубликованная в потоке «Разработка», вызвала живой отклик: пользователи обсуждают как технические детали, так и этичность использования ИИ для написания кода без глубокого понимания. Сам автор признаёт, что проект — это в первую очередь эксперимент, и что он не рекомендует использовать его как основу для коммерческих продуктов. В ближайшем будущем он планирует выложить исходники в открытый доступ, чтобы другие энтузиасты могли продолжить развитие рендерера и адаптировать его под другие игры на Unreal Engine 2. Открытые вопросы остаются: сможет ли рендерер достичь паритета с коммерческими решениями, и как сообщество воспримет код, написанный с помощью ИИ. Тем не менее, этот эксперимент уже показал, что границы возможного расширяются, и, возможно, мы увидим больше подобных проектов в будущем.