Реалістичні комп’ютерні ігри в сучасному світі сприймаються як звична річ, але так було не завжди. Вони пройшли майже 70-річний шлях від першого зображення на осцилографі, до процедурної та нейронної генерації. В слові «графіка» насправді заховано десятки тисяч технологій, які на виході дарують нам цілі світи. В цій статті ми поговоримо про них детальніше.
Зміст
Перша відеогра «Tennis for Two» була створена американським фізиком Вільямом Гігінботемом. Вже під час першого показу 18 травня 1958 року утворилася величезна черга з людей, які прагнули побачити цю новинку. Він розробив її протягом трьох тижнів і навіть не припускав, що вона стане такою популярною. «Tennis for Two» заклала фундамент для комп’ютерних ігор, а для її роботи використовувався дисплей осцилографа. Гру сприйняли як справжній хіт. Сьогодні вона зберігається в Брукхейвенській національній лабораторії.
Дехто може посміятися з примітивізму «Tennis for Two», але перш ніж це зробити, раджу для початку заглянути в розробницьку документацію тих часів. Виявиться, що за простотою вигляду ховається неабиякий конструкторський хист.
Першою 3D-грою вважається Maze War, яка побачила світ у 1974 році. Вона була створена для Imlac PDS-1 Стівом Коллі в Дослідницькому центрі Еймса NASA. Це First-person shooter в лабіринті з прямокутними стінами, фіксованою перспективою та приховуванням невидимих ліній.
Imlac PDS-1, на якому запускалась Maze War являв собою був 16-бітний графічний мінікомп’ютер з 8kb пам’яті. З цікавого — ньому використовувався так званий векторний дисплей. Зображення на подібному дисплеї будується шляхом довільного переміщення променя екраном, а не рядками, як у тодішніх ЕПТ моніторів.
Для чого ми згадували всю цю стару історію? Все просто. Коли ми зустрічаємо старий проєкт і автоматично ставимо на нього ярлик «застаріла графіка», то варто згадати, що процес розвитку ступеневий і те, що зараз здається застарілим, ще вчора виглядало, як майбутнє.
Між першою грою на осцилографі та 3D-графікою до якої ми звикли, лежить ціла прірва часу та технологій. Це ніщо інше, як епоха 2D технологій, які ми не будемо згадувати в цій статті, хоча багато елементів перекочувало з них і в 3D.
Світ 3D-графіки, а отже й ігровий світ рясно засипаний різноманітними термінами. Коли мова йде про графічні рушії більшості людей не дуже зрозуміло, про що насправді йдеться при черговій обіцянці розробників добитися справжнього фотореалізму.
Звісно, для повного розуміння всіх процесів потрібно бути як мінімум серйозним спеціалістом і не прогулювати в університеті курс вищої та дискретної математики. З усім тим ми спробуємо розібратися в основних технологіях 3D графіки хоча б поверхнево, щоб привідкрити завісу таємниці й зрозуміти, що ж знаходиться «під капотом» типових ігор.
В математичному світі точка — це всього лише термін для зазначення місця в геометричному просторі. І оскільки в неї немає фізичного розміру, її зручно використовувати для встановлення точної позиції будь-яких об’єктів.
У світі 3D така інформація є вкрай важливою і від неї залежить чи ваш персонаж стабільно знаходитиметься в потрібному місці, а не провалиться за межі текстур. Саме від неї залежать розрахунки початку та кінця координат.
Напевно, в такому вигляді вам буде важко зрозуміти, що насправді відбувається в цій сцені. Все тому, що вона складається лише з ліній.
Кожна точка в них пов’язана з великою кількістю обчислень. Якщо обробляти точки групами, особливо у вигляді трикутників, ми можемо добитися значної оптимізації у швидкодії.
І ось ми приходимо до того, що наш трикутник є не що інше, як три відрізки, що з’єднуються в трьох точках (вершинах або vertex). Оскільки ми хочемо побачити перед собою саме 3D світ, то нам знадобиться система координат з трьома значеннями (x, y, z). Усі дані вершин зберігаються у безперервному блоці пам’яті, який називається буфером вершин (vertex buffer).
В програмі рендерингу фігури, які формуються на основі вершин називаються примітивами. В рамках Direct3D вони представлені списком крапок, ліній та трикутників. Якщо їх правильно комбінувати, то лінії трикутників використовують спільні вершини одразу для декількох вершин.
Ось так потихеньку ми з вами підійшли до поняття полігону. Найчастіше у ролі полігонів використовуються трикутники. Але іноді можуть застосовуватись багатокутники з великою кількістю сторін. Шейдерні процесори у GPU розраховують місцеперебування вершин полігонів, потім з’єднують їх між собою прямими лініями.
За допомогою багатьох таких багатокутників малюється каркас 3D-моделі. Потім на нього накладаються текстури, ефекти та освітлення. В результаті виходить зображення, яке ми бачимо у грі.
Навіть дитина, побачивши перед собою низькополігональну модель, скаже вам, що з персонажем чи з об’єктом щось не те. Але причина цього не в змові хитрих розробників, а в питанні швидкодії обладнання на якому запускається та чи інша гра.
25 чи більше років тому відеокарти банально не могли опрацювати велику кількість полігонів, тому в якомусь умовному Need For Speed можна було побачити прямокутні колеса на якомусь авто заднього плану.
Текстури — це, по суті, цифрові «шпалери» для 3D-об’єктів, які роблять їх живими та реалістичними. Уявіть, що ви граєте у гру, і без текстур усі дерева, стіни чи персонажі виглядали б як гладенькі пластикові фігурки. Це як макіяж для віртуального світу, адже без нього все виглядає нудно й неприродно. Текстури бувають різними: від простих растрових зображень до складних процедурних, які генеруються комп’ютером на основі алгоритмів.
Якщо взяти до прикладу The Last of Us Part II, то тут текстури настільки деталізовані, що можна розгледіти кожну подряпину на зброї чи кожну складку на одязі персонажів. Розробники з Naughty Dog використовували тисячі текстур, щоб зробити світ постапокаліпсису максимально правдоподібним.
Для їх створення вони сканували реальних людей, щоб передати найдрібніші деталі, як-от пори чи зморшки. Завдяки цьому герої виглядають майже як живі.
Текстури — це не лише про красу, а й про оптимізацію. Уявіть, що в грі типу Assassin’s Creed Valhalla з величезним відкритим світом кожна травинка чи камінчик малювалися б окремо — комп’ютер просто не витримав би! Тому розробники часто використовують повторювані текстури та процедурні методи, щоб створювати деталі на льоту.
Цікаво, що перші ігри, як-от Doom у 1993 році, мали дуже прості текстури через обмеження техніки, але навіть тоді вони створювали атмосферу. Сьогодні ж текстури — це ціле мистецтво, яке поєднує технології та творчість, щоб ми могли зануритися у віртуальні світи з головою.
Сучасні відеокарти вміють обробляти десятки мільйонів полігонів за секунду. Тому ігрові моделі стають все реалістичнішими.
На початку століття, ще до появи різноманітних технологій рельєфного текстурування, єдиним способом підвищити геометричну складність сцени було додавання до неї полігонів, що негативно впливало на продуктивність графічних процесорів тих років.
З іншого боку, створення високодеталізованих моделей для рендерингу — це дуже кропіткий процес, і якщо модель перебуватиме на якійсь відстані від сцени, всі ці деталі зникнуть марно.
Якимось чином потрібно вказати GPU, як розбити великий об’єкт, наприклад, один плоский трикутник на набір менших трикутників, розташованих усередині вихідного. Такий процес називається теселяцією (tesselation).
Першими у розв’язання цієї проблеми стала компанія ATI. У 2001 році побачила світ TruForm, яка по суті є першою реалізацією теселяції в комп’ютерних іграх. Вона використовувалась в таких іграх як Half-Life, Counter-Strike, Quake, Return to Castle Wolfenstein, Unreal Tournament. Через якийсь час технології теселяції еволюціонували й у 2011 році інтегрувалися в DirectX 11.
Сучасні комп’ютерні ігри вирізняються реалістичною графікою: якісні тіні, відображення, динамічне освітлення та безліч інших ефектів. За всім цим стоїть технологія, відома як шейдери. Шейдери — це спеціальні програми, які обробляють дані про пікселі, вершини та текстури для створення кінцевого зображення.
Вони бувають декількох типів:
Вершинні шейдери — це програми, які виконуються на графічному процесорі для обробки даних про вершини геометричних об’єктів у 3D-графіці. Вони відповідають за трансформацію координат вершин із простору моделі в простір екрана, а також за обчислення таких параметрів, як положення, нормалі, текстурні координати та інші атрибути, які потім передаються на наступні етапи графічного конвеєра.
Вершинні шейдери дозволяють розробникам створювати складні ефекти деформації, анімації та освітлення ще на етапі обробки геометрії, що значно розширює можливості візуалізації. Це один із ключових інструментів у сучасній комп’ютерній графіці, який забезпечує гнучкість у роботі з 3D-об’єктами.
Вершинні шейдери також дозволяють обробляти скелетну анімацію, де кожна вершина моделі персонажа прив’язана до певної кістки скелета, і під час руху ці вершини динамічно змінюють своє положення. Це створює плавні та природні рухи, які виглядають реалістично навіть при складних діях, таких як біг, стрибки чи бойові прийоми. Без вершинних шейдерів такі ефекти вимагали б значно більше обчислювальних ресурсів або були б взагалі неможливими в реальному часі.
Ще одним прикладом є симуляція природних явищ, таких як рух трави чи листя на вітрі, що можна побачити в іграх на кшталт Horizon Zero Dawn. Вершинні шейдери дозволяють динамічно змінювати положення вершин моделей рослин залежно від зовнішніх факторів, таких як напрямок і сила вітру, створюючи ефект коливання.
Це додає сценам глибини та реалістичності, адже кожна травинка чи гілка рухається незалежно, реагуючи на віртуальне оточення. Такий підхід значно економить ресурси порівняно з використанням попередньо записаних анімацій для кожного об’єкта.
Також вершинні шейдери часто застосовуються для створення ефектів деформації поверхонь, де вони використовуються для симуляції хвиль на воді чи деформації землі під час битв. Завдяки обробці вершин у реальному часі, поверхні можуть змінювати свою форму залежно від дій гравця чи подій у грі, що створює більш інтерактивний і живий світ. Такі ефекти досягаються без необхідності створювати окремі моделі для кожного стану об’єкта, що робить їх незамінним інструментом для сучасних ігор із високим рівнем деталізації.
Піксельні шейдери — це програми, які виконуються відеочіпом під час растеризації для кожного пікселя зображення. Вони здійснюють вибірку з текстур та математичні операції над кольором і значенням глибини (Z-buffer) пікселів. Усі інструкції піксельного шейдера обробляються для кожного пікселя окремо після завершення операцій із трансформацією та освітленням геометрії. В чому ж вони використовуються?
У результаті своєї роботи піксельний шейдер видає кінцеве значення кольору пікселя та Z-значення для наступного етапу графічного конвеєра — блендингу. Найпростіший приклад піксельного шейдера є звичайне мультитекстурування, тобто змішування двох текстур та накладання результату на піксель.
З появою піксельних шейдерів версії за стандартами DirectX стало можливим не лише мультитекстурування, а й багато іншого. Сьогодні можливості піксельних шейдерів досягли рівня, коли з їхньою допомогою можна реалізовувати навіть трасування променів (raytracing).
Процедурні текстури на відміну від звичайних генеруються алгоритмічно за допомогою математичних функцій, а не створюються вручну чи на основі растрових зображень. Вони дозволяють створювати деталізовані поверхні, такі як дерево, мармур, камінь чи хмари, без необхідності зберігати великі обсяги графічних даних.
Завдяки цьому процедурні текстури економлять пам’ять і забезпечують високу гнучкість, адже їх можна масштабувати, змінювати параметри чи адаптувати під різні об’єкти в реальному часі. Ця технологія стала справжньою революцією в комп’ютерній графіці, особливо в іграх і кіно, де важливі деталізація та оптимізація.
Одним із найяскравіших прикладів використання процедурних текстур є створення реалістичних ландшафтів у грі No Man’s Sky. У цій грі процедурні алгоритми генерують текстури для поверхонь планет, такі як трава, пісок чи скелі, залежно від типу біому та умов середовища. Таким чином створюються унікальні світи для кожної планети без необхідності вручну малювати чи зберігати тисячі текстур.
Ще один цікавий приклад можна побачити в іграх серії Minecraft, де процедурні текстури використовуються для створення ефекту піксельної деталізації поверхонь, таких як дерево чи камінь, навіть при низькій роздільній здатності.
Хоча гра має стилізовану графіку, процедурні алгоритми дозволяють додавати дрібні деталі, які імітують природні текстури, наприклад, тріщини в камені чи волокна в деревині. Це створює відчуття більшої глибини та реалістичності, не перевантажуючи систему, і дозволяє грі працювати навіть на слабких пристроях.
В новому поколінні відеокарт NVIDIA RTX 50 з’явилась реалізація найновішої технології нейронної шейдерної генерації, про яку ми вже писали раніше. Генеративний АІ допомагатиме розробникам ігор динамічно створювати різноманітні ландшафти, впроваджувати генерувати складнішу поведінку NPC в реальному часі та багато іншого. Це змінить професійні додатки для 3D-моделювання вже найближчим часом. Розробники зможуть створювати дизайн значно швидше, ніж будь-коли, на основі заданих критеріїв.
Як ви розумієте, тема 3D графіки в іграх не тільки захоплива, а ще й дуже об’ємна. Ми спробуємо розповісти вам про все детальніше в цілому циклі статей, у яких охопимо як теоретичну частину, так і повернемося в минуле, щоб згадати легендарні ігрові рушії, що відчинили двері у неймовірний світ для всіх геймерів.