Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 8
Текст из файла (страница 8)
Åñëè æå îí ðàâåíGL_TRUE,òî íàáëþäàòåëü íàõîäèòñÿ â íà÷àëå âèäîâîé ñèñòåìû êîîðäèíàò. Ýòî ìîæåò óëó÷øèòü êà÷åñòâî îñâåùåíèÿ, íî óñëîæíÿåò åãî ðàñ÷åò.Çíà÷åíèå ïî óìîë÷àíèþ:GL_FALSE.GL_LIGHT_MODEL_TWO_SIDE ïàðàìåòðparam äîë-æåí áûòü áóëåâûì è óïðàâëÿåò ðåæèìîì ðàñ÷åòà îñâåùåííîñòè êàê äëÿ ëèöåâûõ, òàê è äëÿ îáðàòíûõ ãðàíåé. Åñëè îíðàâåíGL_FALSE,òî îñâåùåííîñòü ðàññ÷èòûâàåòñÿ òîëüêîäëÿ ëèöåâûõ ãðàíåé. Åñëè æå îí ðàâåíGL_TRUE,ðàñ÷åòïðîâîäèòñÿ è äëÿ îáðàòíûõ ãðàíåé.Çíà÷åíèå ïî óìîë÷àíèþ:GL_FALSE.GL_LIGHT_MODE_AMBIENT ïàðàìåòðparamsäîë-æåí ñîäåðæàòü ÷åòûðå öåëûõ èëè âåùåñòâåííûõ ÷èñëà, êîòîðûå îïðåäåëÿþò öâåò ôîíîâîãî îñâåùåíèÿ äàæå â ñëó÷àåîòñóòñòâèÿ îïðåäåëåííûõ èñòî÷íèêîâ ñâåòà.Çíà÷åíèå ïî óìîë÷àíèþ: (0.2, 0.2, 0.2,1.0).5.2. Ñïåöèôèêàöèÿ ìàòåðèàëîâ675.2.
Ñïåöèôèêàöèÿ ìàòåðèàëîâÄëÿ çàäàíèÿ ïàðàìåòðîâ òåêóùåãî ìàòåðèàëà èñïîëüçóþòñÿêîìàíäûvoid g l M a t e r i a l [ i f ] (GLenum f a c e , GLenum pname ,GLtype param )void g l M a t e r i a l [ i f ] v (GLenum f a c e , GLenum pname ,GLtype * params )Ñ èõ ïîìîùüþ ìîæíî îïðåäåëèòü ðàññåÿííûé, äèôôóçíûéè çåðêàëüíûé öâåòà ìàòåðèàëà, à òàêæå ñòåïåíü çåðêàëüíîãî îòðàæåíèÿ è èíòåíñèâíîñòü èçëó÷åíèÿ ñâåòà, åñëè îáúåêò äîëæåíñâåòèòüñÿ. Êàêîé èìåííî ïàðàìåòð áóäåò îïðåäåëÿòüñÿ çíà÷åíèåìparam,pname:çàâèñèò îò çíà÷åíèÿ ïàðàìåòðGL_AMBIENTparams äîëæåí ñîäåðæàòü ÷åòûðåöåëûõ èëè âåùåñòâåííûõ çíà÷åíèÿ öâåòîâ RGBA, êîòîðûåîïðåäåëÿþò ðàññåÿííûé öâåò ìàòåðèàëà (öâåò ìàòåðèàëà âòåíè).Çíà÷åíèå ïî óìîë÷àíèþ:GL_DIFFUSE ïàðàìåòð(0.2, 0.2, 0.2, 1.0).paramsäîëæåí ñîäåðæàòü ÷åòûðåöåëûõ èëè âåùåñòâåííûõ çíà÷åíèÿ öâåòîâ RGBA, êîòîðûåîïðåäåëÿþò äèôôóçíûé öâåò ìàòåðèàëà.Çíà÷åíèå ïî óìîë÷àíèþ:GL_SPECULAR(0.8, 0.8, 0.8, 1.0).
ïàðàìåòðparams äîëæåí ñîäåðæàòü ÷åòû-ðå öåëûõ èëè âåùåñòâåííûõ çíà÷åíèÿ öâåòîâ RGBA, êîòîðûå îïðåäåëÿþò çåðêàëüíûé öâåò ìàòåðèàëà.Çíà÷åíèå ïî óìîë÷àíèþ:GL_SHININESS(0.0, 0.0, 0.0, 1.0). ïàðàìåòðparamsäîëæåí ñîäåðæàòü îäíîöåëîå èëè âåùåñòâåííîå çíà÷åíèå â äèàïàçîíå îò 0 äî 128,êîòîðîå îïðåäåëÿåò ñòåïåíü çåðêàëüíîãî îòðàæåíèÿ ìàòåðèàëà.Çíà÷åíèå ïî óìîë÷àíèþ:0.Ãëàâà 5. Ìàòåðèàëû è îñâåùåíèå68GL_EMISSION ïàðàìåòðparams äîëæåí ñîäåðæàòü ÷åòûðåöåëûõ èëè âåùåñòâåííûõ çíà÷åíèÿ öâåòîâ RGBA, êîòîðûåîïðåäåëÿþò èíòåíñèâíîñòü èçëó÷àåìîãî ñâåòà ìàòåðèàëà.Çíà÷åíèå ïî óìîë÷àíèþ:(0.0, 0.0, 0.0, 1.0).GL_AMBIENT_AND_DIFFUSE ýêâèâàëåíòíîglMaterial() ñî çíà÷åíèåì pnameGL_DIFFUSE è îäèíàêîâûìè çíà÷åíèÿìèäâóì âûçîâàì êîìàíäûGL_AMBIENTparams.èÈç ýòîãî ñëåäóåò, ÷òî âûçîâ êîìàíäûglMaterial[ i f ]()âîçìî-æåí òîëüêî äëÿ óñòàíîâêè ñòåïåíè çåðêàëüíîãî îòðàæåíèÿ ìàòåðèàëà (shininess).
ÊîìàíäàglMaterial[ i f ]v()èñïîëüçóåòñÿ äëÿçàäàíèÿ îñòàëüíûõ ïàðàìåòðîâ.Ïàðàìåòðfaceîïðåäåëÿåò òèï ãðàíåé, äëÿ êîòîðûõ çàäà-åòñÿ ýòîò ìàòåðèàë è ìîæåò ïðèíèìàòü çíà÷åíèÿGL_BACKèëèGL_FRONT_AND_BACK.GL_FRONT,Åñëè â ñöåíå ìàòåðèàëû îáúåêòîâ ðàçëè÷àþòñÿ ëèøü îäíèìïàðàìåòðîì, ðåêîìåíäóåòñÿ ñíà÷àëà óñòàíîâèòü íóæíûé ðåæèì,âûçâàâglEnable() c ïàðàìåòðîì GL_COLOR_MATERIAL, à çàòåìèñïîëüçîâàòü êîìàíäóvoid g l C o l o r M a t e r i a l (GLenum f a c e , GLenum pname )ãäå ïàðàìåòðfaceèìååò àíàëîãè÷íûé ñìûñë, à ïàðàìåòðpnameìîæåò ïðèíèìàòü âñå ïåðå÷èñëåííûå çíà÷åíèÿ.
Ïîñëå ýòîãî çíà÷åíèÿ âûáðàííîãî ñ ïîìîùüþ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.