Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 4
Текст из файла (страница 4)
Îáû÷íî ãðàôè÷åñêàÿàïïàðàòóðà ïðåäîñòàâëÿåò ðàçëè÷íûå óðîâíè óñêîðåíèÿ: îò àïïàðàòíîé ðåàëèçàöèè âûâîäà ëèíèé è ìíîãîóãîëüíèêîâ äî èçîùðåííûõ ãðàôè÷åñêèõ ïðîöåññîðîâ ñ ïîääåðæêîé ðàçëè÷íûõ îïåðàöèé íàä ãåîìåòðè÷åñêèìè äàííûìè.Ðèñ. 2.2. Ôóíêöèîíèðîâàíèå êîíâåéåðà OpenGLOpenGL ÿâëÿåòñÿ ïðîñëîéêîé ìåæäó àïïàðàòóðîé è ïîëüçîâàòåëüñêèì óðîâíåì, ÷òî ïîçâîëÿåò ïðåäîñòàâëÿòü åäèíûé èíòåðôåéñ íà ðàçíûõ ïëàòôîðìàõ, èñïîëüçóÿ âîçìîæíîñòè àïïàðàòíîé ïîääåðæêè.Êðîìå òîãî, OpenGL ìîæíî ðàññìàòðèâàòü êàê êîíå÷íûé àâ-Ãëàâà 2.
Ââåäåíèå â OPENGL30òîìàò, ñîñòîÿíèå êîòîðîãî îïðåäåëÿåòñÿ ìíîæåñòâîì çíà÷åíèéñïåöèàëüíûõ ïåðåìåííûõ, çíà÷åíèÿìè òåêóùåé íîðìàëè, öâåòà,êîîðäèíàò òåêñòóðû è äðóãèõ àòðèáóòîâ è ïðèçíàêîâ. Âñÿ ýòà èíôîðìàöèÿ áóäåò èñïîëüçîâàíà ïðè ïîñòóïëåíèè â ãðàôè÷åñêóþñèñòåìó êîîðäèíàò âåðøèíû äëÿ ïîñòðîåíèÿ ôèãóðû, â êîòîðóþîíà âõîäèò. Ñìåíà ñîñòîÿíèé ïðîèñõîäèò ñ ïîìîùüþ êîìàíä, êîòîðûå îôîðìëÿþòñÿ êàê âûçîâû ôóíêöèé.2.4. Ñèíòàêñèñ êîìàíäÎïðåäåëåíèÿ êîìàíä GL íàõîäÿòñÿ â ôàéëå gl.h, äëÿ âêëþ÷åíèÿ êîòîðîãî íóæíî íàïèñàòü#include <g l / g l . h>Äëÿ ðàáîòû ñ áèáëèîòåêîé GLU íóæíî àíàëîãè÷íî ïîäêëþ÷èòü ôàéë glu.h.
Âåðñèè ýòèõ áèáëèîòåê, êàê ïðàâèëî, âêëþ÷àþòñÿ â äèñòðèáóòèâû ñèñòåì ïðîãðàììèðîâàíèÿ, íàïðèìåð,Microsoft Visual C++ èëè Borland C++ Builder.  îòëè÷èå îòñòàíäàðòíûõ áèáëèîòåê, ïàêåò GLUT íóæíî èíñòàëëèðîâàòü èïîäêëþ÷àòü îòäåëüíî. Ïîäðîáíàÿ èíôîðìàöèÿ î íàñòðîéêå ñðåäïðîãðàììèðîâàíèÿ äëÿ ðàáîòû ñ OpenGL ïðèâåäåíà â ×àñòè III.Âñå êîìàíäû (ïðîöåäóðû è ôóíêöèè) áèáëèîòåêè GL íà÷èíàþòñÿ ñ ïðåôèêñà gl, âñå êîíñòàíòû ñ ïðåôèêñà GL_. Ñîîòâåòñòâóþùèå êîìàíäû è êîíñòàíòû áèáëèîòåê GLU è GLUT àíàëîãè÷íî èìåþò ïðåôèêñû glu (GLU_) è glut (GLUT_) Êðîìåòîãî, â èìåíà êîìàíä âõîäÿò ñóôôèêñû, íåñóùèå èíôîðìàöèþ î÷èñëå è òèïå ïåðåäàâàåìûõ ïàðàìåòðîâ.
 OpenGL ïîëíîå èìÿêîìàíäû èìååò âèä:type glCommand_name [ 1 2 3 4 ] [ b s i f d ub us u i ] [ v ]( type1 arg1 ,. . ., typeN argN )Èìÿ ñîñòîèò èç íåñêîëüêèõ ÷àñòåé:2.5. Ïðèìåð ïðèëîæåíèÿgl31 èìÿ áèáëèîòåêè, â êîòîðîé îïèñàíà ýòà ôóíêöèÿ: äëÿ áàçîâûõ ôóíêöèé OpenGL, ôóíêöèé èç áèáëèîòåê GL, GLU,GLUT, GLAUX ýòî gl, glu, glut, aux ñîîòâåòñòâåííî;Command_name èìÿ êîìàíäû (ïðîöåäóðû èëè ôóíêöèè);[1 2 3 4 ] ÷èñëî àðãóìåíòîâ êîìàíäû;[b s i f d ub us ui ] òèï àðãóìåíòà: ñèìâîë b GLbyte (àíà-ëîã char â Ñ/Ñ++), ñèìâîë i GLint (àíàëîã int), ñèìâîëf GLoat (àíàëîã oat) è òàê äàëåå. Ïîëíûé ñïèñîê òèïîâè èõ îïèñàíèå ìîæíî ïîñìîòðåòü â ôàéëå gl.h;[v ] íàëè÷èå ýòîãî ñèìâîëà ïîêàçûâàåò, ÷òî â êà÷åñòâå ïàðà-ìåòðîâ ôóíêöèè èñïîëüçóåòñÿ óêàçàòåëü íà ìàññèâ çíà÷åíèé.Ñèìâîëû â êâàäðàòíûõ ñêîáêàõ â íåêîòîðûõ íàçâàíèÿõ íåèñïîëüçóþòñÿ.
