Автор: YURBAN
Дата публикации: 16.03.2013
Совсем недавно вышла новая игра от CryTek. В новой версии движка, разработчики дружно послали подальше всех обладателей старых DX9-DX10 карт, решение этой несправедливость мы рассмотрим в данной статье. Давайте дружно передадим привет Немцам!.
Всё дело в том, что CryTek хочет заработать как можно больше денег, для этого и была проплачена данная игра. Ведь AMD и Nvidi'и выгодно побыстрее продать свои карты DX11.
Иначе чем объяснить такой отказ от старого API? Когда игра также выходит на консолях PS3 и XboX 360, где максимальный уровень поддержки DX заканчивается цифрой девять!
Единственное весомое отличие этих движков в том, что последний не поддерживает старый API DirectX, остальное худо бедно схожее. Теперь обо всем по порядку.
Общее: в обоих движках структура папок является схожей, в частности: Bin32, Engine, Patch лежат в корне основной папки игры.
Для успешной переделки я (YURBAN) использовал Crysis 2 v. 1.9 и Crysis 3 v. 1.2
Операции:
Качаем программу PAK Manager (Pak Manager Tool), она нужна для распаковки шифрованных *.PAK файлов игры, с официального сайта CryTek, поставляемую в комплекте с Crysis 2 Mod SDK
Обновлено 22.03.2013!
После изнурительного копания в CryEngine 2 и CryEngine 3 было установлено, что в последнем (из игры), присутствуют важные настройки.
Среди них нужно отметить - r_Driver(CE3) принимает значения: DX11, AUTO и NULL.
Цитата из crysis3.exe "Sets the renderer driver ( DX11/AUTO/NULL )". А также очень помогла строчка: Specify in system.cfg like this: r_Driver = "DX11". Specifies index of the preferred video adapter to be used for rendering (-1=off, loops until first suitable adapter is found). Выставление r_Driver="DX9" привело к исчезновению части объектов на картах и отсутвием прорисовки персонажей (видна была только голова и оружие).
Проверяем r_ShadersExport (0 off, 1 allow shader export during shader cache generation - Currently 360 only.), то есть экспортируем обработанные эффекты в файлы (Crysis3\USER\Shaders\Cache).
И опять неудача, как было выявлено научными изысканиями, большинство команд, которые были доступны в C2, здесь либо зафиксированы, либо движок не реагирует никак на их изменение, хотя в коде часто просматриваются настройки для PS3 и Xbox 360, в частности: r_ShadersPS3 и r_ShadersXenon. Вообще говоря, сам файл crysis3.exe содержит много мусора и ненужной информации, например, можно найти вызовы и параметры компилятора, но то что нужно отыскать так и не удалось, на этой ноте изучение CryEngine 3 было остановлено. Стоит отметить что в коде C3, проскакивает выражение D3D9, так что возможно, изначально, CE3 создавался и под DX9 также, видимо разработчики столкнулись с какой-то необъяснимой проблемой и решили не напрягатся, сварганив по быстрому "новый" движок.
Опытным путем было выявлено, что C3, откликается на комманду в system.cfg, sys_spec (0-6), причем значение 5 для Xbox 360, а значение 6 для PS3! (sys_spec=5). Должен заметить что в этом случае, игра начинает использовать весь ваш N-ядерный процессор без остановки, нагружая его на 99%! Видео ниже демонстрирует основную проблему, в движке CE3 нет текстур низкого разрешения, по крайней мере для персонажей. Кроме того обнаружили возможность перекомпиляции текстур. Смотрите скриншоты ниже и смотрите ролик.
В данный момент команда энтузиастов HardWare Masters работает над этим, как закончим и протестируем - выложим!
Для установки пакета разработчика от немцев, требуется C2 версии 1.9, если у Вас установлена пиратка и SDK не устанавливается вываливаясь с ошибкой: "requires a full installation of the game Crysis 2, updated to Patch 1.9", то нужно сделать следующее:
- проверить ключ реестра (для 32-битных систем) HKEY_LOCAL_MACHINE\SOFTWARE\Crytek\Crysis 2 ключ строкового типа Install Dir, если такой записи нет в реестре или путь указан не верно, то создать и прописать нужный!
- для x64 систем, ключ реестра лежит по адресу: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crytek\Crysis 2, действия аналогичны предыдушему пункту.
Документация по CryENGINE 3
Crysis 3 X360 Image (Шейдеры 9)
DirectX SDK
После массы проведенного времени в изучении движка от игры Crysis 2, на ум пришла идея эмуляции/обхода API вызовов DirectX 11. Собственно идея не новая, если вспомнить старую утилиту от немецкого автора, под названием 3D Analyze, которая позволяла эмулировать версию шейдеров и настраивать каждое приложение практически под любую видео карту, то этот метод решения является более быстрым и надежным. Мы отправили Thomas'у сообщение, но и сами уже начали работать по этому направлению. Патч/Хак/Утилита будет представлять себя либо прямой патч (.dll) либо универсальный (модифицировать память процесса).
В итоге исследований EXE-файла было решено сделать "свою" библиотеку d3d11.dll, чтобы функции в библиотеке возвращали нужные параметры без участия драйверов. Также в процессе исследования технологии DirectX был найден очень интересный ряд деталей, например то, что любую модель с эффектами DX11, можно отрендерить практически на любой видеокарте. Собственно возникло подозрение, что все "плюшки" DX10/11 и т.д., это надстройки над DX9, и поддержка соотв API, кроется только в драйверах. Ведь какая разница что отправлять на чип? В конце концов всё равно машинный код отправляется на чип, для примера, Тесселяция - по факту, добавляет ещё несколько каркасов к уже имеющейся модели. В итоге мы видим воочую весь современный маркетинг, то есть, для продажи новых чипов придумали новые фишки, которые и на более ранних моделях (8600GT / Radeon 4000 серия...) можно также воссоздать. Например если в DX9 выпуклость можно построить 9 командами, то в DX11 лишь 3мя, это просто для примера, на выходе всё равно графический чип будет нагружаться одинаково ). Ещё один момент, даже если Вы сделаете модель только для 11 версии шейдеров, Вам всё равно придется устанавливать "выпуклости и освещение" руками. Именно по этому в Crysis 3 шейдеры для моделей уже лежат в самой игре ). По факту все блоки стоят в драйверах и в библиотеках (спасибо MS, NV и AMD - все монополисты). Ниже видео, демонстрирует в какую сторону нужно копать, а также наглядно показывает верность моего утверждения.
Что Мы хотим сделать? Заменить библиотеки DX11, аналогами, то есть каждый вызов фунции API 11.0/11.1, будет всегда успешным ;).
Немного вспомнив историю... Например как долго народ сидел на XP, и всех всё устраивало, а также провал Vista (основная фишка псевдо DX10), а потом медленный переход на Seven (вылезанная виста и псевдо-новый DX11), ещё раз доказывает верность утверждения.
После поверхностного исследования игры на предмет вызова функций DirectX, до загрузки меню, были найдены две: D3D11CreateDevice и D3D11CreateDeviceAndSwapChain. Открыв базу знаний микрософта (MSDN) было обнаружено, что расхождений не так уж и много, за исключением кол-ва аргументов.
Объявление функции D3D11CreateDevice | Объявление функции D3D10CreateDevice |
Объявление функции D3D11CreateDeviceAndSwapChain | Объявление функции D3D10CreateDeviceAndSwapChain |
Этот код лежит на сайте MSDN, так что любой может проверить. В частности функция D3D11CreateDeviceAndSwapChain вызывается лишь два раза в игре до загрузки главного меню, собственно скорее всего тест на проверку фишек 11-ой версии DirectX на этом и основан, было решено подменить библиотеку d3d11.dll (поместил в папку с crysis3.exe), написав её "клон" который в первую очередь будет перехватывать все вызовы функций из игры и записывать в ЛОГ-файл, во вторых всегда можно будет вернуть нужные Нам значения!
Скриншот ниже, не показывает различий между DX9 и DX11 (Dragon Age 2), DX это просто программный API для видео драйвера, драйвер в свою очередь создает набор команд (инструкций) для графического процессора. Фишки DirectX 11 это просто дополнительные эффекты для DX9, DX10/DX11 - просто маркетинг чтобы продавать Windows Vista и другие операционки от Microsoft, а также чтобы менять видеокарту чаще из-за "новых" фишек, которые по сути ни что иное как просто программа. Если бы у Вас была документация по видео адаптеру (мы пытались её получить, но нам ответили отказом), например GeForce 6600, Вы бы могли легко сделать нужный драйвер под любой API, который умел бы создавать поток комманд для наложения тех же эффектов DX11 на простенькой 6600 или на любом другом чипе и адаптере!
Ссылка #1: Crysis3_PakDecrypt.7z (6,1 МБ)
Автор: Селиверстов Ю.В. aKa YURBAN