Баяковский.Начальный курс OpenGL (1124482), страница 14
Текст из файла (страница 14)
×òîáû íå ïåðåäàâàòü â OpenGL äóáëè, óâåëè÷èâàÿ íàãðóçêó íà øèíó, èñïîëüçóéòå êîìàíäóglDrawElements().Çàäàâàéòå íåîáõîäèìûå ìàññèâû îäíîé êîìàíäîéÂìåñòî èñïîëüçîâàíèÿ êîìàíäglNormalPointerglVertexPointer, glColorPointer,ëó÷øå ïîëüçîâàòüñÿ îäíîé êîìàíäîévoid g l I n t e r l e a v e d A r r a y s ( G l i n t format ,Glsizei stride ,* ptr ) ;void9.2. Îïòèìèçàöèÿ âûçîâîâ OPENGL121Òàê, åñëè èìååòñÿ ñòðóêòóðàtypedef struct tag_VERTEX_DATA{float c o l o r [ 4 ] ;float normal [ 3 ] ;float v e r t e x [ 3 ] ;}VERTEX_DATA;VERTEX_DATA * pData ;òî ïàðàìåòðû ìîæíî ïåðåäàòü ñ ïîìîùüþ ñëåäóþùåé êîìàíäûg l I n t e r l e a v e d A r r a y s (GL_C4F_N3F_V3F, 0 , pData ) ;÷òî îçíà÷àåò, ÷òî ïåðâûå ÷åòûðåòðèoatoatê íîðìàëè, è ïîñëåäíèå òðèîòíîñÿòñÿ ê öâåòó, çàòåìoatçàäàþò êîîðäèíàòûâåðøèíû. Áîëåå ïîäðîáíîå îïèñàíèå êîìàíäû ñìîòðèòå â ñïåöèôèêàöèè OpenGL.Õðàíèòå äàííûå î âåðøèíàõ â ïàìÿòè ïîñëåäîâàòåëüíîÏîñëåäîâàòåëüíîå ðàñïîëîæåíèå äàííûõ â ïàìÿòè óëó÷øàåòñêîðîñòü îáìåíà ìåæäó îñíîâíîé ïàìÿòüþ è ãðàôè÷åñêîé ïîäñèñòåìîé.Èñïîëüçóéòå âåêòîðíûå âåðñèèglTexCoord.ÔóíêöèèglVertex, glColorglVertex, glColor, glNormalèè ò.ä., êîòîðûå â êà÷åñòâå àðãó-ìåíòîâ ïðèíèìàþò óêàçàòåëè (íàïðèìåð,glVertex3fv(v)),ìîãóòðàáîòàòü çíà÷èòåëüíî áûñòðåå, ÷åì èõ ñîîòâåòñòâóþùèå âåðñèèglVertex3f(x,y,z).Óìåíüøàéòå ñëîæíîñòü ïðèìèòèâîâÂî ìíîãèõ ñëó÷àÿõ áóäüòå âíèìàòåëüíû, ÷òîáû íå ðàçáèâàòüáîëüøèå ïëîñêîñòè íà ÷àñòè ñèëüíåå, ÷åì íåîáõîäèìî.
Ïîýêñïåðèìåíòèðóéòå, íàïðèìåð, ñ ïðèìèòèâàìè GLU äëÿ îïðåäåëåíèÿ íàèëó÷øåãî ñîîòíîøåíèÿ êà÷åñòâà è ïðîèçâîäèòåëüíîñòè.Ãëàâà 9. Îïòèìèçàöèÿ ïðîãðàìì122Òåêñòóðèðîâàííûå îáúåêòû, íàïðèìåð, ìîãóò áûòü êà÷åñòâåííîîòîáðàæåíû ñ íåáîëüøîé ñëîæíîñòüþ ãåîìåòðèè.Èñïîëüçóéòå äèñïëåéíûå ñïèñêèÈñïîëüçóéòå äèñïëåéíûå ñïèñêè äëÿ íàèáîëåå ÷àñòî âûâîäèìûõ îáúåêòîâ. Äèñïëåéíûå ñïèñêè ìîãóò õðàíèòüñÿ â ïàìÿòè ãðàôè÷åñêîé ïîäñèñòåìû è, ñëåäîâàòåëüíî, èñêëþ÷àòü ÷àñòûåïåðåìåùåíèÿ äàííûõ èç îñíîâíîé ïàìÿòè.Íå óêàçûâàéòå íåíóæíûå àòðèáóòû âåðøèíglNormal. ÅñëèglTexCoord, è ò.ä.Åñëè îñâåùåíèå âûêëþ÷åíî, íå âûçûâàéòåèñïîëüçóþòñÿ òåêñòóðû, íå âûçûâàéòåíåÌèíèìèçèðóéòå êîëè÷åñòâî ëèøíåãî êîäà ìåæäó îïåðàòîðíûìè ñêîáêàìèglBegin/glEndÄëÿ ìàêñèìàëüíîé ïðîèçâîäèòåëüíîñòè íà high-end ñèñòåìàõâàæíî, ÷òîáû èíôîðìàöèÿ î âåðøèíàõ áûëà ïåðåäàíà ãðàôè÷åñêîé ïîäñèñòåìå ìàêñèìàëüíî áûñòðî.
Èçáåãàéòå ëèøíåãî êîäàìåæäóglBegin/glEnd.Ïðèìåð íåóäà÷íîãî ðåøåíèÿ:g l B e g i n (GL_TRIANGLE_STRIP) ;for ( i =0; i < n ; i ++){if ( lighting ){glNormal3fv ( norm [ i ] ) ;}glVertex3fv ( vert [ i ] ) ;}glEnd ( ) ;9.2. Îïòèìèçàöèÿ âûçîâîâ OPENGL123Ýòà êîíñòðóêöèÿ ïëîõà òåì, ÷òî ìû ïðîâåðÿåì ïåðåìåííóþlightingïåðåä êàæäîé âåðøèíîé. Ýòîãî ìîæíî èçáåæàòü, çà ñ÷åò÷àñòè÷íîãî äóáëèðîâàíèÿ êîäà:if ( lighting ){g l B e g i n (GL_TRIANGLE_STRIP) ;for ( i =0; i < n ; i ++){}glNormal3fv ( norm [ i ] ) ;glVertex3fv ( vert [ i ] ) ;}glEnd ( ) ;else{g l B e g i n (GL_TRIANGLE_STRIP) ;for ( i =0; i < n ; i ++){}glVertex3fv ( vert [ i ] ) ;}glEnd ( ) ;9.2.2.
ÏðåîáðàçîâàíèÿÏðåîáðàçîâàíèÿ âêëþ÷àþò â ñåáÿ òðàíñôîðìàöèè âåðøèí îòêîîðäèíàò, óêàçàííûõ âglVertex,ê îêîííûì êîîðäèíàòàì, îòñå-÷åíèå, îñâåùåíèå è ò.ä.ÎñâåùåíèåÈçáåãàéòå èñïîëüçîâàíèÿ òî÷å÷íûõ èñòî÷íèêîâ ñâåòà.Èçáåãàéòå èñïîëüçîâàíèÿ äâóõñòîðîííåãî îñâåùåíèÿ (twosided lighting).Ãëàâà 9. Îïòèìèçàöèÿ ïðîãðàìì124Èçáåãàéòå èñïîëüçîâàíèÿ ëîêàëüíîé ìîäåëè îñâåùåíèÿ.Èçáåãàéòå ÷àñòîé ñìåíû ïàðàìåòðàGL_SHININESS.Ðàññìîòðèòå âîçìîæíîñòü çàðàíåå ïðîñ÷èòàòü îñâåùåíèå.Ìîæíî ïîëó÷èòü ýôôåêò îñâåùåíèÿ, çàäàâàÿ öâåòà âåðøèíâìåñòî íîðìàëåé.Îòêëþ÷àéòåíîðìàëèçàöèþâåêòîðîâíîðìàëåé,êîãäàýòî íå ÿâëÿåòñÿ íåîáõîäèìûìÊîìàíäàglEnable/Disable(GL_NORMALIZE) óïðàâëÿåò íîðìà-ëèçàöèåé âåêòîðîâ íîðìàëåé ïåðåä èñïîëüçîâàíèåì. Åñëè âû íåèñïîëüçóåòå êîìàíäóglScale , òî íîðìàëèçàöèþ ìîæíî îòêëþ÷èòüáåç ïîñòîðîííèõ ýôôåêòîâ.
Ïî óìîë÷àíèþ ýòà îïöèÿ âûêëþ÷åíà.Èñïîëüçóéòå ñâÿçàííûå ïðèìèòèâûÑâÿçàííûåïðèìèòèâû,òàêèåêàêGL_LINES,GL_LINE_LOOP, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN,è GL_QUAD_STRIP óìåíüøàþò íàãðóçêó íà êîíâåéåð OpenGL,à òàêæå óìåíüøàþò êîëè÷åñòâî äàííûõ, ïåðåäàâàåìûõ ãðàôè÷åñêîé ïîäñèñòåìå.9.2.3. ÐàñòåðèçàöèÿÐàñòåðèçàöèÿ ÷àñòî ÿâëÿåòñÿ óçêèì ìåñòîì ïðîãðàììíûõ ðåàëèçàöèé OpenGL.Îòêëþ÷àéòå òåñò íà ãëóáèíó, êîãäà â ýòîì íåò íåîáõîäèìîñòèÔîíîâûå îáúåêòû, íàïðèìåð, ìîãóò áûòü íàðèñîâàíû áåç òåñòà íà ãëóáèíó, åñëè îíè âèçóàëèçèðóåòñÿ ïåðâûìè.9.2.
Îïòèìèçàöèÿ âûçîâîâ OPENGL125Èñïîëüçóéòå îòñå÷åíèå îáðàòíûõ ãðàíåé ïîëèãîíîâÇàìêíóòûå îáúåêòû ìîãóò áûòü íàðèñîâàíû ñ óñòàíîâëåííûìðåæèìîì îòñå÷åíèÿ îáðàòíûõ ãðàíåéglEnable(GL_CULL_FACE)Èíîãäà ýòî ïîçâîëÿåò îòáðîñèòü äî ïîëîâèíû ìíîãîóãîëüíèêîâ,íå ðàñòåðèçóÿ èõ.Èçáåãàéòå ëèøíèõ îïåðàöèé ñ ïèêñåëÿìèÌàñêèðîâàíèå, àëüôà-ñìåøèâàíèå è äðóãèå ïîïèêñåëüíûåîïåðàöèè ìîãóò çàíèìàòü ñóùåñòâåííîå âðåìÿ íà ýòàïå ðàñòåðèçàöèè.
Îòêëþ÷àéòå âñå îïåðàöèè, êîòîðûå âû íå èñïîëüçóåòå.Óìåíüøàéòå ðàçìåð îêíà èëè ðàçðåøåíèå ýêðàíàÏðîñòîé ñïîñîá óìåíüøèòü âðåìÿ ðàñòåðèçàöèè óìåíüøèòü÷èñëî ïèêñåëåé, êîòîðûå áóäóò íàðèñîâàíû. Åñëè ìåíüøèå ðàçìåðû îêíà èëè ìåíüøåå ðàçðåøåíèå ýêðàíà ïðèåìëåìû, òî ýòîõîðîøèé ïóòü äëÿ óâåëè÷åíèÿ ñêîðîñòè ðàñòåðèçàöèè.9.2.4.
ÒåêñòóðèðîâàíèåÍàëîæåíèå òåêñòóð ÿâëÿåòñÿ äîðîãîé îïåðàöèåé, êàê â ïðîãðàììíûõ, òàê è â àïïàðàòíûõ ðåàëèçàöèÿõ.Èñïîëüçóéòå ýôôåêòèâíûå ôîðìàòû õðàíåíèÿ èçîáðàæåíèéÔîðìàòGL_UNSIGNED_BYTE îáû÷íî íàèáîëåå âñåãî ïîäõî-äèò äëÿ ïåðåäà÷è òåêñòóðû â OpenGL.Îáúåäèíÿéòå òåêñòóðû â òåêñòóðíûå îáúåêòû èëè äèñïëåéíûå ñïèñêè.Ýòî îñîáåííî âàæíî, åñëè âû èñïîëüçóåòå íåñêîëüêî òåêñòóð,è ïîçâîëÿåò ãðàôè÷åñêîé ïîäñèñòåìå ýôôåêòèâíî óïðàâëÿòüÃëàâà 9. Îïòèìèçàöèÿ ïðîãðàìì126ðàçìåùåíèåì òåêñòóð â âèäåîïàìÿòè.Íå èñïîëüçóéòå òåêñòóðû áîëüøîãî ðàçìåðàÍåáîëüøèå òåêñòóðû áûñòðåå îáðàáàòûâàþòñÿ è çàíèìàþòìåíüøå ïàìÿòè, ÷òî ïîçâîëÿåò õðàíèòü ñðàçó íåñêîëüêî òåêñòóðâ ïàìÿòè ãðàôè÷åñêîé ïîäñèñòåìû.Êîìáèíèðóéòå íåáîëüøèå òåêñòóðû â îäíóÅñëè âû èñïîëüçóåòå íåñêîëüêî ìàëåíüêèõ òåêñòóð, òî ìîæíîîáúåäèíèòü èõ â îäíó áîëüøåãî ðàçìåðà è èçìåíèòü òåêñòóðíûåêîîðäèíàòû äëÿ ðàáîòû ñ íóæíîé ïîäòåêñòóðîé. Ýòî ïîçâîëÿåòóìåíüøèòü ÷èñëî ïåðåêëþ÷åíèé òåêñòóð.Àíèìèðîâàííûå òåêñòóðûÅñëè âû õîòèòå èñïîëüçîâàòü àíèìèðîâàííûå òåêñòóðû, íåèñïîëüçóéòå êîìàíäóglTexImage2D÷òîáû îáíîâëÿòü îáðàç òåê-ñòóðû.
Âìåñòî ýòîãî ðåêîìåíäóåòñÿ âûçûâàòüèëèglTexCopyTexSubImage2D.glTexSubImage2D9.2.5. Î÷èñòêà áóôåðîâÎ÷èñòêà áóôåðîâ öâåòà, ãëóáèíû, ìàñêè è áóôåðà-íàêîïèòåëÿ ìîæåò òðåáîâàòü çíà÷èòåëüíîãî âðåìåíè.  ýòîì ðàçäåëå îïèñàíû íåêîòîðûå ïðèåìû, êîòîðûå ìîãóò ïîìî÷ü îïòèìèçèðîâàòüýòó îïåðàöèþ.Èñïîëüçóéòå êîìàíäó glClear ñ îñòîðîæíîñòüþÎ÷èùàéòå âñå íóæíûå áóôåðû ñ ïîìîùüþ îäíîé êîìàíäûglClear.Íåâåðíî:9.2. Îïòèìèçàöèÿ âûçîâîâ OPENGL127g l C l e a r (GL_COLOR_BUFFER_BIT) ;i f ( s t e n c i l i n g ) /* î÷èñòèòü áóôåð ìàñêè? */{g l C l e a r (GL_STENCIL_BUFFER_BIT) ;}Âåðíî:if ( stenciling ){}/* î÷èñòèòü áóôåð ìàñêè? */g l C l e a r (GL_COLOR_BUFFER_BIT |STENCIL_BUFFER_BIT ) ;else{}g l C l e a r (GL_COLOR_BUFFER_BIT) ;9.2.6.
ÐàçíîåÏðîâåðÿéòå îøèáêè GL âî âðåìÿ íàïèñàíèÿ ïðîãðàììÂûçûâàéòå êîìàíäóglGetError() äëÿ ïðîâåðêè, íå ïðîèçîøëîëè îøèáêè âî âðåìÿ âûçîâà îäíîé èç ôóíêöèé OpenGL. Êàêïðàâèëî, îøèáêè âîçíèêàþò èç-çà íåâåðíûõ ïàðàìåòðîâ êîìàíäOpenGL èëè íåâåðíîé ïîñëåäîâàòåëüíîñòè êîìàíä. Äëÿ ôèíàëüíûõ âåðñèé êîäà îòêëþ÷àéòå ýòè ïðîâåðêè, òàê êàê îíè ìîãóòñóùåñòâåííî çàìåäëèòü ðàáîòó. Äëÿ ïðîâåðêè ìîæíî èñïîëüçîâàòü, íàïðèìåð, òàêîé ìàêðîñ:#include <a s s e r t . h>#define CHECK_GL \a s s e r t ( glGetError ( ) != GL_NO_ERROR) ;Èñïîëüçîâàòü åãî ìîæíî òàê:g l B e g i n (GL_TRIANGLES) ;glVertex3f (1 ,1 ,1);glEnd ( ) ;Ãëàâà 9. Îïòèìèçàöèÿ ïðîãðàìì128CHECK_GL;ÈñïîëüçóéòåglColorMaterialâìåñòîglMaterialÅñëè â ñöåíå ìàòåðèàëû îáúåêòîâ ðàçëè÷àþòñÿ ëèøü îäíèìïàðàìåòðîì, êîìàíäàglMaterial.glColorMaterialìîæåò áûòü áûñòðåå, ÷åìÌèíèìèçèðóéòå ÷èñëî èçìåíåíèé ñîñòîÿíèÿ OpenGLglEnable, glDisable,Êîìàíäû, èçìåíÿþùèå ñîñòîÿíèå OpenGL (glBindTextureè äðóãèå), âûçûâàþò ïîâòîðíûå âíóòðåííèå ïðî-âåðêè öåëîñòíîñòè, ñîçäàíèå äîïîëíèòåëüíûõ ñòðóêòóð äàííûõè ò.ä., ÷òî ìîæåò ïðèâîäèòü ê çàäåðæêàì.Èçáåãàéòå èñïîëüçîâàíèÿ êîìàíäû glPolygonModeÅñëè âàì íåîáõîäèìî ðèñîâàòü ìíîãî íåçàêðàøåííûõ ìíî-glBegin ñ GL_POINTS, GL_LINES,GL_LINE_LOOP èëè GL_LINE_STRIP âìåñòî èçìåíåíèÿ ðåæèìàãîóãîëüíèêîâ, èñïîëüçóéòåðèñîâàíèÿ ïðèìèòèâîâ, òàê êàê ýòî ìîæåò áûòü íàìíîãî áûñòðåå.Êîíå÷íî, ýòè ðåêîìåíäàöèè îõâàòûâàþò ëèøü ìàëóþ ÷àñòüâîçìîæíîñòåé ïî îïòèìèçàöèè OpenGL-ïðèëîæåíèé.
Òåì íå ìåíåå, ïðè èõ ïðàâèëüíîì èñïîëüçîâàíèè ìîæíî äîñòè÷ü ñóùåñòâåííîãî óñêîðåíèÿ ðàáîòû âàøèõ ïðîãðàìì.9.3. Êîíòðîëüíûå âîïðîñû1) Ïåðå÷èñëèòå èçâåñòíûå âàì ìåòîäû âûñîêîóðîâíåâîé îïòèìèçàöèè OpenGL-ïðèëîæåíèé.2) Ïî÷åìó ïðåäïî÷òèòåëüíåå èñïîëüçîâàíèå ñâÿçàííûõ ïðèìèòèâîâ?9.3. Êîíòðîëüíûå âîïðîñû3) Êàêàÿ èç äâóõ êîìàíä âûïîëíÿåòñÿ OpenGL áûñòðåå?glVertex3f (1 ,1 ,1);èëèfloat vct [ 3 ] = { 1 , 1 , 1 } ;g l V e r t e x 3 f v ( vct ) ;129×àñòü IIIÑîçäàíèå ïðèëîæåíèé ñOpenGL131Ãëàâà 10.OpenGL-ïðèëîæåíèÿ ñïîìîùüþ GLUT10.1. Ñòðóêòóðà GLUT-ïðèëîæåíèÿÄàëåå áóäåì ðàññìàòðèâàòü ïîñòðîåíèå êîíñîëüíîãî ïðèëîæåíèÿ ïðè ïîìîùè áèáëèîòåêè GLUT. Ýòà áèáëèîòåêà îáåñïå÷èâàåò åäèíûé èíòåðôåéñ äëÿ ðàáîòû ñ îêíàìè âíå çàâèñèìîñòè îòïëàòôîðìû, ïîýòîìó îïèñûâàåìàÿ íèæå ñòðóêòóðà ïðèëîæåíèÿîñòàåòñÿ íåèçìåííîé äëÿ îïåðàöèîííûõ ñèñòåì Windows, Linuxè äðóãèõ.Ôóíêöèè GLUT ìîãóò áûòü êëàññèôèöèðîâàíû íà íåñêîëüêîãðóïï ïî ñâîåìó íàçíà÷åíèþ:èíèöèàëèçàöèÿ;íà÷àëî îáðàáîòêè ñîáûòèé;óïðàâëåíèå îêíàìè;óïðàâëåíèå ìåíþ;ðåãèñòðàöèÿ ôóíêöèé ñ îáðàòíûì âûçîâîì;133Ãëàâà 10.
OPENGL-ïðèëîæåíèÿ ñ ïîìîùüþ GLUT134óïðàâëåíèå èíäåêñèðîâàííîé ïàëèòðîé öâåòîâ;îòîáðàæåíèå øðèôòîâ;îòîáðàæåíèå äîïîëíèòåëüíûõ ãåîìåòðè÷åñêèõ ôèãóð (òîð,êîíóñ è äð.).Èíèöèàëèçàöèÿ ïðîâîäèòñÿ ñ ïîìîùüþ ôóíêöèè:g l u t I n i t ( int * argcp , char ** argv )Ïåðåìåííàÿíóþargc,argcpåñòü óêàçàòåëü íà ñòàíäàðòíóþ ïåðåìåí-îïèñûâàåìóþ â ôóíêöèèmain(),àargv óêàçàòåëüíàïàðàìåòðû, ïåðåäàâàåìûå ïðîãðàììå ïðè çàïóñêå, êîòîðûé îïèñûâàåòñÿ òàì æå. Ýòà ôóíêöèÿ ïðîâîäèò íåîáõîäèìûå íà÷àëüíûåäåéñòâèÿ äëÿ ïîñòðîåíèÿ îêíà ïðèëîæåíèÿ, è òîëüêî íåñêîëüêîôóíêöèé GLUT ìîãóò áûòü âûçâàíû äî íåå.
Ê íèì îòíîñÿòñÿ:gl u tI ni tW in do wP os it i on ( int x , int y )glutInitWindowSize ( int width , int h e i g h t )g l u t I n i t D i s p l a y M o d e ( unsigned int mode )Ïåðâûå äâå ôóíêöèè çàäàþò ñîîòâåòñòâåííî ïîëîæåíèå èðàçìåð îêíà, à ïîñëåäíÿÿ ôóíêöèÿ îïðåäåëÿåò ðàçëè÷íûå ðåæèìû îòîáðàæåíèÿ èíôîðìàöèè, êîòîðûå ìîãóò ñîâìåñòíî çàäàâàòüñÿ ñ èñïîëüçîâàíèåì îïåðàöèè ïîáèòîâîãî ¾èëè¿ (¾ | ¿):GLUT_RGBA Ðåæèì RGBA.