Уроци за програмисти - Текстури (Елитни игри)

Всъщност няма смисъл да казваме какво представляват текстурите. Нека започнем веднага с това как да ги завием в нашия двигател.

Нека създадем клас JLTexture.

Внимание - този клас не е наследник на нашия JLSceneObj, той е напълно различен клас и ще се съхранява отделно!

JLTexture=class tex:cardinal; Идентификационно име: низ; създаване на конструктор; деструктор унищожаване; отмяна;

процедура LoadFromFile(const FName:string); процедура Bind; Настройка на процедурата;

процедура Assign(const T:PJLTexture); край;

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

Както можете да видите, има все по-малко и по-малко изходен код, това е направено така, че вие ​​сами да пишете останалото, а не да го копирате, без да мислите „какво прави“.

Но ще опиша OpenGL командите, свързани с текстурите.

glGenTextures(n,@tex[0]);генерира n текстури и поставя указател към тях в масива tex. Всъщност не освобождава нищо в паметта и може и без тази команда, но не е желателно.

glDeleteTextures(n,@tex[0]);същото, но освобождава място за текстурата. В паметта също не издава нищо (въпреки че кой знае какво ще се случи в следващите версии на OpenGL).

Както се досещате, тези процедури трябва да се извикват съответно в create и free.

glBindTexture(target, tex[4]);target = GL_TEXTURE_2D в повечето случаи. tex[4] – показалец на текстура. Тази процедура прави текстуратаtex[4] на сегашния. Всичко, което е нарисувано тогава ще бъде "покрито" с тази текстура.

Зареждане на текстури. Тук трябва да направите следното.

- Заредете текстура от файл. -Разберете неговия формат и размери -И това:

glBindTexture(GL_TEXTURE_2D, Tex); // направи го актуален

-И след това изградете Mip-Map нива (или не изграждайте, но използвайте glTexImage2D).

gluBuild2DMipmaps(GL_TEXTURE_2D, col, ширина, височина, формат, GL_UNSIGNED_BYTE, данни);col – брой цветни компоненти. RGB е 3, RGBA е 4. Ширината и височината са размери. формат - форматът, в който се изпращат пикселите (GL_RGB, GL_RGB8, GL_RGBA и много други). данните са указател към пиксели. Сега за настройките.

glTexParameteri- задава ги.

Има много от тях, но ние ще говорим за филтриране.

Билинейното филтриранее нашият минимум. С него се виждат преходите на нивата на mip-map. Погледнете старите играчки, има ясно видима лента на прехода им.

Трилинеенпри него преходът не се вижда, но има силно размазване, ако погледнете равнината с текстурата под ъгъл.

Анизотропеннай-перфектното филтриране, има по-малко забележимо размазване (в зависимост от нивото на анизотропия).

Ако искате да го имате, просто въведете няколко реда.

трябва да изтеглите това разширение:

разберете максималното ниво на филтриране:

И където задавате филтриране (в този случай трилинейно)

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);