Баяковский.Начальный курс OpenGL (1124482), страница 12
Текст из файла (страница 12)
Ñ åãî ïîìîùüþ ìîæíî ïîëó÷àòü òåíè, îòáðàñûâàåìûå òðåõìåðíûì îáúåêòîì íà ïëîñêîñòü.Îáùèé ïîäõîä òàêîâ: äëÿ âñåõ òî÷åê îáúåêòà íàõîäèòñÿ èõïðîåêöèÿ ïàðàëëåëüíî âåêòîðó, ñîåäèíÿþùåìó äàííóþ òî÷êó èòî÷êó, â êîòîðîé íàõîäèòñÿ èñòî÷íèê ñâåòà, íà íåêóþ çàäàííóþïëîñêîñòü. Òåì ñàìûì ïîëó÷àåì íîâûé îáúåêò, öåëèêîì ëåæàùèé â çàäàííîé ïëîñêîñòè. Ýòîò îáúåêò è ÿâëÿåòñÿ òåíüþ èñõîäíîãî.Ðàññìîòðèì ìàòåìàòè÷åñêèå îñíîâû äàííîãî ìåòîäà.Ïóñòü:P òî÷êà â òðåõìåðíîì ïðîñòðàíñòâå, êîòîðàÿ îòáðàñûâàåòòåíü.L ïîëîæåíèå èñòî÷íèêà ñâåòà, êîòîðûé îñâåùàåò äàííóþ òî÷êó.S = a(L − P ) − P òî÷êà,P , ãäå a ïàðàìåòð.â êîòîðóþ îòáðàñûâàåò òåíü òî÷êàÏðåäïîëîæèì, ÷òî òåíü ïàäàåò íà ïëîñêîñòüñëó÷àåa = zp /(zl − zp ).Ñëåäîâàòåëüíî,z = 0. ýòîìÃëàâà 8.
Ãðàôè÷åñêèå àëãîðèòìû íà îñíîâå OPENGL104xs = (xp zl − zl zp )/(zl − zp )ys = (yp zl − yl zp )/(zl − zp )zs =0Ââåäåì îäíîðîäíûå êîîðäèíàòû:xsyszsws0Îòñþäà êîîðäèíàòûS= x0s /ws0= ys0 /ws0=0= z l − zpìîãóò áûòü ïîëó÷åíû ñ èñïîëüçîâàíè-åì óìíîæåíèÿ ìàòðèö ñëåäóþùèì îáðàçîì:x0s ys0 0 ws0 = xs ys zszl0 0zl1 −xl −yl000 00 00 10 zlÄëÿ òîãî, ÷òîáû àëãîðèòì ìîã ðàññ÷èòûâàòü òåíü, ïàäàþùóþíà ïðîèçâîëüíóþ ïëîñêîñòü, ðàññìîòðèì ïðîèçâîëüíóþ òî÷êó íàëèíèè ìåæäóaP + bL,SP , ïðåäñòàâëåííóþ â îäíîðîäíûõ êîîðäèíàòàõ:a è b ñêàëÿðíûå ïàðàìåòðû.èãäåÑëåäóþùàÿ ìàòðèöà çàäàåò ïëîñêîñòü ÷åðåç êîîðäèíàòû ååíîðìàëè: xn yn G= zn dÒî÷êà, â êîòîðîé ëó÷, ïðîâåäåííûé îò èñòî÷íèêà ñâåòà ÷åðåçäàííóþ òî÷êóðàìèaèb,P , ïåðåñåêàåò ïëîñêîñòü G, îïðåäåëÿåòñÿ ïàðàìåò-óäîâëåòâîðÿþùèìè ñëåäóþùåìó óðàâíåíèþ:8.2.
Ïîñòðîåíèå òåíåé105(aP + bL)G = 0Îòñþäà ïîëó÷àåì:a(P G) + b(LG) = 0. Ýòîìó óðàâíåíèþ óäî-âëåòâîðÿþòa = (LG), b = −(P G)Ñëåäîâàòåëüíî, êîîðäèíàòû èñêîìîé òî÷êè(P G)L.S = (LG)P −Ïîëüçóÿñü àññîöèàòèâíîñòüþ ìàòðè÷íîãî ïðîèçâåäåíèÿ,ïîëó÷èìS = P [(LG)I − GL]ãäåI åäèíè÷íàÿ ìàòðèöà.(LG)I − GL èñïîëüçóåòñÿÌàòðèöà(8.1)äëÿ ïîëó÷åíèÿ òåíåé íàïðîèçâîëüíîé ïëîñêîñòè.Ðàññìîòðèì íåêîòîðûå àñïåêòû ïðàêòè÷åñêîé ðåàëèçàöèèäàííîãî ìåòîäà ñ ïîìîùüþ OpenGL.Ïðåäïîëîæèì, ÷òî ìàòðèöàíàìè èç ôîðìóëûoorShadow(LG)I − GL.áûëà ðàíåå ïîëó÷åíàÑëåäóþùèé êîä ñ åå ïîìîùüþñòðîèò òåíè äëÿ çàäàííîé ïëîñêîñòè:/* Âèçóàëèçèðóåì ñöåíó â îáû÷íîì ðåæèìå */RenderGeometry ( ) ;/* Äåëàåì òåíè ïîëóïðîçðà÷íûìè ñ èñïîëüçîâàíèåìñìåøèâàíèÿ öâåòîâ ( b l e n d i n g ) */glEnable (GL_BLEND) ;glBlendFunc (GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) ;g l D i s a b l e (GL_LIGHTING ) ;glColor4f (0.0 , 0.0 , 0.0 , 0.5);glPushMatrix ( ) ;/* Ïðîåöèðóåì òåíü */glMultMatrixf ( ( GLfloat * ) floorShadow ) ;/* Âèçóàëèçèðóåì ñöåíó â ïðîåêöèè */106Ãëàâà 8.
Ãðàôè÷åñêèå àëãîðèòìû íà îñíîâå OPENGLRenderGeometry ( ) ;glPopMatrix ( ) ;glEnable (GL_LIGHTING ) ;g l D i s a b l e (GL_BLEND) ;Ìàòðèöà oorShadow ìîæåò áûòü ïîëó÷åíà èç óðàâíåíèÿ 8.1ñ ïîìîùüþ ñëåäóþùåé ôóíêöèè:/* ïàðàìåòðû :p l a n e − êîýôôèöèåíòû óðàâíåíèÿ ïëîñêîñòèl i g h t p o s − êîîðäèíàòû èñòî÷íèêà ñâåòàâîçâðàùàåò : m a t r i x − ðåçóëüòèðóþùàÿ ìàòðèöà*/void shadowmatrix ( GLfloat matrix [ 4 ] [ 4 ] ,{GLfloat plane [ 4 ] ,GLfloat l i g h t p o s [ 4 ] )GLfloat dot ;dot = plane [ 0 ]plane [ 1 ]plane [ 2 ]plane [ 3 ]****lightpos [0] +lightpos [1] +lightpos [2] +lightpos [ 3 ] ;matrix [ 0 ] [ 0 ]matrix [ 1 ] [ 0 ]matrix [ 2 ] [ 0 ]matrix [ 3 ] [ 0 ]====dot0. f0. f0.
f−−−−lightpos [0]lightpos [0]lightpos [0]lightpos [0]****plane [ 0 ] ;plane [ 1 ] ;plane [ 2 ] ;plane [ 3 ] ;matrix [ 0 ] [ 1 ]matrix [ 1 ] [ 1 ]matrix [ 2 ] [ 1 ]matrix [ 3 ] [ 1 ]====0. fdot0. f0. f−−−−lightpos [1]lightpos [1]lightpos [1]lightpos [1]****plane [ 0 ] ;plane [ 1 ] ;plane [ 2 ] ;plane [ 3 ] ;matrix [ 0 ] [ 2 ]matrix [ 1 ] [ 2 ]matrix [ 2 ] [ 2 ]matrix [ 3 ] [ 2 ]====0. f0. fdot0. f−−−−lightpos [2]lightpos [2]lightpos [2]lightpos [2]****plane [ 0 ] ;plane [ 1 ] ;plane [ 2 ] ;plane [ 3 ] ;8.2. Ïîñòðîåíèå òåíåé}matrix [ 0 ] [ 3 ]matrix [ 1 ] [ 3 ]matrix [ 2 ] [ 3 ]matrix [ 3 ] [ 3 ]====0. f0.
f0. fdot107−−−−lightpos [3]lightpos [3]lightpos [3]lightpos [3]****plane [ 0 ] ;plane [ 1 ] ;plane [ 2 ] ;plane [ 3 ] ;Çàìåòèì, ÷òî òåíè, ïîñòðîåííûå òàêèì îáðàçîì, èìåþò ðÿäíåäîñòàòêîâ:Îïèñàííûé àëãîðèòì ïðåäïîëàãàåò, ÷òî ïëîñêîñòè áåñêîíå÷íû, è íå îòðåçàåò òåíè ïî ãðàíèöå. Íàïðèìåð, åñëè íåêîòîðûé îáúåêò îòáðàñûâàåò òåíü íà ñòîë, îíà íå áóäåò îòñåêàòüñÿ ïî ãðàíèöå, è, òåì áîëåå, ¾çàâîðà÷èâàòüñÿ¿ íà áîêîâóþ ïîâåðõíîñòü ñòîëà. íåêîòîðûõ ìåñòàõ òåíåé ìîæåò íàáëþäàòüñÿ ýôôåêò¾äâîéíîãî ñìåøèâàíèÿ¿ (reblending), ò.å.
òåìíûå ïÿòíà âòåõ ó÷àñòêàõ, ãäå ñïðîåöèðîâàííûå òðåóãîëüíèêè ïåðåêðûâàþò äðóã äðóãà.Ñ óâåëè÷åíèåì ÷èñëà ïîâåðõíîñòåé ñëîæíîñòü àëãîðèòìàðåçêî óâåëè÷èâàåòñÿ, ò.ê. äëÿ êàæäîé ïîâåðõíîñòè íóæíîçàíîâî ñòðîèòü âñþ ñöåíó, äàæå åñëè ïðîáëåìà îòñå÷åíèÿòåíåé ïî ãðàíèöå áóäåò ðåøåíà.Òåíè îáû÷íî èìåþò ðàçìûòûå ãðàíèöû, à â ïðèâåäåííîìàëãîðèòìå îíè âñåãäà èìåþò ðåçêèå êðàÿ. ×àñòè÷íî èçáåæàòü ýòîãî ïîçâîëÿåò ðàñ÷åò òåíåé èç íåñêîëüêèõ èñòî÷íèêîâ ñâåòà, ðàñïîëîæåííûõ ðÿäîì è ïîñëåäóþùåå ñìåøèâàíèå ðåçóëüòàòîâ.Èìååòñÿ ðåøåíèå ïåðâîé è âòîðîé ïðîáëåìû.
Äëÿ ýòîãî èñïîëüçóåòñÿ áóôåð ìàñêè (ñì. ï. 7.2).Èòàê, çàäà÷à îòñå÷ü âûâîä ãåîìåòðèè (òåíè) ïî ãðàíèöåíåêîòîðîé ïðîèçâîëüíîé îáëàñòè è èçáåæàòü ¾äâîéíîãî ñìåøè-Ãëàâà 8. Ãðàôè÷åñêèå àëãîðèòìû íà îñíîâå OPENGL108âàíèÿ¿. Îáùèé àëãîðèòì ðåøåíèÿ ñ èñïîëüçîâàíèåì áóôåðà ìàñêè òàêîâ:1) î÷èùàåì áóôåð ìàñêè çíà÷åíèåì 0;2) îòîáðàæàåìçàäàííóþîáëàñòüîòñå÷åíèÿ,óñòàíàâëèâàÿçíà÷åíèÿ â áóôåðå ìàñêè â 1;3) ðèñóåì òåíè â òåõ îáëàñòÿõ, ãäå â áóôåðå ìàñêè óñòàíîâëåíû çíà÷åíèÿ; åñëè òåñò ïðîõîäèò, óñòàíàâëèâàåì â ýòèîáëàñòè çíà÷åíèå 2.Òåïåðü ðàññìîòðèì ýòè ýòàïû áîëåå ïîäðîáíî.1./* î÷èùàåì áóôåð ìàñêè*/g l C l e a r S t e n c i l (0 x0 )g l C l e a r (GL_STENCIL_BUFFER_BIT) ;/* âêëþ÷àåì òåñò */glEnable (GL_STENCIL_TEST) ;2./* óñëîâèå â ñ å ã ä à âûïîëíåíî èçíà÷åíèå â áóôåðå áóäåò ðàâíî 1 */g l S t e n c i l F u n c (GL_ALWAYS, 0x1 , 0 x f f f f f f f f ) ;/* â ëþáîì ñëó÷àå çàìåíÿåì çíà÷åíèå â áóôåðå ìàñêè*/g l S t e n c i l O p (GL_REPLACE, GL_REPLACE, GL_REPLACE) ;/* âûâîäèì ãåîìåòðèþ , ïî êîòîðîéçàòåì áóäåò îòñå÷åíà òåíü*/RenderPlane ( ) ;3./* óñëîâèå âûïîëíåíî è òåñò äàåò èñòèíó òîëüêîåñëè çíà÷åíèå â áóôåðå ìàñêè ðàâíî 1 */8.3.
Çåðêàëüíûå îòðàæåíèÿ109g l S t e n c i l F u n c (GL_EQUAL, 0x1 , 0 x f f f f f f f f ) ;/* çíà÷åíèå â áóôåðå ðàâíî 2 , åñëè òåíü óæå âûâåäåíà */g l S t e n c i l O p (GL_KEEP, GL_KEEP, GL_INCR) ;/* âûâîäèì òåíè */RenderShadow ( ) ;Ñòðîãî ãîâîðÿ, äàæå ïðè ïðèìåíåíèè ìàñêèðîâàíèÿ îñòàþòñÿ íåêîòîðûå ïðîáëåìû, ñâÿçàííûå ñ ðàáîòîé z-áóôåðà.  ÷àñòíîñòè, íåêîòîðûå ó÷àñòêè òåíåé ìîãóò ñòàòü íåâèäèìûìè. Äëÿðåøåíèÿ ýòîé ïðîáëåìû ìîæíî íåìíîãî ïðèïîäíÿòü òåíè íàäïëîñêîñòüþ c ïîìîùüþ ìîäèôèêàöèè óðàâíåíèÿ, îïèñûâàþùåãîïëîñêîñòü.
Îïèñàíèå äðóãèõ ìåòîäîâ âûõîäèò çà ðàìêè äàííîãîïîñîáèÿ.8.3. Çåðêàëüíûå îòðàæåíèÿ ýòîì ðàçäåëå ìû ðàññìîòðèì àëãîðèòì ïîñòðîåíèÿ îòðàæåíèé îò ïëîñêèõ îáúåêòîâ. Òàêèå îòðàæåíèÿ ïðèäàþò áîëüøóþ äîñòîâåðíîñòü ïîñòðîåííîìó èçîáðàæåíèþ è èõ îòíîñèòåëüíî ëåãêî ðåàëèçîâàòü.Àëãîðèòì èñïîëüçóåò èíòóèòèâíîå ïðåäñòàâëåíèå ïîëíîé ñöåíû ñ çåðêàëîì êàê ñîñòàâëåííîé èç äâóõ: ¾íàñòîÿùåé¿ è ¾âèðòóàëüíîé¿ íàõîäÿùåéñÿ çà çåðêàëîì.
Ñëåäîâàòåëüíî, ïðîöåññðèñîâàíèÿ îòðàæåíèé ñîñòîèò èç äâóõ ÷àñòåé: 1) âèçóàëèçàöèèîáû÷íîé ñöåíû è 2) ïîñòðîåíèÿ è âèçóàëèçàöèè âèðòóàëüíîé.Äëÿ êàæäîãî îáúåêòà ¾íàñòîÿùåé¿ ñöåíû ñòðîèòñÿ åãî îòðàæåííûé äâîéíèê, êîòîðûé íàáëþäàòåëü è óâèäèò â çåðêàëå.Äëÿ èëëþñòðàöèè ðàññìîòðèì êîìíàòó ñ çåðêàëîì íà ñòåíå.Êîìíàòà è îáúåêòû, íàõîäÿùèåñÿ â íåé, âûãëÿäÿò â çåðêàëå òàê,êàê åñëè áû çåðêàëî áûëî îêíîì, à çà íèì áûëà áû åùå îäíà òàêàÿ æå êîìíàòà ñ òåì æå îáúåêòàìè, íî ñèììåòðè÷íî îòðàæåííûìè îòíîñèòåëüíî ïëîñêîñòè, ïðîâåäåííîé ÷åðåç ïîâåðõíîñòüÃëàâà 8. Ãðàôè÷åñêèå àëãîðèòìû íà îñíîâå OPENGL110Ðèñ. 8.1. Çåðêàëüíîå îòðàæåíèåçåðêàëà.Óïðîùåííûé âàðèàíò àëãîðèòìà ñîçäàíèÿ ïëîñêîãî îòðàæåíèÿ ñîñòîèò èç ñëåäóþùèõ øàãîâ:1) Ðèñóåì ñöåíó êàê îáû÷íî, íî áåç îáúåêòîâ-çåðêàë.2) Èñïîëüçóÿ áóôåð ìàñêè, îãðàíè÷èâàåì äàëüíåéøèé âûâîäïðîåêöèåé çåðêàëà íà ýêðàí.3) Âèçóàëèçèðóåì ñöåíó, îòðàæåííóþ îòíîñèòåëüíî ïëîñêîñòèçåðêàëà.
Ïðè ýòîì áóôåð ìàñêè ïîçâîëèò îãðàíè÷èòü âûâîäôîðìîé ïðîåêöèè îáúåêòà-çåðêàëà.Ýòà ïîñëåäîâàòåëüíîñòü äåéñòâèé ïîçâîëèò ïîëó÷èòü óáåäèòåëüíûé ýôôåêò îòðàæåíèÿ.Ðàññìîòðèì ýòàïû áîëåå ïîäðîáíî.Ñíà÷àëà íåîáõîäèìî íàðèñîâàòü ñöåíó êàê îáû÷íî. Íå áóäåì îñòàíàâëèâàòüñÿ íà ýòîì ýòàïå ïîäðîáíî.