Баяковский.Начальный курс OpenGL (1124482), страница 10
Текст из файла (страница 10)
Ïîíÿòèå òåêóùèõ êîîðäèíàò òåêñòóðû àíàëîãè÷íî ïîíÿòèÿì òåêóùåãî öâåòà è òåêóùåé íîðìàëè è ÿâëÿåòñÿ àòðèáóòîì âåðøèíû. Îäíàêî äàæå äëÿêóáà íàõîæäåíèå ñîîòâåòñòâóþùèõ êîîðäèíàò òåêñòóðû ÿâëÿåòñÿ äîâîëüíî òðóäîåìêèì çàíÿòèåì, ïîýòîìó â áèáëèîòåêå 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) áóôåðàõ. Êàêïðàâèëî, â ôîíîâîì áóôåðå ïðîãðàììà ñîçäàåò èçîáðàæåíèå, êîòîðîå çàòåì ðàçîì êîïèðóåòñÿ â ðàáî÷èé áóôåð.
Íà ýêðàíå ìîæåòïîÿâèòüñÿ èíôîðìàöèÿ òîëüêî èç áóôåðîâ öâåòà.Áóôåð ãëóáèíû èñïîëüçóåòñÿ äëÿ óäàëåíèÿ íåâèäèìûõ ïîâåðõíîñòåé è ïðÿìàÿ ðàáîòà ñ íèì òðåáóåòñÿ êðàéíå ðåäêî.Áóôåð-íàêîïèòåëü ìîæíî ïðèìåíÿòü äëÿ ðàçëè÷íûõ îïåðàöèé. Áîëåå ïîäðîáíî ðàáîòà ñ íèì îïèñàíà â ðàçäåëå 7.2.Áóôåð ìàñêè èñïîëüçóåòñÿ äëÿ ôîðìèðîâàíèÿ ïèêñåëüíûõìàñîê (òðàôàðåòîâ), ñëóæàùèõ äëÿ âûðåçàíèÿ èç îáùåãî ìàññèâà òåõ ïèêñåëåé, êîòîðûå ñëåäóåò âûâåñòè íà ýêðàí.
Áóôåð ìàñêèè ðàáîòà ñ íèì áîëåå ïîäðîáíî ðàññìîòðåíû â ðàçäåëàõ 7.3, 8.2è 8.3.7.1. Ñìåøèâàíèå èçîáðàæåíèé è ïðîçðà÷íîñòüÐàçíîîáðàçíûåïðîçðà÷íûåîáúåêòû ñòåêëà,ïðîçðà÷íàÿïîñóäà è ò.ä. ÷àñòî âñòðå÷àþòñÿ â ðåàëüíîñòè, ïîýòîìó âàæíî óìåòü ñîçäàâàòü òàêèå îáúåêòû â èíòåðàêòèâíîé ãðàôèêå.OpenGL ïðåäîñòàâëÿåò ïðîãðàììèñòó ìåõàíèçì ðàáîòû ñ ïîëóïðîçðà÷íûìè îáúåêòàìè, êîòîðûé è áóäåò êðàòêî îïèñàí â ýòîìðàçäåëå.Ïðîçðà÷íîñòü ðåàëèçóåòñÿ ñ ïîìîùüþ ñïåöèàëüíîãî ðåæèìà ñìåøèâàíèÿ öâåòîâ (blending). Àëãîðèòì ñìåøèâàíèÿ êîìáèíèðóåò öâåòà òàê íàçûâàåìûõ âõîäÿùèõ ïèêñåëåé (ò.å.
¾êàíäèäàòîâ¿ íà ïîìåùåíèå â áóôåð êàäðà) ñ öâåòàìè ñîîòâåòñòâóþùèõ ïèêñåëåé, óæå õðàíÿùèõñÿ â áóôåðå. Äëÿ ñìåøèâàíèÿèñïîëüçóåòñÿ ÷åòâåðòàÿ êîìïîíåíòà öâåòà àëüôà-êîìïîíåíòà,7.1. Ñìåøèâàíèå èçîáðàæåíèé è ïðîçðà÷íîñòü91ïîýòîìó ýòîò ðåæèì íàçûâàþò åùå àëüôà-ñìåøèâàíèåì. Ïðîãðàììà ìîæåò óïðàâëÿòü èíòåíñèâíîñòüþ àëüôà-êîìïîíåíòûòî÷íî òàê æå, êàê è èíòåíñèâíîñòüþ îñíîâíûõ öâåòîâ, ò.å. çàäàâàòü çíà÷åíèå èíòåíñèâíîñòè äëÿ êàæäîãî ïèêñåëÿ èëè êàæäîéâåðøèíû ïðèìèòèâà.
Ðåæèì âêëþ÷àåòñÿ ñ ïîìîùüþ êîìàíäûglEnable(GL_BLEND).Îïðåäåëèòü ïàðàìåòðû ñìåøèâàíèÿ ìîæíî ñ ïîìîùüþ êîìàíäû:void glBlendFunc (enum src , enum dst )Ïàðàìåòðsrcîïðåäåëÿåò êàê ïîëó÷èòü êîýôôèöèåíòõîäíîãî öâåòà ïèêñåëÿ, aöèåíòàk2dstk1èñ-çàäàåò ñïîñîá ïîëó÷åíèÿ êîýôôè-äëÿ öâåòà â áóôåðå êàäðà. Äëÿ ïîëó÷åíèÿ ðåçóëüòè-res = csrc ∗k1 + cdst ∗ k2 , ãäå csrc öâåò èñõîäíîãî ïèêñåëÿ, cdst öâåò ïèêñåëÿ â áóôåðå êàäðà (res, k1 , k1 , csrc , cdst ÷åòûðåõêîìïîíåíòíûåðóþùåãî öâåòà èñïîëüçóåòñÿ ñëåäóþùàÿ ôîðìóëà:RGBA-âåêòîðû).srcÏðèâåäåì íàèáîëåå ÷àñòî èñïîëüçóåìûå çíà÷åíèÿ àãðóìåíòîâèdst.GL_SRC_ALPHAk = (As , As , As , As )GL_SRC_ONE_MINUS_ALPHAk = (1, 1, 1, 1) − (As , As , As , As )GL_DST_COLORk = (Rd , Gd , Bd )GL_ONE_MINUS_DST_COLORk = (1, 1, 1, 1) − (Rd , Gd , Bd , d )GL_DST_ALPHAk = (Ad , A − d, A − d, Ad )GL_DST_ONE_MINUS_ALPHAk = (1, 1, 1, 1) − (Ad , Ad , Ad , Ad )Ãëàâà 7.
Îïåðàöèè ñ ïèêñåëÿìè92GL_SRC_COLORk = (Rs, Gs, Bs)GL_ONE_MINUS_SRC_COLORk = (1, 1, 1, 1) − (Rs , Gs , Bs , As )Ïðèìåð: ïðåäïîëîæèì, ìû õîòèì ðåàëèçîâàòü âûâîä ïðîçðà÷íûõ îáúåêòîâ. Êîýôôèöèåíò ïðîçðà÷íîñòè çàäàåòñÿ àëüôàêîìïîíåíòîé öâåòà. Ïóñòü 1 íåïðîçðà÷íûé îáúåêò; 0 àáñîëþòíî ïðîçðà÷íûé, ò.å. íåâèäèìûé. Äëÿ ðåàëèçàöèè ñëóæèò ñëåäóþùèé êîä:glEnable (GL_BLEND) ;glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;Íàïðèìåð, ïîëóïðîçðà÷íûé òðåóãîëüíèê ìîæíî çàäàòü ñëåäóþùèì îáðàçîì:glColor3f (1.0 , 0.0 , 0.0 , 0.5);g l B e g i n (GL_TRIANGLES) ;glVertex3f (0.0 , 0.0 , 0 . 0 ) ;glVertex3f (1.0 , 0.0 , 0 .
0 ) ;glVertex3f (1.0 , 1.0 , 0 . 0 ) ;glEnd ( ) ;Åñëè â ñöåíå åñòü íåñêîëüêî ïðîçðà÷íûõ îáúåêòîâ, êîòîðûåìîãóò ïåðåêðûâàòü äðóã äðóãà, êîððåêòíûé âûâîä ìîæíî ãàðàíòèðîâàòü òîëüêî â ñëó÷àå âûïîëíåíèÿ ñëåäóþùèõ óñëîâèé:âñå ïðîçðà÷íûå îáúåêòû âûâîäÿòñÿ ïîñëå íåïðîçðà÷íûõ;ïðè âûâîäå îáúåêòû ñ ïðîçðà÷íîñòüþ äîëæíû áûòü óïîðÿäî÷åíû ïî óìåíüøåíèþ ãëóáèíû, ò.å.
âûâîäèòüñÿ, íà÷èíàÿñ íàèáîëåå îòäàëåííûõ îò íàáëþäàòåëÿ. OpenGL êîìàíäû îáðàáàòûâàþòñÿ â ïîðÿäêå èõ ïîñòóïëåíèÿ, ïîýòîìó äëÿ ðåàëèçàöèè ïåðå÷èñëåííûõ òðåáîâàíèé äîñòàòî÷íî ðàññòàâèòü â ñîîòâåòñòâóþùåì ïîðÿäêå âûçîâû êîìàíäglVertex,íî è ýòî â îáùåì ñëó÷àå íåòðèâèàëüíî.7.2. Áóôåð-íàêîïèòåëü937.2. Áóôåð-íàêîïèòåëüÁóôåð-íàêîïèòåëü (accumulation buer) ýòî îäèí èç äîïîëíèòåëüíûõ áóôåðîâ OpenGL.
 íåì ìîæíî ñîõðàíÿòü âèçóàëèçèðîâàííîå èçîáðàæåíèå, ïðèìåíÿÿ ïðè ýòîì ïîïèêñåëüíî ñïåöèàëüíûå îïåðàöèè. Áóôåð-íàêîïèòåëü øèðîêî èñïîëüçóåòñÿ äëÿñîçäàíèÿ ðàçëè÷íûõ ñïåöýôôåêòîâ.Èçîáðàæåíèå áåðåòñÿ èç áóôåðà, âûáðàííîãî íà ÷òåíèå êîìàíäîévoid glReadBuffer (enum buf )buf îïðåäåëÿåò áóôåð äëÿ ÷òåíèÿ. Çíà÷åíèÿ buf,ðàâíûå GL_BACK, GL_FRONT, îïðåäåëÿþò ñîîòâåòñòâóþùèåáóôåðû öâåòà äëÿ ÷òåíèÿ. GL_BACK çàäàåò â êà÷åñòâå èñòî÷íèêà ïèêñåëåé âíåýêðàííûé áóôåð; GL_FRONT òåêóùåå ñîäåðÀðãóìåíòæèìîå îêíà âûâîäà. Êîìàíäà èìååò çíà÷åíèå, åñëè èñïîëüçóåòñÿäóáëèðóþùàÿ áóôåðèçàöèÿ.