Crysis 3 DirectX 9, DirectX 10 теория и практика

Автор: YURBAN

Дата публикации: 16.03.2013

Crysis 3 DX9 DX10

Совсем недавно вышла новая игра от CryTek. В новой версии движка, разработчики дружно послали подальше всех обладателей старых DX9-DX10 карт, решение этой несправедливость мы рассмотрим в данной статье. Давайте дружно передадим привет Немцам!.
Всё дело в том, что CryTek хочет заработать как можно больше денег, для этого и была проплачена данная игра. Ведь AMD и Nvidi'и выгодно побыстрее продать свои карты DX11.
Иначе чем объяснить такой отказ от старого API? Когда игра также выходит на консолях PS3 и XboX 360, где максимальный уровень поддержки DX заканчивается цифрой девять!

Сравнение Crysis 3 и предыдущей версии игры (C3)

Единственное весомое отличие этих движков в том, что последний не поддерживает старый API DirectX, остальное худо бедно схожее. Теперь обо всем по порядку.
Общее: в обоих движках структура папок является схожей, в частности: Bin32, Engine, Patch лежат в корне основной папки игры.

Начинаем превращение Crysis 3 в Crysis 2.5 ))

Для успешной переделки я (YURBAN) использовал Crysis 2 v. 1.9 и Crysis 3 v. 1.2
Операции:

Проблема отстутсвия локализации кроется в следующем: в Crysis 2 имеется лишь один архив gamecrysis2\Localized\Russian.pak, в Crysis 3 их уже два - Localization\Russian.pak и Localization\Russian_xml.pak

Работаем по "жесткой" схеме

Качаем программу PAK Manager (Pak Manager Tool), она нужна для распаковки шифрованных *.PAK файлов игры, с официального сайта CryTek, поставляемую в комплекте с Crysis 2 Mod SDK

Crysis 3 DX9 Project

Обновлено 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 нет текстур низкого разрешения, по крайней мере для персонажей. Кроме того обнаружили возможность перекомпиляции текстур. Смотрите скриншоты ниже и смотрите ролик.

Crysis3.exe FAR Crysis3.exe #2 FAR

В данный момент команда энтузиастов HardWare Masters работает над этим, как закончим и протестируем - выложим!

Crysis 2 MOD SDK

Для установки пакета разработчика от немцев, требуется 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, действия аналогичны предыдушему пункту.

Crysis 2 SDK MOD

Полезные ссылки

Документация по CryENGINE 3
Crysis 3 X360 Image (Шейдеры 9)
DirectX SDK

DirectX 11 Hook/Hack/Patch

После массы проведенного времени в изучении движка от игры 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 11 - концепт

DirectX 11 Alternative

После поверхностного исследования игры на предмет вызова функций DirectX, до загрузки меню, были найдены две: D3D11CreateDevice и D3D11CreateDeviceAndSwapChain. Открыв базу знаний микрософта (MSDN) было обнаружено, что расхождений не так уж и много, за исключением кол-ва аргументов.

Объявление функции D3D11CreateDevice

HRESULT D3D11CreateDevice( _In_ IDXGIAdapter *pAdapter, _In_ D3D_DRIVER_TYPE DriverType, _In_ HMODULE Software, _In_ UINT Flags, _In_ const D3D_FEATURE_LEVEL *pFeatureLevels, _In_ UINT FeatureLevels, _In_ UINT SDKVersion, _Out_ ID3D11Device **ppDevice, _Out_ D3D_FEATURE_LEVEL *pFeatureLevel, _Out_ ID3D11DeviceContext **ppImmediateContext );

Объявление функции D3D10CreateDevice

HRESULT D3D10CreateDevice( _In_ IDXGIAdapter *pAdapter, _In_ D3D10_DRIVER_TYPE DriverType, _In_ HMODULE Software, _In_ UINT Flags, _In_ UINT SDKVersion, _Out_ ID3D10Device **ppDevice );

Объявление функции D3D11CreateDeviceAndSwapChain

HRESULT D3D11CreateDeviceAndSwapChain( _In_ IDXGIAdapter *pAdapter, _In_ D3D_DRIVER_TYPE DriverType, _In_ HMODULE Software, _In_ UINT Flags, _In_ const D3D_FEATURE_LEVEL *pFeatureLevels, _In_ UINT FeatureLevels, _In_ UINT SDKVersion, _In_ const DXGI_SWAP_CHAIN_DESC *pSwapChainDesc, _Out_ IDXGISwapChain **ppSwapChain, _Out_ ID3D11Device **ppDevice, _Out_ D3D_FEATURE_LEVEL *pFeatureLevel, _Out_ ID3D11DeviceContext **ppImmediateContext );

Объявление функции D3D10CreateDeviceAndSwapChain

HRESULT D3D10CreateDeviceAndSwapChain( _In_ IDXGIAdapter *pAdapter, _In_ D3D10_DRIVER_TYPE DriverType, _In_ HMODULE Software, _In_ UINT Flags, _In_ UINT SDKVersion, _In_ DXGI_SWAP_CHAIN_DESC *pSwapChainDesc, _Out_ IDXGISwapChain **ppSwapChain, _Out_ ID3D10Device **ppDevice );

Этот код лежит на сайте 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 или на любом другом чипе и адаптере!

DX9 and DX11

Файлы

Ссылка #1: Crysis3_PakDecrypt.7z (6,1 МБ)


Автор: Селиверстов Ю.В. aKa YURBAN

Авторизация

Канал на Youtube