Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 5
Текст из файла (страница 5)
Êàê ïðàâèëî, îíà ñîñòîèò èç òðåõøàãîâ:î÷èñòêà áóôåðîâ OpenGL;óñòàíîâêà ïîëîæåíèÿ íàáëþäàòåëÿ;ïðåîáðàçîâàíèå è ðèñîâàíèå ãåîìåòðè÷åñêèõ îáúåêòîâ.Î÷èñòêà áóôåðîâ ïðîèçâîäèòñÿ ñ ïîìîùüþ êîìàíäû:void g l C l e a r C o l o r ( clampf r , clampf g , clampf b ,clampf a )void g l C l e a r ( b i t f i e l d buf )ÊîìàíäàglClearColoróñòàíàâëèâàåò öâåò, êîòîðûì áóäåò çà-ïîëíåí áóôåð êàäðà. Ïåðâûå òðè ïàðàìåòðà êîìàíäû çàäàþòR,G è B êîìïîíåíòû öâåòà è äîëæíû ïðèíàäëåæàòü îòðåçêó[0, 1].×åòâåðòûé ïàðàìåòð çàäàåò òàê íàçûâàåìóþ àëüôà êîì-ïîíåíòó (ñì.
ï. 7.1). Êàê ïðàâèëî, îí ðàâåí 1. Ïî óìîë÷àíèþöâåò ÷åðíûé (0,0,0,1).ÊîìàíäàglClearî÷èùàåò áóôåðû, à ïàðàìåòð buf îïðåäåëÿ-åò êîìáèíàöèþ êîíñòàíò, ñîîòâåòñòâóþùóþ áóôåðàì, êîòîðûåíóæíî î÷èñòèòü (ñì. ãëàâó 7). Òèïè÷íàÿ ïðîãðàììà âûçûâàåòêîìàíäóg l C l e a r (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)äëÿ î÷èñòêè áóôåðîâ öâåòà è ãëóáèíû.Óñòàíîâêà ïîëîæåíèÿ íàáëþäàòåëÿ è ïðåîáðàçîâàíèÿ òðåõìåðíûõ îáúåêòîâ (ïîâîðîò, ñäâèã è ò.ä.) êîíòðîëèðóþòñÿ ñ ïîìîùüþ çàäàíèÿ ìàòðèö ïðåîáðàçîâàíèÿ.
Ïðåîáðàçîâàíèÿ îáúåêòîâè íàñòðîéêà ïîëîæåíèÿ âèðòóàëüíîé êàìåðû îïèñàíû â ãëàâå 4.3.2. Âåðøèíû è ïðèìèòèâû41Ñåé÷àñ ñîñðåäîòî÷èìñÿ íà òîì, êàê ïåðåäàòü â OpenGL îïèñàíèÿ îáúåêòîâ, íàõîäÿùèõñÿ â ñöåíå. Êàæäûé îáúåêò ÿâëÿåòñÿíàáîðîì ïðèìèòèâîâ OpenGL.3.2. Âåðøèíû è ïðèìèòèâû OpenGLâåðøèíà(vertex) ÿâëÿåòñÿ àòîìàðíûì ãðàôè÷å-ñêèì ïðèìèòèâîì è îïðåäåëÿåò òî÷êó, êîíåö îòðåçêà, óãîë ìíîãîóãîëüíèêà è ò.ä.
Âñå îñòàëüíûå ïðèìèòèâû ôîðìèðóþòñÿ ñïîìîùüþ çàäàíèÿ âåðøèí, âõîäÿùèõ â äàííûé ïðèìèòèâ. Íàïðèìåð, îòðåçîê îïðåäåëÿåòñÿ äâóìÿ âåðøèíàìè, ÿâëÿþùèìèñÿêîíöàìè îòðåçêà.Ñ êàæäîé âåðøèíîé àññîöèèðóþòñÿ ååàòðèáóòû.  ÷èñëîîñíîâíûõ àòðèáóòîâ âõîäÿò ïîëîæåíèå âåðøèíû â ïðîñòðàíñòâå,öâåò âåðøèíû è âåêòîð íîðìàëè.3.2.1. Ïîëîæåíèå âåðøèíû â ïðîñòðàíñòâåÏîëîæåíèå âåðøèíû îïðåäåëÿþòñÿ çàäàíèåì åå êîîðäèíàò âäâóõ-, òðåõ-, èëè ÷åòûðåõìåðíîì ïðîñòðàíñòâå (îäíîðîäíûå êîîðäèíàòû). Ýòî ðåàëèçóåòñÿ ñ ïîìîùüþ íåñêîëüêèõ âàðèàíòîâglVertex:void g l V e r t e x [ 2 3 4 ] [ s i f d ] ( type co ords )void g l V e r t e x [ 2 3 4 ] [ s i f d ] v ( type * coo rds )êîìàíäûÊàæäàÿ êîìàíäà çàäàåò ÷åòûðå êîîðäèíàòû âåðøèíû: x, y,z, w. ÊîìàíäàglVertex2*ïîëó÷àåò çíà÷åíèÿ x è y.
Êîîðäèíàòàz â òàêîì ñëó÷àå óñòàíàâëèâàåòñÿ ïî óìîë÷àíèþ ðàâíîé 0, êîîðäèíàòà w ðàâíîé 1.glVertex3*ïîëó÷àåò êîîðäèíàòû x, y, z èçàíîñèò â êîîðäèíàòó w çíà÷åíèå 1.glVertex4*ïîçâîëÿåò çàäàòüâñå ÷åòûðå êîîðäèíàòû.Äëÿ àññîöèàöèè ñ âåðøèíàìè öâåòîâ, íîðìàëåé è òåêñòóðíûõ êîîðäèíàò èñïîëüçóþòñÿ òåêóùèå çíà÷åíèÿ ñîîòâåòñòâóþùèõ äàííûõ, ÷òî îòâå÷àåò îðãàíèçàöèè OpenGL êàê êîíå÷íîãîÃëàâà 3. Ðèñîâàíèå ãåîìåòðè÷åñêèõ îáúåêòîâ42àâòîìàòà. Ýòè çíà÷åíèÿ ìîãóò áûòü èçìåíåíû â ëþáîé ìîìåíò ñïîìîùüþ âûçîâà ñîîòâåòñòâóþùèõ êîìàíä.3.2.2.
Öâåò âåðøèíûÄëÿ çàäàíèÿ òåêóùåãî öâåòà âåðøèíû èñïîëüçóþòñÿ êîìàíäûvoid g l C o l o r [ 3 4 ] [ b s i f ] ( GLtype components )void g l C o l o r [ 3 4 ] [ b s i f ] v ( GLtype components )Ïåðâûå òðè ïàðàìåòðà çàäàþò R, G, B êîìïîíåíòû öâåòà,à ïîñëåäíèé ïàðàìåòð îïðåäåëÿåò êîýôôèöèåíò íåïðîçðà÷íîñòè(òàê íàçûâàåìàÿ àëüôà-êîìïîíåíòà).
Åñëè â íàçâàíèè êîìàíäûóêàçàí òèï ¾f¿ (oat), òî çíà÷åíèÿ âñåõ ïàðàìåòðîâ äîëæíû ïðèíàäëåæàòü îòðåçêó [0,1], ïðè ýòîì ïî óìîë÷àíèþ çíà÷åíèå àëüôà-êîìïîíåíòû óñòàíàâëèâàåòñÿ ðàâíûì 1.0, ÷òî ñîîòâåòñòâóåòïîëíîé íåïðîçðà÷íîñòè. Òèï ¾ub¿ (unsigned byte) ïîäðàçóìåâàåò,÷òî çíà÷åíèÿ äîëæíû ëåæàòü â îòðåçêå [0,255].Âåðøèíàì ìîæíî íàçíà÷àòü ðàçëè÷íûå öâåòà, è, åñëè âêëþ÷åí ñîîòâåòñòâóþùèé ðåæèì, òî áóäåò ïðîâîäèòüñÿ ëèíåéíàÿ èíòåðïîëÿöèÿ öâåòîâ ïî ïîâåðõíîñòè ïðèìèòèâà.Äëÿ óïðàâëåíèÿ ðåæèìîì èíòåðïîëÿöèè èñïîëüçóåòñÿ êîìàíäàvoid glShadeModel (GLenum mode )GL_SMOOTH âêëþ÷àåò èíòåðïîëÿóìîë÷àíèþ), à ñ GL_FLAT îòêëþ÷àåò.âûçîâ êîòîðîé ñ ïàðàìåòðîìöèþ (óñòàíîâêà ïî3.2.3.
ÍîðìàëüÎïðåäåëèòü íîðìàëü â âåðøèíå ìîæíî, èñïîëüçóÿ êîìàíäûvoid glNormal3 [ b s i f d ] ( type c oord s )void glNormal3 [ b s i f d ] v ( type coor ds )3.3. Îïåðàòîðíûå ñêîáêè GLBEGIN / GLEND43Äëÿ ïðàâèëüíîãî ðàñ÷åòà îñâåùåíèÿ íåîáõîäèìî, ÷òîáû âåêòîð íîðìàëè èìåë åäèíè÷íóþ äëèíó.  OpenGL ñóùåñòâóåòñïåöèàëüíûé ðåæèì, ïðè êîòîðîì çàäàâàåìûå íîðìàëè áóäóòíîðìèðîâàòüñÿ àâòîìàòè÷åñêè. Åãî ìîæíî âêëþ÷èòü êîìàíäîéglEnable(GL_NORMALIZE).Ðåæèì àâòîìàòè÷åñêîé íîðìàëèçàöèè äîëæåí áûòü âêëþ÷åí,åñëè ïðèëîæåíèå èñïîëüçóåò ìîäåëüíûå ïðåîáðàçîâàíèÿ ðàñòÿæåíèÿ/ñæàòèÿ, òàê êàê â ýòîì ñëó÷àå äëèíà íîðìàëåé èçìåíÿåòñÿ ïðè óìíîæåíèè íà ìîäåëüíî-âèäîâóþ ìàòðèöó.Îäíàêî ïðèìåíåíèå ýòîãî ðåæèìà óìåíüøàåò ñêîðîñòü ðàáîòû ìåõàíèçìà âèçóàëèçàöèè OpenGL, òàê êàê íîðìàëèçàöèÿâåêòîðîâ èìååò çàìåòíóþ âû÷èñëèòåëüíóþ ñëîæíîñòü (âçÿòèåêâàäðàòíîãî êîðíÿ).
Ïîýòîìó ëó÷øå ñðàçó çàäàâàòü åäèíè÷íûåíîðìàëè.Îòìåòèì, ÷òî êîìàíäûvoid glEnable (GLenum mode )void g l D i s a b l e (GLenum mode )ïðîèçâîäÿò âêëþ÷åíèå è îòêëþ÷åíèå òîãî èëè èíîãî ðåæèìà ðàáîòû êîíâåéåðà OpenGL. Ýòè êîìàíäû ïðèìåíÿþòñÿ äîñòàòî÷íî÷àñòî, è èõ âîçìîæíûå ïàðàìåòðû áóäóò ðàññìàòðèâàòüñÿ â êàæäîì êîíêðåòíîì ñëó÷àå.3.3. Îïåðàòîðíûå ñêîáêè glBegin / glEndÌû ðàññìîòðåëè çàäàíèå àòðèáóòîâ îäíîé âåðøèíû.
Îäíàêî÷òîáû çàäàòü àòðèáóòû ãðàôè÷åñêîãî ïðèìèòèâà, îäíèõ êîîðäèíàò âåðøèí íåäîñòàòî÷íî. Ýòè âåðøèíû íàäî îáúåäèíèòü â îäíîöåëîå, îïðåäåëèâ íåîáõîäèìûå ñâîéñòâà. Äëÿ ýòîãî â OpenGLèñïîëüçóþòñÿ òàê íàçûâàåìûå îïåðàòîðíûå ñêîáêè, ÿâëÿþùèåñÿ âûçîâàìè ñïåöèàëüíûõ êîìàíä OpenGL. Îïðåäåëåíèå ïðèìèòèâà èëè ïîñëåäîâàòåëüíîñòè ïðèìèòèâîâ ïðîèñõîäèò ìåæäóâûçîâàìè êîìàíäÃëàâà 3. Ðèñîâàíèå ãåîìåòðè÷åñêèõ îáúåêòîâ44void g l B e g i n (GLenum mode )void glEnd ( void )Ïàðàìåòð mode îïðåäåëÿåò òèï ïðèìèòèâà, êîòîðûé çàäàåòñÿâíóòðè è ìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ: êàæäàÿ âåðøèíà çàäàåò êîîðäèíàòû íåêîòî-GL_POINTSðîé òî÷êè.GL_LINES êàæäàÿ îòäåëüíàÿ ïàðà âåðøèí îïðåäåëÿåò îò-ðåçîê; åñëè çàäàíî íå÷åòíîå ÷èñëî âåðøèí, òî ïîñëåäíÿÿâåðøèíà èãíîðèðóåòñÿ.GL_LINE_STRIP êàæäàÿ ñëåäóþùàÿ âåðøèíà çàäàåò îò-ðåçîê âìåñòå ñ ïðåäûäóùåé.GL_LINE_LOOP îòëè÷èå îò ïðåäûäóùåãî ïðèìèòèâà òîëü-êî â òîì, ÷òî ïîñëåäíèé îòðåçîê îïðåäåëÿåòñÿ ïîñëåäíåé èïåðâîé âåðøèíîé, îáðàçóÿ çàìêíóòóþ ëîìàíóþ.GL_TRIANGLES êàæäûå îòäåëüíûå òðè âåðøèíû îïðåäå-ëÿþò òðåóãîëüíèê; åñëè çàäàíî íå êðàòíîå òðåì ÷èñëî âåðøèí, òî ïîñëåäíèå âåðøèíû èãíîðèðóþòñÿ.GL_TRIANGLE_STRIP êàæäàÿ ñëåäóþùàÿ âåðøèíà çà-äàåò òðåóãîëüíèê âìåñòå ñ äâóìÿ ïðåäûäóùèìè.GL_TRIANGLE_FAN òðåóãîëüíèêè çàäàþòñÿ ïåðâîé âåð-øèíîé è êàæäîé ñëåäóþùåé ïàðîé âåðøèí (ïàðû íå ïåðåñåêàþòñÿ).GL_QUADS êàæäàÿ îòäåëüíàÿ ÷åòâåðêà âåðøèí îïðåäåëÿ-åò ÷åòûðåõóãîëüíèê; åñëè çàäàíî íå êðàòíîå ÷åòûðåì ÷èñëîâåðøèí, òî ïîñëåäíèå âåðøèíû èãíîðèðóþòñÿ.GL_QUAD_STRIP ÷åòûðåõóãîëüíèê ñ íîìåðîì n îïðåäå-ëÿåòñÿ âåðøèíàìè ñ íîìåðàìèGL_POLYGON2n − 1, 2n, 2n + 2, 2n + 1.
ïîñëåäîâàòåëüíîïóêëîãî ìíîãîóãîëüíèêà.çàäàþòñÿâåðøèíûâû-3.3. Îïåðàòîðíûå ñêîáêè GLBEGIN / GLEND45Íàïðèìåð, ÷òîáû íàðèñîâàòü òðåóãîëüíèê ñ ðàçíûìè öâåòàìèâ âåðøèíàõ, äîñòàòî÷íî íàïèñàòü:GLfloat BlueCol [ 3 ] = { 0 , 0 , 1 } ;g l B e g i n (GL_TRIANGLES) ;g l C o l o r 3 f ( 1 . 0 , 0 . 0 , 0 . 0 ) ; /* êðàñíûé */glVertex3f (0.0 , 0.0 , 0 . 0 ) ;glColor3ub ( 0 , 2 5 5 , 0 ) ; /* çåëåíûé */glVertex3f (1.0 , 0.0 , 0 . 0 ) ;g l C o l o r 3 f v ( BlueCol ) ; /* ñèíèé */glVertex3f (1.0 , 1.0 , 0 . 0 ) ;glEnd ( ) ;Êàê ïðàâèëî, ðàçíûå òèïû ïðèìèòèâîâ èìåþò ðàçëè÷íóþñêîðîñòü âèçóàëèçàöèè íà ðàçíûõ ïëàòôîðìàõ. Äëÿ óâåëè÷åíèÿïðîèçâîäèòåëüíîñòè ïðåäïî÷òèòåëüíåå èñïîëüçîâàòü ïðèìèòèâû, òðåáóþùèå ìåíüøåå êîëè÷åñòâî èíôîðìàöèè äëÿ ïåðåäà÷èíà ñåðâåð, òàêèå êàêGL_TRIAGLE_FAN.GL_TRIANGLE_STRIP, GL_QUAD_STRIP,Êðîìå çàäàíèÿ ñàìèõ ìíîãîóãîëüíèêîâ, ìîæíî îïðåäåëèòüìåòîä èõ îòîáðàæåíèÿ íà ýêðàíå.
Îäíàêî ñíà÷àëà íàäî îïðåäåëèòü ïîíÿòèå ëèöåâûõ è îáðàòíûõ ãðàíåé.Ïîä ãðàíüþ ïîíèìàåòñÿ îäíà èç ñòîðîí ìíîãîóãîëüíèêà, èïî óìîë÷àíèþ ëèöåâîé ñ÷èòàåòñÿ òà ñòîðîíà, âåðøèíû êîòîðîéîáõîäÿòñÿ ïðîòèâ ÷àñîâîé ñòðåëêè. Íàïðàâëåíèå îáõîäà âåðøèíëèöåâûõ ãðàíåé ìîæíî èçìåíèòü âûçîâîì êîìàíäûvoid glFrontFace (GLenum mode )ñî çíà÷åíèåì ïàðàìåòðà mode ðàâíûìGL_CW (clockwise), à âåðGL_CCW (counter-íóòü çíà÷åíèå ïî óìîë÷àíèþ ìîæíî, óêàçàâclockwise).×òîáû èçìåíèòü ìåòîä îòîáðàæåíèÿ ìíîãîóãîëüíèêà èñïîëüçóåòñÿ êîìàíäàvoid glPolygonMode (GLenum f a c e , Glenum mode )Ãëàâà 3. Ðèñîâàíèå ãåîìåòðè÷åñêèõ îáúåêòîâ46Ïàðàìåòðmodeîïðåäåëÿåò êàê áóäóò îòîáðàæàòüñÿ ìíîãî-óãîëüíèêè, à ïàðàìåòðfaceóñòàíàâëèâàåò òèï ìíîãîóãîëüíèêîâ,ê êîòîðûì áóäåò ïðèìåíÿòüñÿ ýòà êîìàíäà è ìîæåò ïðèíèìàòüñëåäóþùèå çíà÷åíèÿ:GL_FRONT äëÿ ëèöåâûõ ãðàíåé; äëÿ îáðàòíûõ ãðàíåé;GL_BACKGL_FRONT_AND_BACKÏàðàìåòðmodeGL_POINTGL_LINE äëÿ âñåõ ãðàíåé.ìîæåò áûòü ðàâåí: îòîáðàæåíèå òîëüêî âåðøèí ìíîãîóãîëüíèêîâ; ìíîãîóãîëüíèêè áóäóò ïðåäñòàâëÿòüñÿ íàáîðîìîòðåçêîâ;GL_FILL ìíîãîóãîëüíèêè áóäóò çàêðàøèâàòüñÿ òåêóùèìöâåòîì ñ ó÷åòîì îñâåùåíèÿ, è ýòîò ðåæèì óñòàíîâëåí ïîóìîë÷àíèþ.Òàêæå ìîæíî óêàçûâàòü êàêîé òèï ãðàíåé îòîáðàæàòü íàýêðàíå.
Äëÿ ýòîãî ñíà÷àëà íàäî óñòàíîâèòü ñîîòâåòñòâóþùèé ðåæèì âûçîâîì êîìàíäûglEnable (GL_CULL_FACE),à çàòåì âû-áðàòü òèï îòîáðàæàåìûõ ãðàíåé ñ ïîìîùüþ êîìàíäûvoid g l C u l l F a c e (GLenum mode )Âûçîâ ñ ïàðàìåòðîìGL_FRONTïðèâîäèò ê óäàëåíèþ èçèçîáðàæåíèÿ âñåõ ëèöåâûõ ãðàíåé, à ñ ïàðàìåòðîìGL_BACK îáðàòíûõ (óñòàíîâêà ïî óìîë÷àíèþ).Êðîìå ðàññìîòðåííûõ ñòàíäàðòíûõ ïðèìèòèâîâ â áèáëèîòåêàõ GLU è GLUT îïèñàíû áîëåå ñëîæíûå ôèãóðû, òàêèå êàêñôåðà, öèëèíäð, äèñê (â GLU) è ñôåðà, êóá, êîíóñ, òîð, òåòðàýäð, äîäåêàýäð, èêîñàýäð, îêòàýäð è ÷àéíèê (â GLUT). Àâòîìàòè÷åñêîå íàëîæåíèå òåêñòóðû ïðåäóñìîòðåíî òîëüêî äëÿ ôèãóðèç áèáëèîòåêè GLU (ñîçäàíèå òåêñòóð â OpenGL áóäåò ðàññìàòðèâàòüñÿ â ãëàâå 6).3.4. Äèñïëåéíûå ñïèñêè47Íàïðèìåð, ÷òîáû íàðèñîâàòü ñôåðó èëè öèëèíäð, íàäî ñíà÷àëà ñîçäàòü îáúåêò ñïåöèàëüíîãî òèïàGLUquadricObjñ ïîìîùüþêîìàíäûGLUquadricObj * gluNewQuadric ( void ) ;à çàòåì âûçâàòü ñîîòâåòñòâóþùóþ êîìàíäó:void gluSphere ( GLUquadricObj* qobj ,GLdouble radius ,GLint s l i c e s ,GLint s t a c k s )void g l u C y l i n d e r ( GLUquadricObj* qobj ,GLdouble baseRadius ,GLdouble topRadius ,GLdouble height ,GLint s l i c e s ,GLint s t a c k s )ãäå ïàðàìåòðstacks âäîëüslicesçàäàåò êîëè÷åñòâî ðàçáèåíèé âîêðóã îñè z, àîñè z.Áîëåå ïîäðîáíóþ èíôîðìàöèþ îá ýòèõ è äðóãèõ êîìàíäàõïîñòðîåíèÿ ïðèìèòèâîâ ìîæíî íàéòè â ïðèëîæåíèè À.3.4.