Якою б не виявилася в підсумку Ghost Recon: Wildlands, одне в ній точно реалізовано відмінно: ландшафт. Типові для жанру джунглі в грі змінюються засніженими гірськими піками, соляними пустелями і болотами.
Ghost Recon: Wildlands - наймасштабніший ігровий світ з усіх, що коли-небудь створювала Ubisoft. Дія відбувається в Болівії, і ігрова версія країни складається з 11 абсолютно різних «биомов». Річки, озера і струмки займають 16 квадратних кілометрів.
В основному це природний ландшафт з рясною рослинністю - деревами, кущами і так далі. Загальна протяжність доріг - 600 кілометрів (без урахування численних стежок).
В ігровому світі є діюча залізниця і 200 локацій: табори, особливі об'єкти, аванпости і 58 повністю процедурно-генеруються сіл.
перший прототип
Після Ghost Recon: Future Soldier ми стали експериментувати з більш масштабними ландшафтами. Взяли реальні топографічні дані та «загнали» їх в DEM-файл для нашого движка.
Потім (за допомогою Houdini) ми зібрали інструменти для наступних цілей:
1. Автоматизація створення тайленних LOD-мешів.
2. Розстановка точок розподілу рослинності з дотриманням умов: нахилу, висоти, щільності, відстані між деревами і так далі.
3. Визначення маски сплаттінга для розподілу матеріалів за встановленими правилами, відповідно до нахилом, висотою, жорсткістю і іншим, а також іншої маски для машини генерації ігрового світу на кшталт flowmap.
Прототип, створений за пару місяців чотирма дизайнерами і одним графічним інженером, виявився вельми цікавим.
Ми запускали його на Yeti, движку Future Soldier. Результати були непоганими, але нам здалося, що він дещо обмежує наші амбіції, і ми «пересіли» на Anvil від серії Assassin's Creed.
Прототип допоміг нам реалізувати дві речі:
- Компенсувати необхідність в технології створення ландшафту, яка одночасно була б легкою в освоєнні для дизайнерів і видавала б хорошу продуктивність.
Houdini була досить гнучкою і надефективну: технічні дизайнери могли створювати інструменти самі, без залучення інженерів.
Ліплення з допомогою GPU
в реалістичний і різноманітний світ. Цей скріншот був зроблений за кілька місяців до схвалення технології, і на ньому ви бачите приблизно те, чого ми хотіли добитися.
Нам потрібен був неймовірний рівень деталізації поблизу, шикарні види далеко і непомітний перехід між цими двома станами. Тепер, якщо викрутити налаштування графіки на повну, щільність може досягти десяти текселей на сантиметр, а трикутників - один на кожні два сантиметри.
Оскільки гравець в Wildlands може відправитися куди завгодно, рівень деталізації скрізь повинен бути однаковим.
Інструменти редагування впливають на карту висот, і в підсумку виходить плаваюча цільова точка рендеру, яку ігровий шейдер може використовувати безпосередньо.
Гра створюється в кілька циклів, тому у розробників повинна була бути можливість тестувати різні ідеї на ігровому движку так, щоб їх можна було швидко і безболісно відкотити. Для цього вони використовували шари.
Дані, які генеруються механізмом створення ігрового світу, знаходяться на так званому «базовому шарі», а кожна зміна лягає на власний «макро-шар». Так, якщо внесені зміни виявляються зайвими, вміст «макро-шару» можна легко прибрати, щоб повернути карту висот до вихідного стану.
Ось невелика демонстрація інструменту ліплення висот, в якому використовується кисть «копіювати / вставити» та «стерти».
Кожній модифікації, зробленої в Houdini, виділявся окремий шар. Цей процес буде докладніше розібраний трохи нижче, зараз же достатньо зазначити, що в підсумку технічні дизайнери змогли змінювати ландшафт так, як їм це заманеться, а внесені ними зміни при цьому коректно відображалися.
У самому останньому шарі містяться всі правки дизайну рівнів, які неможливо було б внести за допомогою Houdini.
розподіл матеріалів
Як вже було сказано, в першу чергу розробники хотіли створити реалістичний світ зі стабільною якістю графіки. Поглянувши на розмір цього світу, вони зрозуміли, що малювати все вручну не вийде, і процес доведеться частково автоматизувати. Зокрема, вони вирішили, що матеріали будуть розподілятися процедурно.
Інструмент редагування ландшафту і так давав можливість змінювати карту висот в залежності від напрямку нормалей для створення більш чіткого рельєфу. Цього було майже достатньо, щоб верхівки гір видали виглядали переконливо, але розробники вирішили розвинути ідею.
Замість демонстрації кольору гра показувала гравцеві повнофункціональний матеріал, але тільки якщо виконувалися певні умови, засновані на топології, наявності перешкод або простих рядках коду, які піксельний шейдер міг обробляти в реальному часі.
За зображенні вище видно, що кожна настройка в Wildlands складається з «стопки» умов, дотримання яких оцінюється послідовно, від низу до верху. Гравець бачить матеріал, що відповідає останньому правилом в «стопці».
Тепер дизайнери Ubisoft могли швидко створювати сцени, проте над переходами між ними все ще потрібно було багато працювати, що було проблематично. Проблему цю вирішили, керуючись тією ж філософією «умов».
Результат розподілу матеріалів зберігається в дві текстури. Першу назвали «сплаттінговой» - вона містить індекси матеріалів для кожної позиції в карті висот. Другу - «перспективної», зовні вона нагадує скріншот з Google Maps. Коли відбувається рендеринг вилучених від гравця частин ландшафту, «перспективна» текстура використовується як карта альбедо.
Можна було б розбити ландшафт на невеликі унікальні фрагменти, щоб ізолювати цю зону, але тоді гра займала б занадто багато місця. Вирішили проблему наступним чином: ці фрагменти генеруються за допомогою обчислювального шейдера, як тільки з'являються в поле зору.
Так вдалося зробити процес менш вимогливим до ресурсів комп'ютера. Зараз приблизно в 80 відсотках ландшафту використовується 4 матеріали замість 12.
Тоді виникла нова проблема з мережею доріг. Генерувати їх так само, як фрагменти ландшафту, було дуже накладно з технічного боку, а якщо зберігати їх на диску, то гра може не влізти на Blu-ray.
В результаті було вирішено вставити дорогу в ландшафт замість того, щоб створювати її з простих геометричних об'єктів, однак через це виникли нові проблеми на кшталт необхідності створювати ефективний перехід між матеріалами, та й деталей на дорозі виходило мало.
Спочатку декали екранного простору виглядали багатообіцяюче, але незабаром стало зрозуміло, що їх вимогливість до ресурсів - занадто велике обмеження. До того ж, вони не впливали на топологію деформованих мешів.
Віртуальні текстури
Для Wildlands віртуальні текстури стали чудовою можливістю оптимізувати графіку - з ними Блендінг матеріалів і все проекції декалей були б обраховані заздалегідь. Плюс, віртуальні текстури вже багато разів використовувалися в інших іграх, так що все знали, як з ними працювати.
Як і у будь-який інший техніки рендеринга, у віртуального текстурирования є свої мінуси. На щастя, розробникам з Ubisoft вдалося його вдосконалити.
Зазвичай те, яка частина віртуальної текстури необхідна, визначається так: сцена розбивається на фрагменти, і матеріал проектується на невидиму для гравця поверхню за допомогою CPU.
Операція ця складна, особливо якщо гра запущена на 4k-дисплеї. Більш того, при створенні ландшафту Wildlands використовується тесселяция, і виводиться безліч крихітних трикутників - якщо використовувати однобуферную промальовування меншого дозволу, почне кульгати деталізація.
Так що розробники додали додаткову 3D-текстуру на етапі обробки через Gbuffer. Поки ландшафт рендерится з UV-розгортками і кількістю mip як вихідних змінних, що демонструється гравцеві ділянку віртуальної текстури можна змінювати безпосередньо.
Після цього обчислювальний шейдер обробляє вміст текстури і шукає втрачені частини. Результати обробки (всього кілька байтів) потім передаються CPU.
Для контексту: на найвищих налаштуваннях графіки щільність пікселів в віртуальних структурах сягає десяти текселей на сантиметр. Якби все це було заздалегідь обраховано і стисло, знадобилося б два петабайта дискового простору.
Тому контент генерується по ходу руху гравця: матеріали та декали «Бленд» на невидимих для нього поверхнях, а потім відразу ж стискаються через асинхронні обчислення.
Тут виникла нова проблема: почала страждати зв'язність кадрів, оскільки через величезної кількості оброблюваних тайлів частота кадрів під час їзди на транспорті могла серйозно впасти. Тому оновлення віртуальних текстур було розбите на кілька кадрів, а розробники витратили багато часу на те, щоб знайти золоту середину між хорошою частотою оновлення картинки і низькою затримкою перед появою повністю прорахованою текстури.
Зрештою їм вдалося замінити шейдер переднього плану сцени віртуальним текстуруванням. На щастя, це рішення прийняли на ранніх етапах розробки, так що запас необхідної пам'яті можна було швидко відрегулювати. Як видно по зображенню вище, при дозволі 1080р текстури займають 200 мегабайт і один гігабайт, якщо підвищити дозвіл до 4k.
Статистика продуктивності на Xbox One
На зображенні - середні значення, сильно залежать від характеру сцени, однак можна з упевненістю сказати, що обробка укладається в 8 мілісекунд в більшості випадків. BC-компресія йде паралельно.
процедурні інструменти
Вимог до інструментів було багато. Їх потрібно було застосовувати як у масштабній роботі, так і в більш дрібної - ми постійно повторювали, що повинні контролювати все - від найменшого камінчика до найбільшої скелі.
Також на специфіку інструментарію впливало те, що над одним величезним рівнем працювало дві команди з Парижа і Будапешта. При цьому їм потрібна була можливість змінювати свої рішення, експериментувати.
Інструменти стали даними: вони створюються і зберігаються так само, як і будь-які інші елементи ігрового світу. Інструмент - це свого роду ігрова мета-сутність, яка створює суті більш дрібні.
І, що найважливіше, за допомогою цих інструментів потрібно було здійснювати щоденну підтримку світу гри.
По-перше, інструменти розробників Wildlands засновані на умовах. Користувачі редагують параметри і змінюють умови, щоб створювати контент. По-друге, вони детерміновані: при одних і тих же умовах завжди буде виходити один і той же результат. До того ж, за допомогою цих інструментів все створюється тільки під час розробки гри, а не по ходу ігрового сеансу.
Всі інструменти були створені за допомогою Houdini.
Що таке Houdini? Ця програма для створення цифрового контенту від SideFX. Його часто використовують для створення спецефектів, але це не наш випадок - ми за допомогою Houdini створювали робочі оточення.
Для чого він? По-перше для прототипів - через Houdini дуже зручно швидко відчувати ідеї. По-друге, як уже було сказано, за допомогою нього створювалися інструменти. А ще Houdini дуже швидко превізуалізірует і оптимізує дані і видає зручну статистику.
Чому Houdini, а не інструменти на C ++ / GPU? Так швидше. На компіляцію не потрібно витрачати час: всі інструменти - це HDA (цифрові Ассет Houdini, Houdini digital assets), так що в них легко вносити зміни, після чого модифікована версія інструменту відразу стає доступна всій команді. Так, спеціально створені інструменти могли бути швидше, але Houdini настільки гнучкий, що це компенсує деякі втрати у швидкодії.
Ландшафт в Wildlands - фундамент для всього іншого, тому в першу чергу потрібно було створити оболонку для доступу до ландшафтним даними. На зображенні вище - приклад частини ландшафту (500 метрів), перенесеної в Houdini. Для неї вже є кілька налаштувань, але ж це тільки базовий шар.
Те ж саме, тільки з усіма матеріалами. Тут є і вручну виліплені шари, і згенеровані (на кшталт доріг).
Різні зони ігрового світу потрібно було наповнювати контентом, і для цього теж були створені спеціальні інструменти. Геометрія не генерировалась через них безпосередньо - просто у дизайнерів з'явився зручний спосіб розподіляти вже наявні Ассет.
У підсумку приблизно 80% даних було створено або оброблено за допомогою Houdini. Оскільки всі інструменти базуються на одних і тих же умовах, рівень якості контенту залишався незмінним.
А дизайнери економили час і могли зосередитися на більш цінних завданнях, які за допомогою автоматизованих інструментів вирішити було не можна. Наприклад, на надання сенсу ігровому світу або на створенні сюжетів з елементів ігрового оточення.
Фундамент для всього
Тепер більш детально про те, як на ландшафт накладалися інші шари.
Ландшафт - це щось більше, ніж просто висоти і сплаттінг текстур. Розробники екстраполювали на нього дуже важливу інформацію, яку потім можна було використовувати повторно в інших інструментах. Наприклад, з даних про висоту можна було витягти інформацію про жорсткість матеріалу і формі вершини об'єкта, також вони корисні при визначенні положення каменів і рослинності.
Процес був кілька автоматизований. Так, кожен раз, коли користувач змінює топологію ландшафту, Houdini обробляє всі залежні змінні. Файли з оновленими даними відправляються на сервер, так що їх відразу можна використовувати в інших інструментах Houdini.
Оскільки все оновлюється на льоту, відпадає необхідність у створенні та перевірці різних версій. Розробники взагалі відмовилися від створення версій і резервних копій і залишилися дуже задоволені результатом.
Як бачите, дороги і їх оточення генеруються процедурно. Як і стежки, рослинність, скелі. Два останніх великих каменю розташовувалися вручну, а все інше - ні, в тому числі вигин річки, меш води і вектор потоку. Навіть села - і ті генеруються.
Сюди ж відноситься залізниця з тунелями та мостами.
Все це працює і в більш глобальному масштабі - дороги з'єднуються, рослинність і села розподіляються по карті і так далі.
Дороги прокладаються так: визначаються точки на карті, які потім процедурно зв'язуються магістралями, виходячи із заданих умов. Перші результати були непоганими, але все-таки недостатньо якісними.
Ознайомившись з одного науковою роботою. присвяченій процедурної генерації доріг, розробники стали експериментувати з анізотропним алгоритмом створення виваженого найкоротшого шляху між двома точками. Результат виправдав всі очікування - потрібно було тільки працювати не з чотирма напрямками, а з безліччю, і з різними дистанціями для кожного напрямку.
Досить розташувати на ландшафті кілька ключових точок і ...
виходить мережа з доріг і стежок. Все це генерується заздалегідь, оскільки на обробку даних, пов'язаних з дорогами, не потрібно багато часу.
Дані доріг складаються з наступних елементів:
1. Траєкторії, які можна використовувати в безлічі інших речей на зразок ІІ-управління трафіком.
2. терраформинга. Текстура з картою висот, яка потім накладається поверх ландшафту.
3. Сплаттінг. Тут виходить маска текстури для поновлення даних матеріалів ландшафту.
4. Мости. Алгоритм прокладки доріг може змусити їх перетинати річки, якщо це найбільш ефективний маршрут.
У розробників були інструменти для ручного створення декалей, ліній електропередач і огорожі навколо доріг, однак зі створенням автоматичної системи прокладки мережі доріг вони зрозуміли, що можуть вбудувати в неї всі елементи, що обрамляють дороги, щоб вони теж розставлялися процедурно.
Залізниці працюють приблизно так само, але з трохи іншими базовими умовами. Нахил у них менше, повороти - більш плавні, більше мостів і тунелів.
Також залізниці повинні були перетинатися з дорогами звичайними строго під кутом 90 градусів, щоб не створювати проблем з трафіком.
16 квадратних кілометрів ігрового світу покрито водою. Все це - один тривалий меш, розбитий на ділянки площею в квадратний кілометр. Річки та озера можна створювати за допомогою інструменту редагування ландшафту. А ось струмків мало, але, що цікаво, вони генеруються за допомогою алгоритму прокладання доріг - ключовими точками стають вершини гір і місця впадання в річку.
Водні об'єкти знаходяться на окремому шарі, щоб вони протікали під дорогами - струмки розробники «загнали» в труби, а в місцях перетину річок з дорогами воліли розставляти мости. Оскільки траєкторії струмків (а в деяких випадках і річок) генеруються процедурно, цю інформацію можна використовувати для визначення векторної карти.
Settlement builder - один з найскладніших інструментів. За задумом розробників, для створення села йому повинно було бути досить вказати центр поселення, задати набір будівель і їх параметри. На створення такого інструменту пішло час, проте в підсумку їм це вдалося. Причому вдалося досить рано, так що пізніше дизайнери могли додати згенерував селах індивідуальності.
Демонстрація роботи Settlement builder: