Баяковский.Начальный курс OpenGL (1124482), страница 9
Текст из файла (страница 9)
Ïîäãîòîâêà òåêñòóðûÄëÿ èñïîëüçîâàíèÿ òåêñòóðû íåîáõîäèìî ñíà÷àëà çàãðóçèòüâ ïàìÿòü íóæíîå èçîáðàæåíèå è ïåðåäàòü åãî OpenGL.77Ãëàâà 6. Òåêñòóðèðîâàíèå78Ñ÷èòûâàíèå ãðàôè÷åñêèõ äàííûõ èç ôàéëà è èõ ïðåîáðàçîâàíèå ìîæíî ïðîâîäèòü âðó÷íóþ.  ïðèëîæåíèè Á ïðèâåäåí èñõîäíûé òåêñò ôóíêöèè äëÿ çàãðóçêè èçîáðàæåíèÿ èç ôàéëà âôîðìàòå BMP.Ìîæíî òàêæå âîñïîëüçîâàòüñÿ ôóíêöèåé, âõîäÿùåé â ñîñòàâáèáëèîòåêè GLAUX (äëÿ åå èñïîëüçîâàíèÿ íàäî äîïîëíèòåëüíîïîäêëþ÷èòü glaux.lib), êîòîðàÿ ñàìà ïðîâîäèò íåîáõîäèìûå îïåðàöèè.
Ýòî ôóíêöèÿAUX_RGBImageRec* auxDIBImageLoad ( const char * f i l e )leãäå íàçâàíèå ôàéëà ñ ðàñøèðåíèåì *.bmp èëè *.dib. Ôóíê-öèÿ âîçâðàùàåò óêàçàòåëü íà îáëàñòü ïàìÿòè, ãäå õðàíÿòñÿ ïðåîáðàçîâàííûå äàííûå.Ïðè ñîçäàíèè îáðàçà òåêñòóðû â ïàìÿòè ñëåäóåò ó÷èòûâàòüóêàçûâàåìûå òðåáîâàíèÿ. Âî-ïåðâûõ, ðàçìåðû òåêñòóðû, êàê ïîãîðèçîíòàëè, òàê è ïî âåðòèêàëè äîëæíû ïðåäñòàâëÿòü ñîáîéñòåïåíè äâîéêè. Ýòî òðåáîâàíèå íàêëàäûâàåòñÿ äëÿ êîìïàêòíîãî ðàçìåùåíèÿ òåêñòóðû â òåêñòóðíîé ïàìÿòè è ñïîñîáñòâóåò ååýôôåêòèâíîìó èñïîëüçîâàíèþ. Ðàáîòàòü òîëüêî ñ òàêèìè òåêñòóðàìè êîíå÷íî íåóäîáíî, ïîýòîìó ïîñëå çàãðóçêè èõ íàäî ïðåîáðàçîâàòü.
Èçìåíåíèå ðàçìåðîâ òåêñòóðû ìîæíî ïðîâåñòè ñ ïîìîùüþ êîìàíäûvoid gluScaleImage (GLenum format , GLint widthin ,GL h e i g h t i n , GLenum typein ,const void * datain ,GLint widthout ,GLint heightout , GLenum typeout ,void * dataout )format îáû÷íî èñïîëüçóåòñÿGL_RGB èëè GL_RGBA, îïðåäåëÿþùåå ôîðìàò õðàíåèíôîðìàöèè. Ïàðàìåòðû widthin, heightin , widhtout, heightout êà÷åñòâå çíà÷åíèÿ ïàðàìåòðàçíà÷åíèåíèÿîïðåäåëÿþò ðàçìåðû âõîäíîãî è âûõîäíîãî èçîáðàæåíèé, à ñ ïîìîùüþtypeinètypeoutçàäàåòñÿ òèï ýëåìåíòîâ ìàññèâîâ, ðàñïî-6.1.
Ïîäãîòîâêà òåêñòóðû79datain è dataout. Êàê è îáû÷íî, ýòî ìîGL_UNSIGNED_BYTE, GL_SHORT, GL_INT è ò.ä.ëîæåííûõ ïî àäðåñàìæåò áûòü òèïÐåçóëüòàò ñâîåé ðàáîòû ôóíêöèÿ çàíîñèò â îáëàñòü ïàìÿòè, íàêîòîðóþ óêàçûâàåò ïàðàìåòðdataout.Âî-âòîðûõ, íàäî ïðåäóñìîòðåòü ñëó÷àé, êîãäà îáúåêò ïîñëåðàñòåðèçàöèè îêàçûâàåòñÿ ïî ðàçìåðàì çíà÷èòåëüíî ìåíüøå íàíîñèìîé íà íåãî òåêñòóðû. ×åì ìåíüøå îáúåêò, òåì ìåíüøåäîëæíà áûòü íàíîñèìàÿ íà íåãî òåêñòóðà è ïîýòîìó ââîäèòñÿ ïîíÿòèå óðîâíåé äåòàëèçàöèè òåêñòóðû (mipmap). Êàæäûéóðîâåíü äåòàëèçàöèè çàäàåò íåêîòîðîå èçîáðàæåíèå, êîòîðîå ÿâëÿåòñÿ, êàê ïðàâèëî, óìåíüøåííîé â äâà ðàçà êîïèåé îðèãèíàëà.Òàêîé ïîäõîä ïîçâîëÿåò óëó÷øèòü êà÷åñòâî íàíåñåíèÿ òåêñòóðûíà îáúåêò. Íàïðèìåð, äëÿ èçîáðàæåíèÿ ðàçìåðîìïîñòðîèòümax(m, n) + 12m × 2nìîæíîóìåíüøåííûõ èçîáðàæåíèé, ñîîòâåò-ñòâóþùèõ ðàçëè÷íûì óðîâíÿì äåòàëèçàöèè.Ýòè äâà ýòàïà ñîçäàíèÿ îáðàçà òåêñòóðû âî âíóòðåííåé ïàìÿòè OpenGL ìîæíî ïðîâåñòè ñ ïîìîùüþ êîìàíäûvoid gluBuild2DMipmaps (GLenum t a r g e t ,GLint components ,GLint width , GLint height ,GLenum format , GLenum type ,const void * data )target äîëæåí áûòü ðàâåí GL_TEXTURE_2D.
Ïàcomponents îïðåäåëÿåò êîëè÷åñòâî öâåòîâûõ êîìïîíåíòãäå ïàðàìåòððàìåòðòåêñòóðû è ìîæåò ïðèíèìàòü ñëåäóþùèå îñíîâíûå çíà÷åíèÿ:GL_LUMINANCE îäíàêîìïîíåíòà ÿðêîñòü(òåêñòóðàáóäåò ìîíîõðîìíîé);GL_RGB êðàñíûé, ñèíèé, çåëåíûé;GL_RGBA êðàñíûé, ñèíèé, çåëåíûé, àëüôà (ñì. ï. 7.1).Ïàðàìåòðûwidth, height, dataîïðåäåëÿþò ðàçìåðû è ðàñïî-format è typegluScaleImage().ëîæåíèå òåêñòóðû ñîîòâåòñòâåííî, àãè÷íûé ñìûñë, ÷òî è â êîìàíäåèìåþò àíàëî-Ãëàâà 6. Òåêñòóðèðîâàíèå80Ïîñëå âûïîëíåíèÿ ýòîé êîìàíäû òåêñòóðà êîïèðóåòñÿ âîâíóòðåííþþ ïàìÿòü OpenGL, è ïîýòîìó ïàìÿòü, çàíèìàåìóþèñõîäíûì èçîáðàæåíèåì, ìîæíî îñâîáîäèòü. OpenGL äîïóñêàåòñÿ èñïîëüçîâàíèå îäíîìåðíûõ òåêñòóð,òî åñòü ðàçìåðà1 × N,îäíàêî ýòî âñåãäà íàäî óêàçûâàòü, çà-äàâàÿ â êà÷åñòâå çíà÷åíèÿtargetêîíñòàíòóGL_TEXTURE_1D.Îäíîìåðíûå òåêñòóðû èñïîëüçóþòñÿ äîñòàòî÷íî ðåäêî, ïîýòîìóíå áóäåì îñòàíàâëèâàòüñÿ íà ýòîì ïîäðîáíî.Ïðè èñïîëüçîâàíèè â ñöåíå íåñêîëüêèõ òåêñòóð, â OpenGLïðèìåíÿåòñÿ ïîäõîä, íàïîìèíàþùèé ñîçäàíèå ñïèñêîâ èçîáðàæåíèé (òàê íàçûâàåìûå òåêñòóðíûå îáúåêòû).
Ñíà÷àëà ñ ïîìîùüþêîìàíäûvoid glGenTextures ( G L s i z e i n , GLuint * t e x t u r e s )íàäî ñîçäàòü n èäåíòèôèêàòîðîâ òåêñòóð, êîòîðûå áóäóò çàïèñàíû â ìàññèâtextures. Ïåðåä íà÷àëîì îïðåäåëåíèÿ ñâîéñòâ î÷å-ðåäíîé òåêñòóðû ñëåäóåò ñäåëàòü åå òåêóùåé (¾ïðèâÿçàòü¿ òåêñòóðó), âûçâàâ êîìàíäóvoid glBindTexture (GLenum t a r g e t , GLuint t e x t u r e )ãäå target ìîæåò ïðèíèìàòü çíà÷åíèÿGL_TEXTURE_2D,à ïàðàìåòðtextureGL_TEXTURE_1Dèëèäîëæåí áûòü ðàâåí èäåí-òèôèêàòîðó òîé òåêñòóðû, ê êîòîðîé áóäóò îòíîñèòüñÿ ïîñëåäóþùèå êîìàíäû. Äëÿ òîãî, ÷òîáû â ïðîöåññå ðèñîâàíèÿ ñäåëàòüòåêóùåé òåêñòóðó ñ íåêîòîðûì èäåíòèôèêàòîðîì, äîñòàòî÷íîîïÿòü âûçâàòü êîìàíäó÷åíèåìtargetètexture.glBindTexture()c ñîîòâåòñòâóþùèì çíà-glBindTexture()èäåíòèôèêàòîðîì texture,Òàêèì îáðàçîì, êîìàíäàâêëþ÷àåò ðåæèì ñîçäàíèÿ òåêñòóðû ñåñëè òàêàÿ òåêñòóðà åùå íå ñîçäàíà, ëèáî ðåæèì åå èñïîëüçîâàíèÿ, òî åñòü äåëàåò ýòó òåêñòóðó òåêóùåé.Òàê êàê íå âñÿêàÿ àïïàðàòóðà ìîæåò îïåðèðîâàòü òåêñòóðàìèáîëüøîãî ðàçìåðà, öåëåñîîáðàçíî îãðàíè÷èòü ðàçìåðû òåêñòóðûäî256×256 èëè 512×512 ïèêñåëåé.
Îòìåòèì, ÷òî èñïîëüçîâàíèåíåáîëüøèõ òåêñòóð ïîâûøàåò ýôôåêòèâíîñòü ïðîãðàììû.6.2. Íàëîæåíèå òåêñòóðû íà îáúåêòû816.2. Íàëîæåíèå òåêñòóðû íà îáúåêòûÏðè íàëîæåíèè òåêñòóðû, êàê óæå óïîìèíàëîñü, íàäî ó÷èòûâàòü ñëó÷àé, êîãäà ðàçìåðû òåêñòóðû îòëè÷àþòñÿ îò îêîííûõðàçìåðîâ îáúåêòà, íà êîòîðûé îíà íàêëàäûâàåòñÿ. Ïðè ýòîì âîçìîæíî êàê ðàñòÿæåíèå, òàê è ñæàòèå èçîáðàæåíèÿ, è òî, êàê áóäóò ïðîâîäèòüñÿ ýòè ïðåîáðàçîâàíèÿ, ìîæåò ñåðüåçíî ïîâëèÿòüíà êà÷åñòâî ïîñòðîåííîãî èçîáðàæåíèÿ.
Äëÿ îïðåäåëåíèÿ ïîëîæåíèÿ òî÷êè íà òåêñòóðå èñïîëüçóåòñÿ ïàðàìåòðè÷åñêàÿ ñèñòåìàêîîðäèíàò(s, t),ïðè÷åì çíà÷åíèÿsètíàõîäÿòñÿ â îòðåçêå[0, 1](ñì. ðèñóíîê 6.1)Ðèñ. 6.1. Òåêñòóðíûå êîîðäèíàòûÄëÿ èçìåíåíèÿ ðàçëè÷íûõ ïàðàìåòðîâ òåêñòóðû ïðèìåíÿþòñÿ êîìàíäû:void glTexParameter [ i f ] (GLenum t a r g e t , GLenum pname ,GLenum param )void glTexParameter [ i f ] v (GLenum t a r g e t , GLenum pname ,Glenum * params )target ïðèíèìàåò çíà÷åíèÿ GL_TEXTURE_1D èëèGL_TEXTURE_2D, pname îïðåäåëÿåò, êàêîå ñâîéñòâî áóäåì ìåíÿòü, à ñ ïîìîùüþ param èëè params óñòàíàâëèâàåòñÿ íîâîå çíà÷åíèå. Âîçìîæíûå çíà÷åíèÿ pname:ÏàðàìåòðGL_TEXTURE_MIN_FILTER ïàðàìåòðparamîïðåäå-Ãëàâà 6.
Òåêñòóðèðîâàíèå82ëÿåò ôóíêöèþ, êîòîðàÿ áóäåò èñïîëüçîâàòüñÿ äëÿ ñæàòèÿGL_NEAREST áóäåò èñïîëüçîâàòüñÿ îäèí (áëèæàéøèé), à ïðè çíà÷åíèè GL_LINEAR ÷åòûòåêñòóðû. Ïðè çíà÷åíèèðå áëèæàéøèõ ýëåìåíòà òåêñòóðû.Çíà÷åíèå ïî óìîë÷àíèþ:GL_LINEAR.GL_TEXTURE_MAG_FILTERparam îïðåäå- ïàðàìåòðëÿåò ôóíêöèþ, êîòîðàÿ áóäåò èñïîëüçîâàòüñÿ äëÿ óâåëè÷åíèÿ (ðàñòÿæåíèÿ) òåêñòóðû. Ïðè çíà÷åíèèGL_NEARESTáóäåò èñïîëüçîâàòüñÿ îäèí (áëèæàéøèé), à ïðè çíà÷åíèèGL_LINEAR ÷åòûðåáëèæàéøèõ ýëåìåíòà òåêñòóðû.Çíà÷åíèå ïî óìîë÷àíèþ:GL_LINEAR. ïàðàìåòðGL_TEXTURE_WRAP_Såò çíà÷åíèå êîîðäèíàòû[0, 1].Ïðè çíà÷åíèès,paramóñòàíàâëèâà-åñëè îíî íå âõîäèò â îòðåçîêGL_REPEATöåëàÿ ÷àñòüsîòáðàñû-âàåòñÿ, è â ðåçóëüòàòå èçîáðàæåíèå ðàçìíîæàåòñÿ ïî ïî-GL_CLAMPâåðõíîñòè.
Ïðè çíà÷åíèèèñïîëüçóþòñÿ êðàå-âûå çíà÷åíèÿ (0 èëè 1), ÷òî óäîáíî èñïîëüçîâàòü, åñëè íàîáúåêò íàêëàäûâàåòñÿ îäèí îáðàç.Çíà÷åíèå ïî óìîë÷àíèþ:GL_REPEAT.GL_TEXTURE_WRAP_T àíàëîãè÷íî ïðåäûäóùåìó çíà-÷åíèþ, òîëüêî äëÿ êîîðäèíàòûÈñïîëüçîâàíèå ðåæèìàt.GL_NEAREST ïîâûøàåò ñêîðîñòü íà-ëîæåíèÿ òåêñòóðû, îäíàêî ïðè ýòîì ñíèæàåòñÿ êà÷åñòâî, òàê êàê,â îòëè÷èå îòGL_LINEAR,èíòåðïîëÿöèÿ íå ïðîèçâîäèòñÿ.Äëÿ òîãî ÷òîáû îïðåäåëèòü, êàê òåêñòóðà áóäåò âçàèìîäåéñòâîâàòü ñ ìàòåðèàëîì, èç êîòîðîãî ñäåëàí îáúåêò, èñïîëüçóþòñÿêîìàíäûvoid glTexEnv [ i f ](GLenumGLtypevoid glTexEnv [ i f ] v (GLenumGLtypet a r g e t , GLenum pname ,param )t a r g e t , GLenum pname ,* params )6.2.
Íàëîæåíèå òåêñòóðû íà îáúåêòû83target äîëæåí áûòü ðàâåí GL_TEXTURE_ENV,pname ðàññìîòðèì òîëüêî îäíî çíà÷åíèåGL_TEXTURE_ENV_MODE, êîòîðîå ïðèìåíÿåòñÿ íàèáîëååÏàðàìåòðàâêà÷åñòâå÷àñòî.Íàèáîëåå ÷àñòî èñïîëüçóåìûå çíà÷åíèÿ ïàðàìåòðàGL_MODULATEparam: êîíå÷íûé öâåò íàõîäèòñÿ êàê ïðîèçâåäå-íèå öâåòà òî÷êè íà ïîâåðõíîñòè è öâåòà ñîîòâåòñòâóþùåéåé òî÷êè íà òåêñòóðå.GL_REPLACE â êà÷åñòâå êîíå÷íîãî öâåòà èñïîëüçóåòñÿöâåò òî÷êè íà òåêñòóðå.Ñëåäóþùèé ïðèìåð êîäà äåìîíñòðèðóåò îáùèé ïîäõîä ê ñîçäàíèþ òåêñòóð:/* íóæíîå íàì êîëè÷åñòâî òåêñòóð */#define NUM_TEXTURES 10/* èäåíòèôèêàòîðû òåêñòóð */int TextureIDs [NUM_TEXTURES] ;/* îáðàç òåêñòóðû */AUX_RGBImageRec * pImage ;.../* 1) ïîëó÷àåì èäåíòèôèêàòîðû òåêñòóð */glGenTextures (NUM_TEXTURES, TextureIDs ) ;/* 2) âûáèðàåì òåêñòóðó äëÿ ìîäèôèêàöèè ïàðàìåòðîâ */glBindTexture ( TextureIDs [ i ] ) ; /* 0<=i <NUM_TEXTURES*//* 3) çàãðóæàåì òåêñòóðó .Ðàçìåðû òåêñòóðû "−−− ñòåïåíü 2 */pImage=dibImageLoad ( " t e x t u r e .
bmp" ) ;i f ( Texture !=NULL){/* 4) ïåðåäàåì òåêñòóðó OpenGL è çàäàåì ïàðàìåòðû*/Ãëàâà 6. Òåêñòóðèðîâàíèå84/* âûðàâíèâàíèå ïî áàéòó */g l P i x e l S t o r e i (GL_UNPACK_ALIGNMENT, 1 ) ;gluBuildMipmaps (GL_TEXTURE_2D,GL_RGB, pImage−>sizeX ,pImage−>sizeY , GL_RGB, GL_UNSIGNED_BYTE,pImage−>data ) ;glTexParameterf (GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,( float )GL_LINEAR) ;glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,( float )GL_LINEAR) ;glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,( float )GL_REPEAT) ;glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,( float )GL_REPEAT) ;glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,( float )GL_REPLACE) ;/* 5) óäàëÿåì èñõîäíîå èçîáðàæåíèå .
*/f r e e ( Texture ) ;}elseError ( ) ;6.3. Òåêñòóðíûå êîîðäèíàòûÏåðåä íàíåñåíèåì òåêñòóðû íà îáúåêò íåîáõîäèìî óñòàíîâèòüñîîòâåòñòâèå ìåæäó òî÷êàìè íà ïîâåðõíîñòè îáúåêòà è íà ñàìîéòåêñòóðå. Çàäàâàòü ýòî ñîîòâåòñòâèå ìîæíî äâóìÿ ìåòîäàìè: îòäåëüíî äëÿ êàæäîé âåðøèíû èëè ñðàçó äëÿ âñåõ âåðøèí, çàäàâ6.3. Òåêñòóðíûå êîîðäèíàòû85ïàðàìåòðû ñïåöèàëüíîé ôóíêöèè îòîáðàæåíèÿ. Ïåðâûé ìåòîäðåàëèçóåòñÿ ñ ïîìîùüþ êîìàíävoid glTexCoord [ 1 2 3 4 ] [ s i f d ] ( type coord )void glTexCoord [ 1 2 3 4 ] [ s i f d ] v ( type * coord )×àùå âñåãî èñïîëüçóþòñÿ êîìàíäûglTexCoord2*(type s, type t),çàäàþùèå òåêóùèå êîîðäèíàòû òåêñòóðû.