Изображения
Създаването на реалистична 3D графика е немислимо без използването на готови изображения, които служат за съдаването на текстури ( в следващата тема ще видите как ). За да използвате изображение в OpenGL, трябва да го представите в масив от RGB стоийности. OpenGL не поддържа нито един готов формат, но и за това си има решение. Библиотеката GLAUX предоставя готова функция която може да извърши конвертирането от *.bmp файл :

AUX_RGBImageRec* auxDIBImageLoad("име.bmp") - както виждате тя приема името на *.bmp файла и връща указател към структурна променлива от тип AUX_RGBImageRec. Структурата AUX_RGBImageRec е дефинирана в библиотеката GLAUX и съдържа няколко члена. Това са sizeX , sizeY от тип int, в които се запазват съответно ширината и дължината на зареденото изображение и *data от тип unsigned char, където се запазват RGB стойностите на изображението. Ето как примерно можете да заредите изображението wood.bmp :

AUX_RGBImageRec* image;
image = auxDIBImageLoad("wood.bmp");


Преди да покажете изображението е желателно да определите неговата позиция по x, y и/или z. Tова става най-лесно със следните варианти на функцията glRasterPos*( ) :

glRasterPos2f( GLfloat x, GLfloat y ) - приема x и y позицията на изображението.
glRasterPos3f( GLfloat x, GLfloat y, GLfloat z ) - приема x, y и z позицията на изображението.

Важно е да знаете, че трансформациите на MODELVIEW и RPOJECTION матрицата се отразяват на координатите на изображението. Освен това е препоръчително да използвате ортографична перспектива, когато изрисувате изображения, понеже сами по себе си те са двуизмерни обекти.

След като сме заредили изображението, можем да го покажем на екрана. Това става с функцията :

void glDrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels ) - тя приема 5 аргумента. Първият и вторият са ширината и височината на изображението. Те се намират съответно в image->sizeX и image->sizeY. Третият обозначава цветовия режим. В случая това е GL_RGB. Четвъртият аргумент указва типа на данните в масива с RGB стойностите, в случая това ще GL_UNSIGNED_BYTE. Последният аргумент трябва да е името на масива с RGB стойностите - image->data. Ето как ще изглежда фунцкията след като подадете нужните аргументи :

glDrawPixels( image->sizeX, image->sizeY, GL_RGB, GL_UNSIGNED_BYTE, image->data );

ОpenGL предлага още няколко полезни функции с които можете да манипулирате изображенията, преди тяхното изрисуване. Едната от тях е :

void glPixelTransfer{fi}( GLenum pname, GLfloat param ) - тя приема 2 аргумента. С тази функция можете да увеличите или намалите един от трите цветови компонента ( RGB ) на изображението. За първи аргумент може да подадете GL_RED_SCALE, GL_GREEN_SCALE или GL_BLUE_SCALE. За втори аргумент трябва да подадете числото, по което ще се умножи избрания от вас цветови компонент на изображението. Числа по-малко от 1.0 водят до намаляване количеството на избрания от вас цвят, а числа по-големи от 1.0 водят до неговото увеличаване.

Друга полезна финцкия е glPixelZoom( ), която се използва за мащабиране на изображението. Ето и нейния прототип :

void glPixelZoom( GLfloat xfactor, GLfloat yfactor ) - функцията приема два аргумента, които определят мащабирането по x и y. Числа по-големи от 1.0 водят до увеличаване на изображението, и обратно - по-малки от 1.0 намаляват изображението. Ако подадете отрицателно число ще получите огледално изображение.

Преди да завърша темата ще ви представя още една функция, с която можете да прочетете част от екрана и да съхраните изображението в масив. Това е нейния прототип :

void glReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels ) - функцията приема 7 аргумента. Първите два определят позицията на долния ляв ъгъл на правоъгълника, който искате да прочетете, следващите два аргумента - неговата ширина и дължина. Петия аргумент определя какво точно искате да бъде прочетено. Може да бъде :

GL_RGB - RGB цвета
GL_RGBA - RGBA цвета ( RGB цвета и Alpha канала )
GL_COLOR_INDEX - индекса на цвета, ако случайно използвате COLOR_INDEX режим ?!?
GL_RED - червения цветови компонент
GL_GREEN - заления цветови компонент
GL_BLUE - синия цветови компонент

Има още няколко аргумента, които могат да бъдат подадени, но засега и тези са достатъчни. За шести аргумент трябва да изберете типа на данните, които ще се запишат в масива. Може да бъде - GL_UNSIGNED_BYTE, GL_BYTE, GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT или GL_FLOAT. За последен аргумент трябва да подадете името на масива, в който ще се съхрани изображението.

Смятам да спра дотук. Следващата тема, в която ще ви представя текстурирането, ще ви се стори далеч по-интересна. Показването на растерни изображения по екрана си е, честно казано, скучна работа, но благодарение на него може да създадете готов шрифт и да изписвате текст по екрана. По-нататък ще видите как, след като научите как да правите прозорец за Windows с Win32 API.

Автор: Иван Георгиев Иванов [ Nickname: tuschko ]
e-mail: tuschko@abv.bg


Този сайт е хостван от сървър на
Headoff Gaming Intranetwork