Сповіщення
Очистити все

Формат файлів постпроцесингу (ppe)


Ранг:
Майстер
Роль:
Гість
Записи:
752
Приєднався:
2 роки тому
 

Формат файлів постпроцесингу (ppe)

 

Вступ

Представляю на суд громадськості результати моїх пошуків за форматом файлів постпроцесингу ( .ppe )

Нерозкритими для мене залишилося 6 змінних (змінні, які я для себе назвав free, обов'язково йдуть перед кожною тріадою ланцюжків, що управляють кольором і 3 коефіцієнти, йдуть у кожному правилі після байта функції), але простенькі ppe-файли можна робити і без них .

Взагалі, виявилося, що можливості ppe були сильно мною переоцінені (наприклад, тепловізор зробити з їх допомогою якщо і можна, то вкрай проблематично). Основний недолік - ppe можна застосувати тільки до всього екрану, на окремий об'єкт це не передбачено двигуном (навіть стелс-режим кровососа реалізується заміною моделі). Так що можу запропонувати лише трохи покращений прилад нічного зору.

Вийшло так собі, просто прибрав шуми, додав яскравості/контрастності, зате тепер із включеним nv днем ​​не побігаєш - засвічення майже як на теперішньому (як у кіно показують) і туман набагато сильніше заважає, клуби туману майже непрозорі.

З приводу компілятора/декомпілятора, дійшов висновку, що фільтр постпроцесу виріб штучний, сенсу в окремих утилітах немає - я все аналізував, клепав, змінював лише за допомогою блокнота та шістнадцяткового редактора (до речі, з'ясував, що при зміні файлу постпроцесу необов'язково перезапускати став навіть релоад робити ні до чого - зміни підхоплюються при наступному вимиканні постпроцесу в даному випадку nv).

p align="justify"> При аналізі ppe сильно допоміг той факт, що постпроцесс існує в грі в текстовому і компильованому вигляді (кому цікаво, копайте \gamedata\script\postprocess.script - повний розбір текстових файлів написаний звичайним скриптом, там же, в самому кінці функція main завантажує погоду і файл постпроцессингу, самі файли лежать \ gamedata \ config \ scripts наприклад proba.ltx ). Компільовані ppe лежать в anims.

 

Практика

ppe -файл - це набір правил, як повинен змінюватися той чи інший параметр зображення в часі, всього цих параметрів - 16 (назви взяті з текстових версій, щоб плутанини не було) . На відміну від текстової версії, ланцюжки повинні йти тільки в цьому порядку і їх завжди має бути тільки 16 (якщо гра вивалилася з повідомленням у логах noise.grain cannot be zer o, отже, ви щось пропустили). —————————————————————————————————————————————————— ————————————————————————————————————————

  • free1
  • color_add_red
  • color_add_green
  • color_add_blue

Вибрана колірна компонента множиться на коефіцієнт, то при параметрі 1 чистий білий колір залишиться білим, а чистий чорний - чорним, інші набудуть компонентний відтінок. —————————————————————————————————————————————————— ————————————————————————————————————————

  • free2
  • color_base_red
  • color_base_green
  • color_base_blue

Зазначене значення приймається як база для даного кольору, тобто, якщо у даного пікселя значення кольору менше зазначеного, воно приймається як зазначене, а якщо більше, то залишається колишнім. Слід зазначити, що це єдиний набір змінних, задирати значення в яких вище 0.5 немає сенсу, 0.5 додається десь у нетрях движка. —————————————————————————————————————————————————— ————————————————————————————————————————

  • free3
  • color_gray_red
  • color_gray_green
  • color_gray_blue

Ця тріада правил відповідає за вагу кольору в сірому/яскравому поданні і в звичайному кольоровому режимі результату не видно. Але при збільшенні правила gray стає ясно, що при color_gray_red = -1 чисто червоні компоненти стають чорними, 0 = залишаються без змін, 1 - чисто білими ——————————————————— —————————————————————————————————————————————————— —————————————————————

  • gray

Змінна керує величиною зворотної насиченості, тобто чим більше gray (максимум +1) тим менша насиченість зображення ———————————————————————————— —————————————————————————————————————————————————— ——————————

  • blur

Розмиття зображення, при великих значеннях (пробував 25) починаються косяки, псується нижня частина, якщо довго стояти на місці ——————————————————————————— —————————————————————————————————————————————————— ———————————

  • duality_h – роздвоєння зображення по вертикалі
  • duality_v – роздвоєння зображення по горизонталі
  • noise_intensity - інтенсивність шуму
  • noise_granularity – розмір зерна шуму
  • noise_fps - скільки разів на секунду шум повинен перераховуватися

Значення вказується щодо екрану, тобто при 1 копії об'єкта, що спочатку знаходиться в центрі, виявляться точно по краях ————————————————————————————— —————————————————————————————————————————————————— —————————

Файл завжди починається з 01 00 00 00 - швидше за все це синатура, за якою двигун визначає вміст (до речі, у файлів anm, які містять анімацію камери і схоже мають ту ж логіку будівлі, що і ppe сигнатурою є 00 11 00 00 ) .

Потім йде 4 байти невизначеної змінної, яку я собі назвав free. Усього їх 3. Ці змінні стоять лише перед тріадами, що відповідають за зміни кольорів, зазвичай дорівнюють 7C 00 00 00 але є невеликі варіації. Візуально визначити, що змінюється при зміні цієї змінної я не зміг, якщо хтось здійснить цей подвиг - вічна слава 🙂

Потім починаються ланцюжки у перерахованому вище порядку. Ланцюжок починається з 01 01 ХХ 00 де ХХ - число правил в даному ланцюжку. Якщо вказано 01 01 00 00 (тобто ланцюжок з 0 правил, то цей ланцюжок у постпроцессингу не бере участі і відразу після нього повинен починатися наступний ланцюжок). Основна помилка, яку можна припустити - невідповідність реального числа правил із зазначеним у заголовку ланцюжка. Контроль, контроль та ще раз контроль.

Кожен ланцюжок складається з правил зміни змінної. Виходячи зі скрипту розбору текстових версій можна припустити, що правил у ланцюжку не повинно бути більше 16 (хоча можливо це тільки для текстових). Цілком необов'язково, що цих правил у різних ланцюжках буде однакова кількість або навіть триватиме вони однаковий час.

Правило містить у собі завжди рівно 23 байти. Зразковий опис -

9A 99 99 3E 00 00 A0 40 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
----------- ----------- -- ----- ----- ----- ----------- ------------
 значення час ф k1 k2 k3                                   
  • значення - 4-байтна float змінна, зазвичай змінюється від -1 до +1
  • час - у секундах 4-байтна float змінна
  • ф - функція, у всіх ppe дорівнює 00, але спробував міняти ( не повинна бути 04 - гра вилітає ). 00,03 – синус, 01,05 – косинус, 02 – лінійна, інші значення ігноруються і правило перестає працювати взагалі.
  • k1, k2, k3 - коефіцієнти для функцій ось з ними майже не розбирався, на лінійну функцію змін не виявив, на синус/косинус впливають дуже сильно, але на пошук закономірності не вистачило часу, за умовчанням дорівнюють 00 80 00 80 00 80
  • залишок рядка у всіх файлах 00 80 00 80 00 80 00 80 - зміна візуально нічого не змінює, можливо, зарезервовано для наступних версій.

От і все. Поле для роботи як бачите ще є – коефіцієнти k[1,2,3] та змінні free[1,2,3] – пропоную громадськості влаштувати мозковий штурм на них. —————————————————————————————————————————————————— ————————————————————————————————————————

Насамкінець мій файл нічного зору з коментарями (для використання коментарі видалити, шістнадцятковий код загнати у WinHex і зберегти як anims\x.ppe (ім'я будь-яке), і не забути поправити config\misc\postprocess.ltx в потрібній секції).

01 00 00 00 // сигнатура

// Кольори викручуємо на максимум
7C 00 00 00 // free1
01 01 02 00 // color_add_red
00 00 80 3F 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 3F 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00 // color_add_green
00 00 80 3F 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 3F 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00 // color_add_blue
00 00 80 3F 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 3F 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80

// Не розумію як, але ця тріада підфарбовує вже перекладене в
// Чб зображення, тобто робимо трохи синюватим результат, заодно
// огрубляємо трохи червоні або зелені.

6C 10 00 00 // free2
01 01 02 00 // color_base_red
CD CC CC 3D 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
CD CC CC 3D 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00 // color_base_green
CD CC CC 3D 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
CD CC CC 3D 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00 // color_base_blue
CD CC 4C 3E 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
CD CC 4C 3E 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80

// У сірому режимі всі червоні об'єкти – білим, сині та зелені – чорним

7C 00 00 00 // free3
01 01 02 00 // color_gray_red
00 00 80 3F 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 3F 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00 // color_gray_green
00 00 80 BF 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 BF 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
01 01 02 00 // color_gray_blue
00 00 80 BF 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 BF 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80

// Повністю чорно-біле зображення з урахуванням правил color_gray_*
01 01 02 00//gray
00 00 80 3F 00 00 00 00 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80
00 00 80 3F 00 00 00 41 00 00 80 00 80 00 80 00 80 00 80 00 80 00 80

01 01 00 00 // blur

// Двоїння в очах не буде

01 01 00 00 // duality_h
01 01 00 00 // duality_v

// Шуму не буде
01 01 00 00 // noise_intensivity
01 01 00 00 // noise_granularity
01 01 00 00 // noise_fps

   
Цитата