Използване на мега смеси (megatexture, clipmaps).

1. запълване на площи с една текстура - облицовка и плочки;
2. алфа смесване на текстури;
3. показване на относително малка част от пейзажа близо до плейъра.

Професионалисти:
1. малко количество текстури (малко количество данни);
2. относителната лекота на текстуриране.

1. ограничен брой текстури (плочки) води до трудности при получаване на желания модел, възможните комбинации винаги са ограничени;
2. много повтарящи се модели в пейзажа;
3. ограничение в геометрията (например само обикновена решетка) или обратно, необходимостта от разделяне на геометрията за оформяне на плочки с различни плочки.

Какво се случва, ако решите да използвате една текстура за целия пейзаж?

1. няма да има облицовки и набори от плочки;
2. няма да е необходимо да се прави алфа смесване на различни текстури, за да се формира окончателното изображение по време на изпълнение;
3. художникът може просто да рисува всяка част от пейзажа;
4. визуалният реализъм на създадения пейзаж може да се увеличи значително;
5. геометрията на терена може да бъде представена като правилна мрежа или всяка мрежа;
6. няма да е необходимо да побеждавате геометрията за целите на текстурирането.

Минуси:
1. Обемът на текстурата за целия пейзаж ще отнеме много място;
2. за да го подготвите ще ви трябват специални инструменти и мощни компютри.

За да бъда честен, не съм сигурен дали това са очевидно недостатъци, тъй като текстурата може да се разклати и наличието на бързи компютри винаги е страхотно:)

Нека се опитаме да изобразим пейзаж с уникален модел.

За целта заредете текстура с висока разделителна способност на целия пейзаж в графичния процесор, разбира се, с всичките му нива на детайлност (mipmaps или lods) и покажете цялата геометрия на пейзажа. Самият графичен процесор ще избере правилния LOD за растеризиране на определен пиксел на екрана (или няколко Lods, в зависимост от настройките). Например за най-близкия до камерата пиксел ще бъде избран пиксел от подробния цикъл, за далечния - обратно.

4096 * 4096 * 4 = 64 MB (при 32 бита на пиксел)

При лодовете текстурата ще отнеме повече от 85 MB. Но какво, ако размерът на оригиналната текстура не е 4096, а 8192 на 8192 пиксела? Това вече е 341 MB с всички лодове. И ако повече? Например 1 кв. Км с разделителна способност 1 пиксел на 10 см ще бъде покрит от мега-текстура с разделителна способност 10 000 на 10 000 пиксела. Но 1 пиксел на 10 см далеч не е най-желаното качество.!

Съвсем ясно е, че с такива обеми GPU ще умре. Използването на компресия на текстура няма да реши проблема драстично, а само ще промени максимално възможната разделителна способност.

Общо: очевидно е, че този метод няма общо решение и може да се прилага само в специални случаи за малки пейзажи, а не за големи текстури.

Затова забравете за една подробна текстура за целия пейзаж.?

Нека помислим за това. Знаем, че графичният процесор за растеризиране на далечния пиксел ще отнеме по-опростена текстура, отколкото за близкия пиксел, но всички лодчета ще бъдат в паметта на графичния процесор!

Защо тогава да зареждате LOD с висока детайлност в графичния процесор, когато растеризирате отдалечен пиксел? Как да се уверите, че допълнителните лодове не са заредени? За това в следващата част на статията.

За по-пълно разбиране на същността на проблема, предлагам да изтеглите моя пример с помощта на мега текстура (изходни кодове в края на статията):

https: //github.com/u ... gatexture-bin

използване

clipmaps

Самата мега-текстура (textures/mega-8192.tga) има резолюция 8192 на 8192 и заема 200MB (24 бита на пиксел).

Програмата за стартиране (test.exe) се намира в папката bin. При първото стартиране програмата ще компилира мега-текстурата, може да отнеме няколко минути, не прекъсвайте програмата, тя ще създаде файлове в папката textures/mega-8192 (и ще отнеме още 260 MB на "винта" ). След като източникът на текстурата бъде компилиран, той (textures/mega-8192.tga) може да бъде изтрит (ако нямате нужда от него).

Бутоните за управление се показват в самата програма на екрана (стрелките на курсора, LSHIFT - нагоре, LCRTL - надолу, M (eng) - показване/премахване на лодовете).

И така, в предишната част открихме, че когато растеризираме отдалечени пиксели в графичния процесор, препоръчително е да не зареждаме подробни лоди (те не се използват за растеризация), а да растеризираме близо до пикселите, всичко е точно обратното. Интуитивно това може да спести много памет, но колко? Нека да стигнем до това постепенно.

Ако приемем, че играчът е в центъра на терена, тогава LOD за текстура на терена, необходими и използвани от графичния процесор за растеризация, ще изглеждат по следния начин:

използване

Схема 1.

Зеленият квадрат има най-добрите детайли, последван от син, жълт и пурпурен. Всеки следващ заема площ от пейзажа четири пъти повече и има четири пъти по-малко детайли от предишния квадрат. И сега Внимание, Разбирате ли, че разделителната способност на частта от текстурата, покрита от квадратите (като се вземе предвид нейната детайлност), е еднаква? Тези. текстурата, която ще бъде създадена под зеления квадрат ще има същата резолюция като при най-големия - пурпурен.


Схема 2 (страничен изглед).

Когато казах за текстурата на зеления квадрат, добре чухте. Нямаме нужда от всички подробни мега-текстури, за да изградим погледа на играча в средата на терена. Необходима е само малка част около него. Същото важи и за останалите нива на детайлност, докато стигнем до последния лод, който съдържа намалено копие на цялата мега-текстура.

Необходимите части от мега-текстурата за конкретни нива на детайлност могат да бъдат представени въз основа на следната диаграма:

мега

Схема 3.

Хоризонталните пунктирани линии показват колко площ от мега текстурата трябва да съдържат съответните нива на детайлност.

В тази диаграма (пример) камерата е достатъчно висока над пейзажа, това е довело до факта, че най-подробното ниво (зеленият кръг на диаграмата) не докосва пейзажа, което означава, че може да не го заредим в графичния процесор изобщо! Това е един от възможните пътища за оптимизация.

След като необходимите части от мега-текстурата се формират по време на изпълнение, остава само да се покаже геометрията на пейзажа, която тя покрива за всяко използвано ниво на детайлност. Може би все още не е много ясно, но предлагам да не се спираме на това сега, тъй като в самата технология clipmaps техниката на растеризация ще бъде по-проста.

Оставете играча да стои на самия пейзаж, а не да лети някъде в облаците (т.е. ние ще броим за всички нива на детайлност). Да вземем 512 на 512px clipmap (512 clipmap). Clipmap е област, която се изрязва от мега-текстурата около плейъра за всяко ниво на детайлност (lod). Колкото по-малък е той, толкова по-малко подробни пиксели ще види играчът пред него, толкова по-бързо нивата на детайлност ще се променят на по-малко подробни. Така че нека да тръгнем:

използване

Това е всичко!
Оказаха се 5 Lods с 512x512 пиксела всяка. Общо: 512 * 512 * 5 * 4 = 5 MB (при 32 бита на пиксел). Формулата е следната:
ClipmapWidth * ClipmapHeight * LodsNumber * BytesPerPixel.

Според мен най-оптималните размери на клипмапите (в момента) са в диапазона от 1024 до 2048.

Между другото, абсолютно не е необходимо размерът на клипмапата и разделителната способност на мегатекстурата да бъдат кратни на степен 2!