Баяковский.Начальный курс OpenGL (1124482), страница 4
Текст из файла (страница 4)
Âåðøèíà îïðåäåëÿåò òî÷êó, êîíåö îòðåçêà èëè óãîëìíîãîóãîëüíèêà. Ñ êàæäîé âåðøèíîé àññîöèèðóþòñÿ íåêîòîðûåäàííûå (êîîðäèíàòû, öâåò, íîðìàëü, òåêñòóðíûå êîîðäèíàòû èò.ä.), íàçûâàåìûå àòðèáóòàìè.  ïîäàâëÿþùåì áîëüøèíñòâå ñëó÷àåâ êàæäàÿ âåðøèíà îáðàáàòûâàåòñÿ íåçàâèñèìî îò äðóãèõ.Ñ òî÷êè çðåíèÿ àðõèòåêòóðû, ãðàôè÷åñêàÿ ñèñòåìà OpenGLÿâëÿåòñÿ êîíâåéåðîì, ñîñòîÿùèì èç íåñêîëüêèõ ïîñëåäîâàòåëüíûõ ýòàïîâ îáðàáîòêè ãðàôè÷åñêèõ äàííûõ.Êîìàíäû OpenGL âñåãäà îáðàáàòûâàþòñÿ â òîì ïîðÿäêå, âêîòîðîì îíè ïîñòóïàþò, õîòÿ ìîãóò ïðîèñõîäèòü çàäåðæêè ïåðåä òåì, êàê ïðîÿâèòñÿ ýôôåêò îò èõ âûïîëíåíèÿ.  áîëüøèíñòâå ñëó÷àåâ OpenGL ïðåäîñòàâëÿåò íåïîñðåäñòâåííûé èíòåðôåéñ, ò.å.
îïðåäåëåíèå îáúåêòà âûçûâàåò åãî âèçóàëèçàöèþ â áóôåðå êàäðà.Ñ òî÷êè çðåíèÿ ðàçðàáîò÷èêîâ, OpenGL ýòî íàáîð êîìàíä,2.3. Àðõèòåêòóðà OPENGL29êîòîðûå óïðàâëÿþò èñïîëüçîâàíèåì ãðàôè÷åñêîé àïïàðàòóðû.Åñëè àïïàðàòóðà ñîñòîèò òîëüêî èç àäðåñóåìîãî áóôåðà êàäðà,òîãäà OpenGL äîëæåí áûòü ðåàëèçîâàí ïîëíîñòüþ ñ èñïîëüçîâàíèåì ðåñóðñîâ öåíòðàëüíîãî ïðîöåññîðà.
Îáû÷íî ãðàôè÷åñêàÿàïïàðàòóðà ïðåäîñòàâëÿåò ðàçëè÷íûå óðîâíè óñêîðåíèÿ: îò àïïàðàòíîé ðåàëèçàöèè âûâîäà ëèíèé è ìíîãîóãîëüíèêîâ äî èçîùðåííûõ ãðàôè÷åñêèõ ïðîöåññîðîâ ñ ïîääåðæêîé ðàçëè÷íûõ îïåðàöèé íàä ãåîìåòðè÷åñêèìè äàííûìè.Ðèñ. 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 âûçûâàåò ýòó ôóíêöèþ, êîãäà îïåðàöèîííàÿ ñèñòåìà èíôîðìèðóåò ïðèëîæåíèå î òîì, ÷òî ñîäåðæèìîå îêíà íåîáõîäèìîïåðåðèñîâàòü (íàïðèìåð, åñëè îêíî áûëî ïåðåêðûòî äðóãèì).Ñîçäàâàåìîå èçîáðàæåíèå ìîæåò áûòü êàê ñòàòè÷íûì, òàê èàíèìèðîâàííûì, ò.å.