top of page
Пошук
Фото автораРостислав Кейван

Ландшафт з високим рівнем деталізації.

mountains, landscape, terrain, nature, sunset

Привіт Кіпфреймівці =). У цьому топіку ви дізнаєтесь як працює ланшафт у відеоіграх. Ця тема була створена у зв'язку з проектом Lost Geo-Odyssey який я активно розробляю. Але для початку давайте заглибимося в деталі, навіщо потрібні рівні деталізації?


Ну що ж .. річ у тому що ваш ландшафт у грі займає величезну кількість трикутників, що зведе продуктивність девайсу вашого клієнта, який використовує ваш продукт до нуля. Рівень деталізації відсікає кілька рівнів в залежності від відстані гравця або ігрової камери. Ця технологія ще називається "Clipmap"


mountains, landscape, terrain, nature, sunset

Геометричні кліп-карти – це витончений метод рендерингу для малювання величезних ландшафтів у реальному часі.

У першу цю технологію було опубліковано в 2004 році Френком Лосассо та Хьюгом Хоппе. Про це ви можете дізнатися з цього джерела.


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

Сітка, яку ми відправляємо до графічного процесора, може виглядати так:

grid, geometry, lod, gpu

А потім ми встановлюємо координати Z у вершинному шейдері, щоб це виглядало так:

grid, geometry, lod, gpu, montain, z-buffer

Існує безліч інших методів LOD, які досягають того ж результату, але карти кліпів виділяються своєю простотою. Вам не потрібно запускати складні алгоритми проріджування, вам не потрібно турбуватися про зшивання довільних сіток разом, вам не потрібно вибирати один з дискретних рівнів LOD під час виконання, легко налаштувати якість для різних налаштувань якості і вам не потрібно надсилати тонни даних у графічний процесор у кожному кадр.


Подробиці реалізації високого рівня

В оригінальній статті ландшафт ділять на кілька різних типів сіток і повторно використовують для малювання всього ландшафту. Ви можете зробити це за допомогою однієї сітки.


Почнемо з перегляду зверху вниз геометрії плоского ландшафту, де кожна сітка забарвлена відповідно до її типу:


grid, geometry, lod, gpu

Ви можете бачити, що є кілька кілець або рівнів. Кожне кільце має таку ж кількість вершин, як і кільце всередині нього, але воно вдвічі більше, тому з кожним рівнем роздільна здатність зменшується вдвічі.


Ви також можете бачити, що кожен рівень в основному складається із сітки квадратних плиток 4x4 (синіх). Очевидно, ви не малюєте внутрішні квадрати 2х2, за винятком внутрішнього рівня.

На кожному рівні також є сітки-заповнювачі, які ефективно поділяють рівень на сітку 2x2 із квадратів 2x2 (червоний хрест, який стає товстішим у міру просування назовні), та обрізну сітку L-подібної форми, яка поділяє кожен рівень (зелені сітки).


Щоб намалювати місцевість, ви практично центруєте кільця на камері, ставите всі частини у потрібні місця та все. Я розповім про це докладніше пізніше, а поки що варто відзначити одну важливу річ.

Положення кожної сітки має бути зафіксовано так, щоб бути кратним її вирішенню. Таким чином, якщо сітка має вершину через кожні дві одиниці, її необхідно прив'язати до кратних позицій двох.


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



За допомогою прив'язки вершини можна додавати та видаляти в міру зміни рівня деталізації, але вони ніколи не переміщаються, що набагато менш помітно.

Одним із наслідків цього є те, що рівні відсікання рухаються вдвічі швидше, ніж їхній внутрішній сусід. Щоб запобігти перекриття плиток, вам потрібно додати проміжок, щоб кожне кільце могло оточувати не тільки сітку квадратних осередків 4x4 внутрішнього рівня, але й деякі додаткові відступи, що дозволяють внутрішньому рівню переміщатися, тоді як зовнішній рівень залишається нерухомим. Ось чому вам потрібні сітки-наповнювачі та обрізки! Це відео має показати вам, що я маю на увазі:



