OpenGL - FPC - Глава 17
Книги
OpenGL / FPC - Глава 17
Работата с текстури в OpenGL не е толкова трудна, колкото си мислят някои хора. Трудно е, но за да започнете, не е нужно да знаете всички тънкости и подробности. В тази глава просто ще приложим много проста генерирана текстура към екрана.
Текстурата е просто последователност от пикселни данни - почти като растер. Нека си представим: указател към някаква област от паметта. Първо идва червената стойност за първия пиксел, след това зеленото и след това синьото. След това идва стойността на червения цвят за следващия пиксел и т.н. Разбира се, това се отнася за проста RGB текстура, но това е смисълът.
И така, има някаква информация за фигурата. Както обикновено, OpenGL изисква ID за тази текстура. Прикрепяме този идентификатор към нашата област на паметта и казваме на OpenGL да използва този блок памет винаги, когато активираме нашия идентификатор. Ето как работят нещата на теория. Нека да разгледаме кода.
Първо имаме нужда от ID. Това е просто променлива тип GLuint. Нека също да дефинираме указател към нашите текстурни данни.
Първо, не забравяйте да отделите памет за вашия показалец. Размерът му е ширината на картината, умножена по височината, по броя на байтовете, които представляват пиксел. Например RGB се нуждае от 3 байта на пиксел, RGBA се нуждае от 4 байта и т.н. Ще използвам 128x128 RGB текстура.
Сега нека да преминем към командите на OpenGL. Ще активираме картографиране на текстури, като просто го включим. След това казваме на OpenGL да запази ID за нас за една текстура и да го съхрани в TextureID.
Сега активираме текстурата и обвързваме нашия показалец с активирания ID (не се бъркайте - glBindTexture се използва за активиране, а glTexImage2D се използва за зареждане на данни от показалеца).
Сега следваинициализираме нашата текстура. Това е начинът, по който персонализираме поведението на нашата текстура. Важно е! Не пропускайте тази стъпка.
И сега данните за текстурата всъщност се зареждат в OpenGL пространството.
Трябва да зададем типа пикселни данни, размера на текстурата и реда на параметрите на пикселите. Например, може да бъде GL_BGR и така нататък. Ако искате да ги знаете, моля, вижте справочното ръководство за API. Той също така задава показалеца, където се съхраняват нашите данни.
Преди да продължите, малко повече за OpenGL и размерите на текстурите. Текстурата трябва да има размер 2^n. Това означава, че можете да използвате текстури като 8*8, 16*16, 32*32, 64*64, 128*128 и т.н., но НЕ и текстури като 640*480. Може да си помислите „Какво, по дяволите?!“, но е истина. Обикновените текстури имат такова ограничение, нищо не може да се направи по въпроса. Разбира се, има начин да се използват текстури с произволен размер, но това се постига по различен начин. Ще го обясня по-късно, става ли? Сега нека работим с 2^n.
И всичко вече е настроено. Сега е време да начертаете повърхността и да прикрепите текстурата към нея. Обикновено работим с множество текстури, така че първото нещо, което трябва да направим, е да картографираме текстурата, която искаме да използваме, към повърхностите.
След това трябва да кажем на OpenGL как точно искаме да прикрепим текстурата към повърхността. Това се постига с помощта на командата glTexCoord2f. Процесът на рисуване изглежда по следния начин.
Гледай внимателно. glTexCoord2f определя ръбовете на текстурата и как те се прикрепят към повърхността. 0 е отляво/отгоре и 1 е отдясно/отдолу. Когато гледате повърхността, левият/горният ръб на текстурата е прикрепен към левия/горния ръб на повърхността. Ако зададете, да речем, стойност 2, текстурата ще бъде изчертана 2 пъти. Стойност 0,5 ще означава само товаполовин текстура.
Ако искаме да използваме картина като текстура, просто трябва да я заредим от файл. Растерните изображения се зареждат доста лесно, JPG и други формати са малко по-трудни. Можете също така да оформите нещо сами и да го нарисувате в областта на текстурата. Тези генерирани текстури (или математически текстури, както понякога се наричат) имат голямото предимство, че заемат малко място - не повече от няколко байта в алгоритъма. Ние обаче ще се занимаем с тях в следващата глава. Сега просто се уверете, че разбирате всичко.