Íàïðèìåð, êîìàíäàglVertex2i()îïèñàíà â áèáëèî-òåêå GL è èñïîëüçóåò â êà÷åñòâå ïàðàìåòðîâ äâà öåëûõ ÷èñëà, àêîìàíäàglColor3fv()èñïîëüçóåò â êà÷åñòâå ïàðàìåòðà óêàçàòåëüíà ìàññèâ èç òðåõ âåùåñòâåííûõ ÷èñåë.Èñïîëüçîâàíèÿ íåñêîëüêèõ âàðèàíòîâ êàæäîé êîìàíäû ìîæíî ÷àñòè÷íî èçáåæàòü, ïðèìåíÿÿ ïåðåãðóçêó ôóíêöèé ÿçûêàC++. Íî èíòåðôåéñ OpenGL íå ðàññ÷èòàí íà êîíêðåòíûé ÿçûêïðîãðàììèðîâàíèÿ, è, ñëåäîâàòåëüíî, äîëæåí áûòü ìàêñèìàëüíîóíèâåðñàëåí.2.5. Ïðèìåð ïðèëîæåíèÿÒèïè÷íàÿ ïðîãðàììà, èñïîëüçóþùàÿ OpenGL, íà÷èíàåòñÿ ñîïðåäåëåíèÿ îêíà, â êîòîðîì áóäåò ïðîèñõîäèòü îòîáðàæåíèå.Çàòåì ñîçäàåòñÿ êîíòåêñò (êëèåíò) OpenGL è àññîöèèðóåòñÿ ñýòèì îêíîì.
Äàëåå ïðîãðàììèñò ìîæåò ñâîáîäíî èñïîëüçîâàòüêîìàíäû OpenGL API.Ãëàâà 2. Ââåäåíèå â OPENGL32Íèæå ïðèâåäåí òåêñò íåáîëüøîé ïðîãðàììû, íàïèñàííîé ñèñïîëüçîâàíèåì áèáëèîòåêè GLUT ñâîåîáðàçíûé àíàëîã êëàññè÷åñêîãî ïðèìåðà ¾Hello, World!¿.Âñå, ÷òî äåëàåò ýòà ïðîãðàììà ðèñóåò â öåíòðå îêíà êðàñíûé êâàäðàò. Òåì íå ìåíåå, äàæå íà ýòîì ïðîñòîì ïðèìåðå ìîæíîïîíÿòü ïðèíöèïû ïðîãðàììèðîâàíèÿ ñ ïîìîùüþ OpenGL.Ïðîãðàììà 2.1.
Ïðîñòåéøèé ïðèìåð OpenGL.#include <s t d l i b . h>// ïîäêëþ÷àåì áèáëèîòåêó GLUT#include <g l / g l u t . h>// íà÷àëüíàÿ øèðèíà è âûñîòà îêíàGLint Width = 512 , Height = 5 1 2 ;// ðàçìåð êóáàconst int CubeSize = 2 0 0 ;// ýòà ôóíêöèÿ óïðàâëÿåò âñåì âûâîäîì íà ýêðàívoid Display ( void ){int l e f t , r i g h t , top , bottom ;l e f t = ( Width − CubeSize ) / 2 ;r i g h t = l e f t + CubeSize ;bottom = ( Height − CubeSize ) / 2 ;top = bottom + CubeSize ;glClearColor (0.7 , 0.7 , 0.7 , 1);g l C l e a r (GL_COLOR_BUFFER_BIT) ;glColor3ub ( 2 5 5 , 0 , 0 ) ;g l B e g i n (GL_QUADS) ;g l V e r t e x 2 f ( l e f t , bottom ) ;g l V e r t e x 2 f ( l e f t , top ) ;g l V e r t e x 2 f ( r i g h t , top ) ;g l V e r t e x 2 f ( r i g h t , bottom ) ;2.5. Ïðèìåð ïðèëîæåíèÿglEnd ( ) ;}glFinish ();// Ôóíêöèÿ âûçûâàåòñÿ ïðè èçìåíåíèè ðàçìåðîâ îêíàvoid Reshape ( GLint w, GLint h ){Width = w;Height = h ;/* óñòàíàâëèâàåì ðàçìåðû îáëàñòè îòîáðàæåíèÿ */glViewport ( 0 , 0 , w, h ) ;/* îðòîãðàôè÷åñêàÿ ïðîåêöèÿ */glMatrixMode (GL_PROJECTION) ;glLoadIdentity ( ) ;glOrtho ( 0 , w, 0 , h , − 1.0 , 1 .
0 ) ;}glMatrixMode (GL_MODELVIEW) ;glLoadIdentity ( ) ;// Ôóíêöèÿ îáðàáàòûâàåò ñîîáùåíèÿ îò êëàâèàòóðûvoid Keyboard ( unsigned char key , int x , int y ){const char ESCAPE = ' \033 ' ;i f ( key == ESCAPE )}exit (0);// Ãëàâíûé öèêë ïðèëîæåíèÿ* argv [ ] )void main ( int argc , char{g l u t I n i t (&argc , argv ) ;33Ãëàâà 2. Ââåäåíèå â OPENGL34g l u t I n i t D i s p l a y M o d e (GLUT_RGB) ;glutInitWindowSize ( Width , Height ) ;glutCreateWindow ( "Red square example " ) ;glutDisplayFunc ( Display ) ;glutReshapeFunc ( Reshape ) ;glutKeyboardFunc ( Keyboard ) ;}glutMainLoop ( ) ;Ðèñ. 2.3. Ðåçóëüòàò ðàáîòû ïðîãðàììû 2.1.Íåñìîòðÿ íà ìàëûé ðàçìåð, ýòî ïîëíîñòüþ çàâåðøåííàÿ ïðîãðàììà, êîòîðàÿ äîëæíà êîìïèëèðîâàòüñÿ è ðàáîòàòü íà ëþáîéñèñòåìå, ïîääåðæèâàþùåé OpenGL è GLUT.Áèáëèîòåêà GLUT ïîääåðæèâàåò âçàèìîäåéñòâèå ñ ïîëüçîâàòåëåì ñ ïîìîùüþ òàê íàçûâàåìûõ ôóíêöèé c îáðàòíûì âûçîâîì(callback function).
Åñëè ïîëüçîâàòåëü ïîäâèíóë ìûøü, íàæàë íàêíîïêó êëàâèàòóðû èëè èçìåíèë ðàçìåðû îêíà, ïðîèñõîäèò ñîáûòèå è âûçûâàåòñÿ ñîîòâåòñòâóþùàÿ ôóíêöèÿ ïîëüçîâàòåëÿ îáðàáîò÷èê ñîáûòèé (ôóíêöèÿ ñ îáðàòíûì âûçîâîì).Ðàññìîòðèì áîëåå ïîäðîáíî ôóíêöèþmain äàííîãî ïðèìåðà.2.5. Ïðèìåð ïðèëîæåíèÿ35Îíà ñîñòîèò èç òðåõ ÷àñòåé: èíèöèàëèçàöèè îêíà, â êîòîðîì áóäåò ðèñîâàòü OpenGL, íàñòðîéêè ôóíêöèé c îáðàòíûì âûçîâîìè ãëàâíîãî öèêëà îáðàáîòêè ñîáûòèé.Èíèöèàëèçàöèÿ îêíà ñîñòîèò èç íàñòðîéêè ñîîòâåòñòâóþùèõáóôåðîâ êàäðà, íà÷àëüíîãî ïîëîæåíèÿ è ðàçìåðîâ îêíà, à òàêæåçàãîëîâêà îêíà.ÔóíêöèÿglutInit (&argc, argv)ïðîèçâîäèò íà÷àëüíóþ èíèöèà-ëèçàöèþ ñàìîé áèáëèîòåêè GLUT.ÊîìàíäàglutInitDisplayMode(GLUT_RGB) èíèöèàëèçèðóåò áó-ôåð êàäðà è íàñòðàèâàåò ïîëíîöâåòíûé (íåïàëèòðîâûé) ðåæèìRGB.glutInitWindowSize(Width, Height) èñïîëüçóåòñÿ äëÿ çàäàíèÿ íà-÷àëüíûõ ðàçìåðîâ îêíà.Íàêîíåö,glutCreateWindow("Red square example")çàäàåò çàãî-ëîâîê îêíà è âèçóàëèçèðóåò ñàìî îêíî íà ýêðàíå.Çàòåì êîìàíäûglutDisplayFunc ( Display ) ;glutReshapeFunc ( Reshape ) ;glutKeyboardFunc ( Keyboard ) ;ðåãèñòðèðóþò ôóíêöèèDisplay(), Reshape() è Keyboard() êàê ôóíê-öèè, êîòîðûå áóäóò âûçâàíû, ñîîòâåòñòâåííî, ïðè ïåðåðèñîâêåîêíà, èçìåíåíèè ðàçìåðîâ îêíà, íàæàòèè êëàâèøè íà êëàâèàòóðå.Êîíòðîëü âñåõ ñîáûòèé è âûçîâ íóæíûõ ôóíêöèé ïðîèñõîäèòâíóòðè áåñêîíå÷íîãî öèêëà â ôóíêöèèglutMainLoop().Çàìåòèì, ÷òî áèáëèîòåêà GLUT íå âõîäèò â ñîñòàâ OpenGL,à ÿâëÿåòñÿ ëèøü ïåðåíîñèìîé ïðîñëîéêîé ìåæäó OpenGL èîêîííîé ïîäñèñòåìîé, ïðåäîñòàâëÿÿ ìèíèìàëüíûé èíòåðôåéñ.OpenGL-ïðèëîæåíèå äëÿ êîíêðåòíîé ïëàòôîðìû ìîæåò áûòüíàïèñàíî ñ èñïîëüçîâàíèåì ñïåöèôè÷åñêèõ äëÿ ïëàòôîðìû API(Win32, X Window è ò.ä.), êîòîðûå êàê ïðàâèëî ïðåäîñòàâëÿþòáîëåå øèðîêèå âîçìîæíîñòè.
Áîëåå ïîäðîáíî ðàáîòà ñ áèáëèîòåêîé GLUT îïèñàíà â ãëàâå 10.Ãëàâà 2. Ââåäåíèå â OPENGL36Âñå âûçîâû êîìàíä OpenGL ïðîèñõîäÿò â îáðàáîò÷èêàõ ñîáûòèé. Áîëåå ïîäðîáíî îíè áóäóò ðàññìîòðåíû â ñëåäóþùèõ ãëàâàõ. Ñåé÷àñ îáðàòèì âíèìàíèå íà ôóíêöèþDisplay,â êîòîðîéñîñðåäîòî÷åí êîä, íåïîñðåäñòâåííî îòâå÷àþùèé çà ðèñîâàíèå íàýêðàíå.Ñëåäóþùàÿ ïîñëåäîâàòåëüíîñòü êîìàíä èç ôóíêöèèDisplay():glClearColor (0 , 0 , 0 , 1);g l C l e a r (GL_COLOR_BUFFER_BIT) ;glColor3ub ( 2 5 5 , 0 , 0 ) ;g l B e g i n (GL_QUADS) ;g l V e r t e x 2 f ( l e f t , bottom ) ;g l V e r t e x 2 f ( l e f t , top ) ;g l V e r t e x 2 f ( r i g h t , top ) ;g l V e r t e x 2 f ( r i g h t , bottom ) ;glEnd ( ) ;î÷èùàåò îêíî è âûâîäèò íà ýêðàí êâàäðàò, çàäàâàÿ êîîðäèíàòû÷åòûðåõ óãëîâûõ âåðøèí è öâåò. ïðèëîæåíèè Á ïðèâåäåí åùå îäèí ïðèìåð íåñëîæíîé ïðîãðàììû, ïðè íàæàòèè êíîïêó ìûøè ðèñóþùåé íà ýêðàíå ðàçíîöâåòíûå ñëó÷àéíûå ïðÿìîóãîëüíèêè.2.6.
Êîíòðîëüíûå âîïðîñû1)  ÷åì, ïî âàøåìó ìíåíèþ, çàêëþ÷àåòñÿ íåîáõîäèìîñòü ñîçäàíèÿ ñòàíäàðòíîé ãðàôè÷åñêîé áèáëèîòåêè?2) Êðàòêî îïèøèòå àðõèòåêòóðó áèáëèîòåê OpenGL è îðãàíèçàöèþ êîíâåéåðà.3)  ÷åì çàêëþ÷àþòñÿ ôóíêöèè áèáëèîòåê, ïîäîáíûõ GLUTèëè GLX? Ïî÷åìó îíè ôîðìàëüíî íå âõîäÿò â OpenGL?4) Íàçîâèòå êàòåãîðèè êîìàíä (ôóíêöèé) áèáëèîòåêè.2.6. Êîíòðîëüíûå âîïðîñû375) Ïî÷åìó îðãàíèçàöèþ OpenGL ÷àñòî ñðàâíèâàþò ñ êîíå÷íûì àâòîìàòîì?6) Çà÷åì íóæíû ðàçëè÷íûå âàðèàíòû êîìàíä OpenGL, îòëè÷àþùèåñÿ òîëüêî òèïàìè ïàðàìåòðîâ?7) ×òî ìîæíî ñêàçàòü î êîëè÷åñòâå è òèïå ïàðàìåòðîâ êîìàíäûglColor4ub()? glVertex3fv() ?Ãëàâà 3.Ðèñîâàíèå ãåîìåòðè÷åñêèõîáúåêòîâ3.1.
Ïðîöåññ îáíîâëåíèÿ èçîáðàæåíèÿÊàê ïðàâèëî, çàäà÷åé ïðîãðàììû, èñïîëüçóþùåé OpenGL,ÿâëÿåòñÿ îáðàáîòêà òðåõìåðíîé ñöåíû è èíòåðàêòèâíîå îòîáðàæåíèå â áóôåðå êàäðà. Ñöåíà ñîñòîèò èç íàáîðà òðåõìåðíûõ îáúåêòîâ, èñòî÷íèêîâ ñâåòà è âèðòóàëüíîé êàìåðû, îïðåäåëÿþùåéòåêóùåå ïîëîæåíèå íàáëþäàòåëÿ.Îáû÷íî ïðèëîæåíèå OpenGL â áåñêîíå÷íîì öèêëå âûçûâàåòôóíêöèþ îáíîâëåíèÿ èçîáðàæåíèÿ â îêíå.
 ýòîé ôóíêöèè èñîñðåäîòî÷åíû âûçîâû îñíîâíûõ êîìàíä OpenGL. Åñëè èñïîëüçóåòñÿ áèáëèîòåêà GLUT, òî ýòî áóäåò ôóíêöèÿ ñ îáðàòíûì âûçîâîì, çàðåãèñòðèðîâàííàÿ ñ ïîìîùüþ âûçîâà glutDisplayFunc().GLUT âûçûâàåò ýòó ôóíêöèþ, êîãäà îïåðàöèîííàÿ ñèñòåìà èíôîðìèðóåò ïðèëîæåíèå î òîì, ÷òî ñîäåðæèìîå îêíà íåîáõîäèìîïåðåðèñîâàòü (íàïðèìåð, åñëè îêíî áûëî ïåðåêðûòî äðóãèì).Ñîçäàâàåìîå èçîáðàæåíèå ìîæåò áûòü êàê ñòàòè÷íûì, òàê èàíèìèðîâàííûì, ò.å. çàâèñåòü îò êàêèõ-ëèáî ïàðàìåòðîâ, èçìåíÿþùèõñÿ ñî âðåìåíåì.  ýòîì ñëó÷àå ëó÷øå âûçûâàòü ôóíê39Ãëàâà 3. Ðèñîâàíèå ãåîìåòðè÷åñêèõ îáúåêòîâ40öèþ îáíîâëåíèÿ ñàìîñòîÿòåëüíî. Íàïðèìåð, ñ ïîìîùüþ êîìàíäûglutPostRedisplay().Çà áîëåå ïîäðîáíîé èíôîðìàöèåé ìîæíîîáðàòèòüñÿ ê ãëàâå 10.Ïðèñòóïèì, íàêîíåö, ê òîìó, ÷åì çàíèìàåòñÿ òèïè÷íàÿ ôóíêöèÿ îáíîâëåíèÿ èçîáðàæåíèÿ.