Шви


grid, geometry, lod, snap, t-seams

Якщо ви ще раз подивіться на зображення зверху вниз, ви помітите, що на межах між рівнями картки обрізки є Т-подібні з'єднання, а Т-подібні з'єднання означають тріщини в ландшафті. На зображенні вище я встановив червоний колір тла, щоб вони виділялися.

demo grid, grid concept, draw

Ми не повністю позбавлені необхідності мати справу зі швами, але, на щастя, вони досить прості. Якщо ми намалюємо рівні відсікання, трохи відсунуті один від одного, ми зможемо намалювати трикутники, необхідні нам для геометрії шва. Чорні лінії – це межі плитки, сірі лінії – межі трикутників, а червоні лінії – це трикутники швів.


Але малювати їх окремо ось так насправді трохи вводить в оману. Зазору немає, і вершини більш грубому рівні відсікання точно збігаються з деякими вершинами більш тонкому рівні. Я намалював зелені лінії між вершинами, що знаходяться в тому самому положенні, а трикутники, які нам дійсно потрібні, я намалював червоним. Це приблизно на третину менше, і нам не потрібно нічого особливого робити на кутках.


Я не намалював повний рівень, але це працює, поки довжина повної сторони карти кліпу парна. І вони будуть парними, тому що у нас є чотири квадратні плитки, одна широка плитка-заповнювач та одна широка оздоблювальна плитка. Отже 4x+2, що парно. (спробуйте намалювати все це, якщо не вірите)


grid, geometry, lod, draw, concept

Коли ви створюєте сітку шва, потрібно помістити нижній лівий кут в точку (0, 0) у просторі об'єктів.


Зрештою, у нас є тримерні сітки. Нам потрібно повернути їх на місце, що трохи складніше, ніж те, що ми бачили й досі.

Однак є маленька хитрість. Почнемо з літери L внизу ліворуч (як звичайна L). Потім візьміть два біти: переворот першого біта перевертає сітку по горизонталі, а переворот іншого біта перевертає сітку по вертикалі. Якщо ми намалюємо це, це буде виглядати так:

draw, square

Звідси ми бачимо, що всі вони еквівалентні обертанням навколо осі Z:


draw, concept,demo, geometry, angle

І ці два біти можна інтерпретувати як десяткові числа від 0 до 3. Таким чином, при рендерингу ми можемо з'ясувати, які фліпи нам потрібні і використовувати ці біти для індексації в масиві обертань.


Щоб вирішити, які біти встановити, нам потрібно з'ясувати, де знаходиться поточний рівень карти відсікання щодо зовнішнього рівня. Якщо поточний рівень знаходиться в нижньому лівому куті отвору, обрізку необхідно провести в правому верхньому куті, і ми встановлюємо обидва біти. Якщо поточний рівень знаходиться вгорі справа, обрізка повинна йти внизу зліва, і ми використовуємо 00. І так далі.


Логіка визначення того, які біти встановлювати, трохи складна. Я роблю це, дивлячись на різницю між положенням прикріпленої камери поточного рівня та положенням прикріпленої камери наступного зовнішнього рівня. Якщо різниця між ними менше однієї одиниці по осях X і Y, плитка буде розміщена внизу зліва, а обрізка повинна бути розміщена зверху праворуч. Якщо різниця більш ніж одну одиницю, ми встановлюємо біт цієї осі.


Стаття перетворюється на том, тож будемо закінчувати. Я прикріплю репо Майка, він зробив велику роботу з геометрією Кліпмап, ви можете подивитися його реалізацію і підтримати його.


Знайте тільки одне - якщо ви створюєте свої світи, або гру з відкритим світом, вам слід подумати про Кліпмап. Дякую що дочитали цей топік до кінця.

Реалізуйте оптимізуйте, шукайте, всім світ, побачимось. =)

0 переглядів0 коментарів

Останні пости

Дивитися всі

Comments


bottom of page