- Порівняння Crysis 3 і попередньої версії гри (C3)
- Починаємо перетворення Crysis 3 в Crysis 2.5))
- Працюємо по "жорсткої" схемою
- Crysis 3 DX9 Project
- Чого вдалося досягти
- Crysis 2 MOD SDK
- Корисні посилання
- DirectX 11 Hook / Hack / Patch
- Підготовка до хаку
- файли
» статті »Crysis 3 DirectX 9, DirectX 10 теорія і практика
Дата публікації: 16.03.13 8:58
Останнє оновлення: 11.09.18 6:26
Зовсім недавно вийшла нова гра від 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 немає текстур низького дозволу, принаймні для персонажів. Крім того виявили можливість перекомпіляції текстур. Дивіться скріншоти нижче і дивіться ролик.
В даний момент команда ентузіастів 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, дії аналогічні Попереднє пункту.
Корисні посилання
Документація по 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, до завантаження меню, були знайдені дві: 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 або на будь-якому іншому чіпі і адаптер!
файли
Важливо: для розпакування архіву, Вам потрібно використовувати архіватор з підтримкою формату 7z, наприклад, 7-zip (7-zip.org) або WinRAR (rarlab.com).
Посилання # 1: Crysis3_PakDecrypt.7z (6,1 МБ)
Автор: Селіверстов Ю.В. aKa YURBAN
Коментарі
Адже яка різниця що відправляти на чіп?Що Ми хочемо зробити?