Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 10
Текст из файла (страница 10)
Äëÿ îïðåäåëåíèÿ ïîëîæåíèÿ òî÷êè íà òåêñòóðå èñïîëüçóåòñÿ ïàðàìåòðè÷åñêàÿ ñèñòåìàêîîðäèíàò(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),çàäàþùèå òåêóùèå êîîðäèíàòû òåêñòóðû. Ïîíÿòèå òåêóùèõ êîîðäèíàò òåêñòóðû àíàëîãè÷íî ïîíÿòèÿì òåêóùåãî öâåòà è òåêóùåé íîðìàëè è ÿâëÿåòñÿ àòðèáóòîì âåðøèíû.
Îäíàêî äàæå äëÿêóáà íàõîæäåíèå ñîîòâåòñòâóþùèõ êîîðäèíàò òåêñòóðû ÿâëÿåòñÿ äîâîëüíî òðóäîåìêèì çàíÿòèåì, ïîýòîìó â áèáëèîòåêå GLUïîìèìî êîìàíä, ïðîâîäÿùèõ ïîñòðîåíèå òàêèõ ïðèìèòèâîâ êàêñôåðà, öèëèíäð è äèñê, ïðåäóñìîòðåíî òàêæå íàëîæåíèå íà íèõòåêñòóð. Äëÿ ýòîãî äîñòàòî÷íî âûçâàòü êîìàíäóvoid gluQuadricTexture (GLUquadricObj * quadObject ,GLboolean textureCoords )ñ ïàðàìåòðîìtextureCoordsðàâíûìGL_TRUE,è òîãäà òåêóùàÿòåêñòóðà áóäåò àâòîìàòè÷åñêè íàêëàäûâàòüñÿ íà ïðèìèòèâ.Âòîðîé ìåòîä ðåàëèçóåòñÿ ñ ïîìîùüþ êîìàíävoid glTexGen [ i f d ](GLenum coord , GLenum pname ,GLtype param )void glTexGen [ i f d ] v (GLenum coord , GLenum pname ,const GLtype * params )Ïàðàìåòðcoordîïðåäåëÿåò äëÿ êàêîé êîîðäèíàòû çàäàåòñÿôîðìóëà, è ìîæåò ïðèíèìàòü çíà÷åíèåGL_S, GL_T; pnameìî-æåò áûòü ðàâåí îäíîìó èç ñëåäóþùèõ çíà÷åíèé:GL_TEXTURE_GEN_MODE çàäàåò ôóíêöèþ äëÿ íà-ëîæåíèÿ òåêñòóðû.  ýòîì ñëó÷àå àðãóìåíò param ïðèíèìàåò çíà÷åíèÿ:GL_OBJECT_LINEAR çíà÷åíèåñîîòâåòñòâóþùåéòåêñòóðíîé êîîðäèíàòû îïðåäåëÿåòñÿ ðàññòîÿíèåì äîÃëàâà 6.
Òåêñòóðèðîâàíèå86ïëîñêîñòè, çàäàâàåìîé ñ ïîìîùüþ çíà÷åíèÿGL_OBJECT_PLANEpname(ñì. íèæå). Ôîðìóëà âûãëÿäèòñëåäóþùèì îáðàçîì:g = x ∗ xp + y ∗ yp + z ∗ zp + w ∗ wpãäåèëèêè.g ñîîòâåòñòâóþùàÿ òåêñòóðíàÿ êîîðäèíàòà (sp), x, y, z, w êîîðäèíàòû ñîîòâåòñòâóþùåé òî÷xp , yp , zp , wp êîýôôèöèåíòû óðàâíåíèÿ ïëîñêî-ñòè.  ôîðìóëå èñïîëüçóþòñÿ êîîðäèíàòû îáúåêòà. àíàëîãè÷íîGL_EYE_LINEARGL_OBJECT_LINEAR,òîëüêî â ôîðìóëå èñïîëüçóþòñÿ âèäîâûå êîîðäèíàòû.Ò.å. êîîðäèíàòû òåêñòóðû îáúåêòà â ýòîì ñëó÷àå çàâèñÿò îò ïîëîæåíèÿ ýòîãî îáúåêòà.GL_SPHERE_MAP ïîçâîëÿåò ýìóëèðîâàòü îòðàæå-íèå îò ïîâåðõíîñòè îáúåêòà.
Òåêñòóðà êàê áû ¾îáîðà÷èâàåòñÿ¿ âîêðóã îáúåêòà. Äëÿ äàííîãî ìåòîäà èñïîëüçóþòñÿ âèäîâûå êîîðäèíàòû è íåîáõîäèìî çàäàíèå íîðìàëåé.GL_OBJECT_PLANE ïîçâîëÿåò çàäàòü ïëîñêîñòü, ðàñ-ñòîÿíèå äî êîòîðîé áóäåò èñïîëüçîâàòüñÿ ïðè ãåíåðàöèè êîîðäèíàò, åñëè óñòàíîâëåí ðåæèìýòîì ñëó÷àå ïàðàìåòðparamsGL_OBJECT_LINEAR.Âÿâëÿåòñÿ óêàçàòåëåì íà ìàñ-ñèâ èç ÷åòûðåõ êîýôôèöèåíòîâ óðàâíåíèÿ ïëîñêîñòè.GL_EYE_PLANE àíàëîãè÷íî ïðåäûäóùåìó çíà÷åíèþ.
Ïîç-âîëÿåò çàäàòü ïëîñêîñòü äëÿ ðåæèìàGL_EYE_LINEAR.Äëÿ óñòàíîâêè àâòîìàòè÷åñêîãî ðåæèìà çàäàíèÿ òåêñòóðíûõglEnable ñ ïàðàìåòðîìGL_TEXTURE_GEN_P.êîîðäèíàò íåîáõîäèìî âûçâàòü êîìàíäóGL_TEXTURE_GEN_SèëèÏðîãðàììà, èñïîëüçóþùàÿ íàëîæåíèå òåêñòóðû è àíèìàöèþ,ïðèâåäåíà â ïðèëîæåíèè Á.6.4. Êîíòðîëüíûå âîïðîñû876.4. Êîíòðîëüíûå âîïðîñû1) ×òî òàêîå òåêñòóðà è äëÿ ÷åãî èñïîëüçóþòñÿ òåêñòóðû?2) ×òî òàêîå òåêñòóðíûå êîîðäèíàòû è êàê çàäàòü èõ äëÿ îáúåêòà?3) Êàêîé ìåòîä âçàèìîäåéñòâèÿ ñ ìàòåðèàëîì íóæíî èñïîëüçîâàòü, åñëè òåêñòóðà ïðåäñòàâëÿåò ñîáîé êàðòèíó, âèñÿùóþ íà ñòåíå (GL_MODULATE, GL_REPLACE)?4) Ïåðå÷èñëèòå èçâåñòíûå âàì ìåòîäû ãåíåðàöèè òåêñòóðíûõêîîðäèíàò â OpenGL.5) Äëÿ ÷åãî èñïîëüçóþòñÿ óðîâíè äåòàëèçàöèè òåêñòóðû (mipmapping)?6) ×òî òàêîå ðåæèìû ôèëüòðàöèè òåêñòóðû è êàê çàäàòü èõâ OpenGL?Ãëàâà 7.Îïåðàöèè ñ ïèêñåëÿìèÏîñëå ïðîâåäåíèÿ âñåõ îïåðàöèé ïî ïðåîáðàçîâàíèþ êîîðäèíàò âåðøèí, âû÷èñëåíèÿ öâåòà è ò.ï., OpenGL ïåðåõîäèò êýòàïó ðàñòåðèçàöèè, íà êîòîðîì ïðîèñõîäèò ðàñòåðèçàöèÿ âñåõïðèìèòèâîâ, íàëîæåíèå òåêñòóðû, íàëîæåíèå ýôôåêòà òóìàíà.Äëÿ êàæäîãî ïðèìèòèâà ðåçóëüòàòîì ýòîãî ïðîöåññà ÿâëÿåòñÿçàíèìàåìàÿ èì â áóôåðå êàäðà îáëàñòü, êàæäîìó ïèêñåëþ ýòîéîáëàñòè ïðèïèñûâàåòñÿ öâåò è çíà÷åíèå ãëóáèíû.OpenGL èñïîëüçóåò ýòó èíôîðìàöèþ, ÷òîáû çàïèñàòü îáíîâëåííûå äàííûå â áóôåð êàäðà.
Äëÿ ýòîãî OpenGL èìååò íå òîëüêî îòäåëüíûé êîíâåéåð îáðàáîòêè ïèêñåëåé, íî è íåñêîëüêî äîïîëíèòåëüíûõ áóôåðîâ ðàçëè÷íîãî íàçíà÷åíèÿ. Ýòî ïîçâîëÿåòïðîãðàììèñòó ãèáêî êîíòðîëèðîâàòü ïðîöåññ âèçóàëèçàöèè íàñàìîì íèçêîì óðîâíå.Ãðàôè÷åñêàÿ áèáëèîòåêà OpenGL ïîääåðæèâàåò ðàáîòó ñîñëåäóþùèìè áóôåðàìè:íåñêîëüêî áóôåðîâ öâåòà;áóôåð ãëóáèíû;áóôåð-íàêîïèòåëü (àêêóìóëÿòîð);89Ãëàâà 7. Îïåðàöèè ñ ïèêñåëÿìè90áóôåð ìàñêè.Ãðóïïà áóôåðîâ öâåòà âêëþ÷àåò áóôåð êàäðà, íî òàêèõ áóôåðîâ ìîæåò áûòü íåñêîëüêî. Ïðè èñïîëüçîâàíèè äâîéíîé áóôåðèçàöèè ãîâîðÿò î ðàáî÷åì (front) è ôîíîâîì (back) áóôåðàõ. Êàêïðàâèëî, â ôîíîâîì áóôåðå ïðîãðàììà ñîçäàåò èçîáðàæåíèå, êîòîðîå çàòåì ðàçîì êîïèðóåòñÿ â ðàáî÷èé áóôåð.