Баяковский.Начальный курс OpenGL (1124482), страница 8
Текст из файла (страница 8)
Ïîñëå ýòîãî çíà÷åíèÿ âûáðàííîãî ñ ïîìîùüþpname ñâîéñòâà ìàòåðèàëà äëÿ êîí-êðåòíîãî îáúåêòà (èëè âåðøèíû) óñòàíàâëèâàþòñÿ âûçîâîì êî-glColor, ÷òî ïîçâîëÿåò èçáåæàòü âûçîâîâ áîëåå ðåñóðñîåìêîìàíäû glMaterial è ïîâûøàåò ýôôåêòèâíîñòü ïðîãðàììû.ìàíäûêîéÄðóãèå ìåòîäû îïòèìèçàöèè ïðèâåäåíû â ãëàâå 9.Ïðèìåð îïðåäåëåíèÿ ñâîéñòâ ìàòåðèàëà:float mat_dif [ ] = { 0 . 8 , 0 . 8 , 0 . 8 } ;float mat_amb [ ] = { 0 . 2 , 0 . 2 , 0 .
2 } ;float mat_spec [ ] = { 0 . 6 , 0 . 6 , 0 . 6 } ;5.3. Îïèñàíèå èñòî÷íèêîâ ñâåòà69float s h i n i n e s s = 0 . 7 * 1 2 8 ;...g l M a t e r i a l f v (GL_FRONT_AND_BACK,GL_AMBIENT,mat_amb ) ;g l M a t e r i a l f v (GL_FRONT_AND_BACK,GL_DIFFUSE,mat_dif ) ;g l M a t e r i a l f v (GL_FRONT_AND_BACK,GL_SPECULAR,mat_spec ) ;g l M a t e r i a l f (GL_FRONT, GL_SHININESS ,shininess );5.3. Îïèñàíèå èñòî÷íèêîâ ñâåòàÎïðåäåëåíèå ñâîéñòâ ìàòåðèàëà îáúåêòà èìååò ñìûñë, òîëüêî åñëè â ñöåíå åñòü èñòî÷íèêè ñâåòà.
Èíà÷å âñå îáúåêòû áóäóò÷åðíûìè (èëè, ñòðîãî ãîâîðÿ, èìåòü öâåò, ðàâíûé ðàññåÿííîìóöâåòó ìàòåðèàëà, óìíîæåííîìó íà èíòåíñèâíîñòü ãëîáàëüíîãîôîíîâîãî îñâåùåíèÿ, ñì. êîìàíäóglLightModel).Äîáàâèòü â ñöå-íó èñòî÷íèê ñâåòà ìîæíî ñ ïîìîùüþ êîìàíävoid g l L i g h t [ i f ] (GLenum l i g h t , GLenum pname ,GLfloat param )void g l L i g h t [ i f ] (GLenum l i g h t , GLenum pname ,GLfloat * params )Ïàðàìåòðlightîäíîçíà÷íîîïðåäåëÿåòèñòî÷íèêñâåòà.Îí âûáèðàåòñÿ èç íàáîðà ñïåöèàëüíûõ ñèìâîëè÷åñêèõ èìåíâèäàGL_LIGHTi, ãäå i äîëæíî ëåæàòü â äèàïàçîíå îò 0 äî êîíGL_MAX_LIGHT, êîòîðàÿ îáû÷íî íå ïðåâîñõîäèò âîñü-ñòàíòûìè.ÏàðàìåòðûìàíäåpnameglMaterial.èparamsèìåþò ñìûñë, àíàëîãè÷íûé êî-Ðàññìîòðèì çíà÷åíèÿ ïàðàìåòðàGL_SPOT_EXPONENT ïàðàìåòðparampname:äîëæåí ñîäåð-æàòü öåëîå èëè âåùåñòâåííîå ÷èñëî îò 0 äî 128, çàäàþùååÃëàâà 5.
Ìàòåðèàëû è îñâåùåíèå70ðàñïðåäåëåíèå èíòåíñèâíîñòè ñâåòà. Ýòîò ïàðàìåòð îïèñûâàåò óðîâåíü ñôîêóñèðîâàííîñòè èñòî÷íèêà ñâåòà.Çíà÷åíèå ïî óìîë÷àíèþ: 0 (ðàññåÿííûé ñâåò).GL_SPOT_CUTOFF ïàðàìåòðparamäîëæåí ñîäåðæàòüöåëîå èëè âåùåñòâåííîå ÷èñëî ìåæäó 0 è 90 èëè ðàâíîå180, êîòîðîå îïðåäåëÿåò ìàêñèìàëüíûé óãîë ðàçáðîñà ñâåòà. Çíà÷åíèå ýòîãî ïàðàìåòðà åñòü ïîëîâèíà óãëà â âåðøèíåêîíóñîâèäíîãî ñâåòîâîãî ïîòîêà, ñîçäàâàåìîãî èñòî÷íèêîì.Çíà÷åíèå ïî óìîë÷àíèþ: 180 (ðàññåÿííûé ñâåò). ïàðàìåòðGL_AMBIENTparams äîëæåí ñîäåðæàòü ÷åòûðåöåëûõ èëè âåùåñòâåííûõ çíà÷åíèÿ öâåòîâ RGBA, êîòîðûåîïðåäåëÿþò öâåò ôîíîâîãî îñâåùåíèÿ.(0.0, 0.0, 0.0, 1.0).Çíà÷åíèå ïî óìîë÷àíèþ:GL_DIFFUSE ïàðàìåòðparamsäîëæåí ñîäåðæàòü ÷åòûðåöåëûõ èëè âåùåñòâåííûõ çíà÷åíèÿ öâåòîâ RGBA, êîòîðûåîïðåäåëÿþò öâåò äèôôóçíîãî îñâåùåíèÿ.Çíà÷åíèå ïî óìîë÷àíèþ:è(0.0, 0.0, 0.0, 1.0)GL_SPECULAR(1.0, 1.0, 1.0, 1.0)äëÿGL_LIGHT0äëÿ îñòàëüíûõ.
ïàðàìåòðparams äîëæåí ñîäåðæàòü ÷åòû-ðå öåëûõ èëè âåùåñòâåííûõ çíà÷åíèÿ öâåòîâ RGBA, êîòîðûå îïðåäåëÿþò öâåò çåðêàëüíîãî îòðàæåíèÿ.Çíà÷åíèå ïî óìîë÷àíèþ:è(0.0, 0.0, 0.0, 1.0)GL_POSITION(1.0, 1.0, 1.0, 1.0)äëÿGL_LIGHT0äëÿ îñòàëüíûõ. ïàðàìåòðparams äîëæåí ñîäåðæàòü ÷åòûðåöåëûõ èëè âåùåñòâåííûõ ÷èñëà, êîòîðûå îïðåäåëÿþò ïîëîæåíèå èñòî÷íèêà ñâåòà. Åñëè çíà÷åíèå êîìïîíåíòû w ðàâíî 0.0, òî èñòî÷íèê ñ÷èòàåòñÿ áåñêîíå÷íî óäàëåííûì è ïðèðàñ÷åòå îñâåùåííîñòè ó÷èòûâàåòñÿ òîëüêî íàïðàâëåíèå íàòî÷êó(x, y, z), â ïðîòèâíîì ñëó÷àå ñ÷èòàåòñÿ, ÷òî èñòî÷íèê(x, y, z, w).  ïåðâîì ñëó÷àå îñëàáëåíèÿðàñïîëîæåí â òî÷êå5.3. Îïèñàíèå èñòî÷íèêîâ ñâåòà71ñâåòà ïðè óäàëåíèè îò èñòî÷íèêà íå ïðîèñõîäèò, ò.å.
èñòî÷íèê ñ÷èòàåòñÿ áåñêîíå÷íî óäàëåííûì.Çíà÷åíèå ïî óìîë÷àíèþ:(0.0, 0.0, 1.0, 0.0). ïàðàìåòðGL_SPOT_DIRECTIONparamsäîëæåíõðà-íèòü ÷åòûðå öåëûõ èëè âåùåñòâåííûõ ÷èñëà, êîòîðûå îïðåäåëÿþò íàïðàâëåíèå ñâåòà.Çíà÷åíèå ïî óìîë÷àíèþ:(0.0, 0.0, −1.0, 1.0).Ýòà õàðàêòåðèñòèêà èñòî÷íèêà èìååò ñìûñë, åñëè çíà÷åíèåGL_SPOT_CUTOFF îòëè÷íî îò 180 (êîòîðîå, êñòàòè, çàäàíî ïî óìîë÷àíèþ).GL_CONSTANT_ATTENUATION ,GL_LINEAR_ATTENUATION ,GL_QUADRATIC_ATTENUATIONparams ïàðàìåòðçàäàåò çíà÷åíèå îäíîãî èç òðåõ êîýôôèöèåíòîâ, îïðåäåëÿþùèõ îñëàáëåíèå èíòåíñèâíîñòè ñâåòàîòèñòî÷íèêà.Äîïóñêàþòñÿòîëüêîïðè óäàëåíèèíåîòðèöàòåëüíûåçíà÷åíèÿ. Åñëè èñòî÷íèê íå ÿâëÿåòñÿ íàïðàâëåííûì (ñì.GL_POSITION),òî îñëàáëåíèå îáðàòíî ïðîïîðöèîíàëüíîñóììå:attconstant + attlinear ∗ d + attquadratic ∗ d2ãäåd ðàññòîÿíèåùàåìîéèìattquadraticìåæäóâåðøèíîé;ðàâíûèñòî÷íèêîìattconstant,ïàðàìåòðàì,ñâåòàèîñâå-attlinearçàäàííûìñèïî-ìîùüþêîíñòàíòGL_CONSTANT_ATTENUATION,GL_LINEAR_ATTENUATIONèGL_QUADRATIC_ATTENUATION ñîîòâåòñòâåííî.
Ïîóìîë÷àíèþ ýòè ïàðàìåòðû çàäàþòñÿ òðîéêîéôàêòè÷åñêè îñëàáëåíèÿ íå ïðîèñõîäèò.(1, 0, 0),èÃëàâà 5. Ìàòåðèàëû è îñâåùåíèå72Ïðè èçìåíåíèè ïîëîæåíèÿ èñòî÷íèêà ñâåòà ñëåäóåò ó÷èòûâàòü ñëåäóþùèé ôàêò: â OpenGL èñòî÷íèêè ñâåòà ÿâëÿþòñÿ îáúåêòàìè, âî ìíîãîì òàêèìè æå, êàê ìíîãîóãîëüíèêè è òî÷êè. Íàíèõ ðàñïðîñòðàíÿåòñÿ îñíîâíîå ïðàâèëî îáðàáîòêè êîîðäèíàò âOpenGL ïàðàìåòðû, îïèñûâàþùåå ïîëîæåíèå â ïðîñòðàíñòâå,ïðåîáðàçóþòñÿ òåêóùåé ìîäåëüíî-âèäîâîé ìàòðèöåé â ìîìåíòôîðìèðîâàíèÿ îáúåêòà, ò.å. â ìîìåíò âûçîâà ñîîòâåòñòâóþùèõêîìàíä OpenGL.
Òàêèì îáðàçîì, ôîðìèðóÿ èñòî÷íèê ñâåòà îäíîâðåìåííî ñ îáúåêòîì ñöåíû èëè êàìåðîé, åãî ìîæíî ïðèâÿçàòü êýòîìó îáúåêòó. Èëè, íàîáîðîò, ñôîðìèðîâàòü ñòàöèîíàðíûé èñòî÷íèê ñâåòà, êîòîðûé áóäåò îñòàâàòüñÿ íà ìåñòå, ïîêà äðóãèåîáúåêòû ïåðåìåùàþòñÿ.Îáùåå ïðàâèëî òàêîå: eñëè ïîëîæåíèå èñòî÷íèêà ñâåòà çàäàåòñÿ êîìàíäîéglLightïåðåä îïðåäåëåíèåì ïîëîæåíèÿ âèðòóàëü-íîé êàìåðû (íàïðèìåð, êîìàíäîé÷òî êîîðäèíàòû(0, 0, 0)glLookAt()), òî áóäåò ñ÷èòàòüñÿ,èñòî÷íèêà íàõîäèòñÿ â òî÷êå íàáëþäå-íèÿ è, ñëåäîâàòåëüíî, ïîëîæåíèå èñòî÷íèêà ñâåòà îïðåäåëÿåòñÿîòíîñèòåëüíî ïîëîæåíèÿ íàáëþäàòåëÿ.Åñëè ïîëîæåíèå óñòàíàâëèâàåòñÿ ìåæäó îïðåäåëåíèåì ïîëîæåíèÿ êàìåðû è ïðåîáðàçîâàíèÿìè ìîäåëüíî-âèäîâîé ìàòðèöûîáúåêòà, òî îíî ôèêñèðóåòñÿ, ò.å. â ýòîì ñëó÷àå ïîëîæåíèå èñòî÷íèêà ñâåòà çàäàåòñÿ â ìèðîâûõ êîîðäèíàòàõ.
Äëÿ èñïîëüçîâàíèÿîñâåùåíèÿ ñíà÷àëà íàäî óñòàíîâèòü ñîîòâåòñòâóþùèé ðåæèì âûçîâîì êîìàíäûglEnable(GL_LIGHTING), à çàòåì âêëþ÷èòü íóæglEnable(GL_LIGHTi).íûé èñòî÷íèê êîìàíäîéÅùå ðàç îáðàòèì âíèìàíèå íà òî, ÷òî ïðè âûêëþ÷åííîì îñâåùåíèè öâåò âåðøèíû ðàâåí òåêóùåìó öâåòó, êîòîðûé çàäàåòñÿêîìàíäàìèglColor.Ïðè âêëþ÷åííîì îñâåùåíèè öâåò âåðøèíûâû÷èñëÿåòñÿ èñõîäÿ èç èíôîðìàöèè î ìàòåðèàëå, íîðìàëÿõ èèñòî÷íèêàõ ñâåòà.Ïðè âûêëþ÷åíèè îñâåùåíèÿ âèçóàëèçàöèÿ ïðîèñõîäèò áûñòðåå, îäíàêî â òàêîì ñëó÷àå ïðèëîæåíèå äîëæíî ñàìî ðàññ÷èòûâàòü öâåòà âåðøèí.5.4. Ñîçäàíèå ýôôåêòà òóìàíàÒåêñòïðîãðàììû,73äåìîíñòðèðóþùåéîñíîâíûåïðèíöèïûîïðåäåëåíèÿ ìàòåðèàëîâ è èñòî÷íèêîâ ñâåòà, ïðèâåäåí â ïðèëîæåíèè Á.5.4. Ñîçäàíèå ýôôåêòà òóìàíà çàâåðøåíèå ðàññìîòðèì îäíó èíòåðåñíóþ è ÷àñòî èñïîëüçóåìóþ âîçìîæíîñòü OpenGL ñîçäàíèå ýôôåêòà òóìàíà.
Ëåãêîåçàòóìàíèâàíèå ñöåíû ñîçäàåò ðåàëèñòè÷íûé ýôôåêò, à èíîãäàìîæåò è ñêðûòü íåêîòîðûå àðòåôàêòû, êîòîðûå ïîÿâëÿþòñÿ, êîãäà â ñöåíå ïðèñóòñòâóþò îòäàëåííûå îáúåêòû.Òóìàí â OpenGL ðåàëèçóåòñÿ ïóòåì èçìåíåíèÿ öâåòà îáúåêòîâ â ñöåíå â çàâèñèìîñòè îò èõ ãëóáèíû, ò.å. ðàññòîÿíèÿ äî òî÷êè íàáëþäåíèÿ. Èçìåíåíèå öâåòà ïðîèñõîäèò ëèáî äëÿ âåðøèíïðèìèòèâîâ, ëèáî äëÿ êàæäîãî ïèêñåëÿ íà ýòàïå ðàñòåðèçàöèèâ çàâèñèìîñòè îò ðåàëèçàöèè OpenGL. Ýòèì ïðîöåññîì ìîæíî÷àñòè÷íî óïðàâëÿòü ñì. ðàçäåë 7.Äëÿ âêëþ÷åíèÿ ýôôåêòà çàòóìàíèâàíèÿ íåîáõîäèìî âûçâàòüêîìàíäóglEnable(GL_FOG).Ìåòîä âû÷èñëåíèÿ èíòåíñèâíîñòè òóìàíà â âåðøèíå ìîæíîîïðåäåëèòü ñ ïîìîùüþ êîìàíävoid glFog [ i f ] (enum pname , T param )void glFog [ i f ] v (enum pname , T params )Àðãóìåíò pname ìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ:GL_FOG_MODE àðãóìåíòparam îïðåäåëÿåò ôîðìóëó, ïîêîòîðîé áóäåò âû÷èñëÿòüñÿ èíòåíñèâíîñòü òóìàíà â òî÷êå. ýòîì ñëó÷àåGL_EXPGL_EXP2paramìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ: èíòåíñèâíîñòü çàäàåòñÿ ôîðìóëîéf = e(−d∗z) ; èíòåíñèâíîñòü çàäàåòñÿ ôîðìóëîéf = e−(d∗z)2;Ãëàâà 5.
Ìàòåðèàëû è îñâåùåíèå74GL_LINEAR èíòåíñèâíîñòü âû÷èñëÿåòñÿ ïî ôîðìóëåe − z/e − s,ãäåz ðàññòîÿíèåf =îò âåðøèíû, â êîòîðîé âû-÷èñëÿåòñÿ èíòåíñèâíîñòü òóìàíà, äî òî÷êè íàáëþäåíèÿ.Êîýôôèöèåíòû÷åíèé àðãóìåíòàd, e, spname:GL_FOG_DENSITYGL_FOG_STARTGL_FOG_ENDçàäàþòñÿ ñ ïîìîùüþ ñëåäóþùèõ çíà-paramparamparamîïðåäåëÿåò êîýýôèöèåíòîïðåäåëÿåò êîýôôèöèåíòîïðåäåëÿåò êîýôôèöèåíòÖâåò òóìàíà çàäàåòñÿ ñ ïîìîùüþ àðãóìåíòàGL_FOG_COLOR. ýòîì ñëó÷àåse.pname,params óêàçàòåëüdðàâíîãîíà ìàññèâèç 4-õ êîìïîíåíò öâåòà.Ïðèâåäåì ïðèìåð èñïîëüçîâàíèÿ ýòîãî ýôôåêòà:GLfloat FogColor [ 4 ] = { 0 . 5 , 0 . 5 , 0 . 5 , 1 } ;glEnable (GL_FOG) ;g l F o g i (GL_FOG_MODE,GL_LINEAR) ;g l F o g f (GL_FOG_START, 2 0 . 0 ) ;g l F o g f (GL_FOG_END, 1 0 0 . 0 ) ;g l F o g f v (GL_FOG_COLOR, FogColor ) ;5.5.
Êîíòðîëüíûå âîïðîñû1) Ïîÿñíèòå ðàçíèöó ìåæäó ëîêàëüíûìè è áåñêîíå÷íî óäàëåííûìè èñòî÷íèêàìè ñâåòà.2) Äëÿ ÷åãî ñëóæèò êîìàíäàglColorMaterial?3) Êàê çàäàòü ïîëîæåíèå èñòî÷íèêà ñâåòà òàêèì îáðàçîì, ÷òîáû îí âñåãäà íàõîäèëñÿ â òî÷êå ïîëîæåíèÿ íàáëþäàòåëÿ?4) Êàê çàäàòü ôèêñèðîâàííîå ïîëîæåíèå èñòî÷íèêà ñâåòà?Ìîæíî ëè çàäàâàòü ïîëîæåíèå èñòî÷íèêà îòíîñèòåëüíîëîêàëüíûõ êîîðäèíàò îáúåêòà?5.5.
Êîíòðîëüíûå âîïðîñû755) Êàê çàäàòü êîíóñíûé èñòî÷íèê ñâåòà?6) Åñëè â ñöåíå âêëþ÷åíî îñâåùåíèå, íî íåò èñòî÷íèêîâ ñâåòà,êàêîé öâåò áóäóò èìåòü îáúåêòû?Ãëàâà 6.ÒåêñòóðèðîâàíèåÏîä òåêñòóðîé áóäåì ïîíèìàòü èçîáðàæåíèå, êîòîðîå íàäîîïðåäåëåííûì îáðàçîì íàíåñòè íà îáúåêò, íàïðèìåð, äëÿ ïðèäàíèÿ èëëþçèè ðåëüåôíîñòè ïîâåðõíîñòè.Äëÿ ðàáîòû ñ òåêñòóðîé ñëåäóåò âûïîëíèòü ñëåäóþùóþ ïîñëåäîâàòåëüíîñòü äåéñòâèé:âûáðàòü èçîáðàæåíèå è ïðåîáðàçîâàòü åãî ê íóæíîìó ôîðìàòó;ïåðåäàòü èçîáðàæåíèå â OpenGL;îïðåäåëèòü, êàê òåêñòóðà áóäåò íàíîñèòüñÿ íà îáúåêò è êàêîíà áóäåò ñ íèì âçàèìîäåéñòâîâàòü;ñâÿçàòü òåêñòóðó ñ îáúåêòîì.6.1.