Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 11
Текст из файла (страница 11)
Íà ýêðàíå ìîæåòïîÿâèòüñÿ èíôîðìàöèÿ òîëüêî èç áóôåðîâ öâåòà.Áóôåð ãëóáèíû èñïîëüçóåòñÿ äëÿ óäàëåíèÿ íåâèäèìûõ ïîâåðõíîñòåé è ïðÿìàÿ ðàáîòà ñ íèì òðåáóåòñÿ êðàéíå ðåäêî.Áóôåð-íàêîïèòåëü ìîæíî ïðèìåíÿòü äëÿ ðàçëè÷íûõ îïåðàöèé. Áîëåå ïîäðîáíî ðàáîòà ñ íèì îïèñàíà â ðàçäåëå 7.2.Áóôåð ìàñêè èñïîëüçóåòñÿ äëÿ ôîðìèðîâàíèÿ ïèêñåëüíûõìàñîê (òðàôàðåòîâ), ñëóæàùèõ äëÿ âûðåçàíèÿ èç îáùåãî ìàññèâà òåõ ïèêñåëåé, êîòîðûå ñëåäóåò âûâåñòè íà ýêðàí. Áóôåð ìàñêèè ðàáîòà ñ íèì áîëåå ïîäðîáíî ðàññìîòðåíû â ðàçäåëàõ 7.3, 8.2è 8.3.7.1. Ñìåøèâàíèå èçîáðàæåíèé è ïðîçðà÷íîñòüÐàçíîîáðàçíûåïðîçðà÷íûåîáúåêòû ñòåêëà,ïðîçðà÷íàÿïîñóäà è ò.ä. ÷àñòî âñòðå÷àþòñÿ â ðåàëüíîñòè, ïîýòîìó âàæíî óìåòü ñîçäàâàòü òàêèå îáúåêòû â èíòåðàêòèâíîé ãðàôèêå.OpenGL ïðåäîñòàâëÿåò ïðîãðàììèñòó ìåõàíèçì ðàáîòû ñ ïîëóïðîçðà÷íûìè îáúåêòàìè, êîòîðûé è áóäåò êðàòêî îïèñàí â ýòîìðàçäåëå.Ïðîçðà÷íîñòü ðåàëèçóåòñÿ ñ ïîìîùüþ ñïåöèàëüíîãî ðåæèìà ñìåøèâàíèÿ öâåòîâ (blending).
Àëãîðèòì ñìåøèâàíèÿ êîìáèíèðóåò öâåòà òàê íàçûâàåìûõ âõîäÿùèõ ïèêñåëåé (ò.å. ¾êàíäèäàòîâ¿ íà ïîìåùåíèå â áóôåð êàäðà) ñ öâåòàìè ñîîòâåòñòâóþùèõ ïèêñåëåé, óæå õðàíÿùèõñÿ â áóôåðå. Äëÿ ñìåøèâàíèÿèñïîëüçóåòñÿ ÷åòâåðòàÿ êîìïîíåíòà öâåòà àëüôà-êîìïîíåíòà,7.1. Ñìåøèâàíèå èçîáðàæåíèé è ïðîçðà÷íîñòü91ïîýòîìó ýòîò ðåæèì íàçûâàþò åùå àëüôà-ñìåøèâàíèåì. Ïðîãðàììà ìîæåò óïðàâëÿòü èíòåíñèâíîñòüþ àëüôà-êîìïîíåíòûòî÷íî òàê æå, êàê è èíòåíñèâíîñòüþ îñíîâíûõ öâåòîâ, ò.å.
çàäàâàòü çíà÷åíèå èíòåíñèâíîñòè äëÿ êàæäîãî ïèêñåëÿ èëè êàæäîéâåðøèíû ïðèìèòèâà. Ðåæèì âêëþ÷àåòñÿ ñ ïîìîùüþ êîìàíäûglEnable(GL_BLEND).Îïðåäåëèòü ïàðàìåòðû ñìåøèâàíèÿ ìîæíî ñ ïîìîùüþ êîìàíäû:void glBlendFunc (enum src , enum dst )Ïàðàìåòðsrcîïðåäåëÿåò êàê ïîëó÷èòü êîýôôèöèåíòõîäíîãî öâåòà ïèêñåëÿ, aöèåíòàk2dstk1èñ-çàäàåò ñïîñîá ïîëó÷åíèÿ êîýôôè-äëÿ öâåòà â áóôåðå êàäðà. Äëÿ ïîëó÷åíèÿ ðåçóëüòè-res = csrc ∗k1 + cdst ∗ k2 , ãäå csrc öâåò èñõîäíîãî ïèêñåëÿ, cdst öâåò ïèêñåëÿ â áóôåðå êàäðà (res, k1 , k1 , csrc , cdst ÷åòûðåõêîìïîíåíòíûåðóþùåãî öâåòà èñïîëüçóåòñÿ ñëåäóþùàÿ ôîðìóëà:RGBA-âåêòîðû).srcÏðèâåäåì íàèáîëåå ÷àñòî èñïîëüçóåìûå çíà÷åíèÿ àãðóìåíòîâèdst.GL_SRC_ALPHAk = (As , As , As , As )GL_SRC_ONE_MINUS_ALPHAk = (1, 1, 1, 1) − (As , As , As , As )GL_DST_COLORk = (Rd , Gd , Bd )GL_ONE_MINUS_DST_COLORk = (1, 1, 1, 1) − (Rd , Gd , Bd , d )GL_DST_ALPHAk = (Ad , A − d, A − d, Ad )GL_DST_ONE_MINUS_ALPHAk = (1, 1, 1, 1) − (Ad , Ad , Ad , Ad )Ãëàâà 7.
Îïåðàöèè ñ ïèêñåëÿìè92GL_SRC_COLORk = (Rs, Gs, Bs)GL_ONE_MINUS_SRC_COLORk = (1, 1, 1, 1) − (Rs , Gs , Bs , As )Ïðèìåð: ïðåäïîëîæèì, ìû õîòèì ðåàëèçîâàòü âûâîä ïðîçðà÷íûõ îáúåêòîâ. Êîýôôèöèåíò ïðîçðà÷íîñòè çàäàåòñÿ àëüôàêîìïîíåíòîé öâåòà. Ïóñòü 1 íåïðîçðà÷íûé îáúåêò; 0 àáñîëþòíî ïðîçðà÷íûé, ò.å. íåâèäèìûé. Äëÿ ðåàëèçàöèè ñëóæèò ñëåäóþùèé êîä:glEnable (GL_BLEND) ;glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;Íàïðèìåð, ïîëóïðîçðà÷íûé òðåóãîëüíèê ìîæíî çàäàòü ñëåäóþùèì îáðàçîì:glColor3f (1.0 , 0.0 , 0.0 , 0.5);g l B e g i n (GL_TRIANGLES) ;glVertex3f (0.0 , 0.0 , 0 .
0 ) ;glVertex3f (1.0 , 0.0 , 0 . 0 ) ;glVertex3f (1.0 , 1.0 , 0 . 0 ) ;glEnd ( ) ;Åñëè â ñöåíå åñòü íåñêîëüêî ïðîçðà÷íûõ îáúåêòîâ, êîòîðûåìîãóò ïåðåêðûâàòü äðóã äðóãà, êîððåêòíûé âûâîä ìîæíî ãàðàíòèðîâàòü òîëüêî â ñëó÷àå âûïîëíåíèÿ ñëåäóþùèõ óñëîâèé:âñå ïðîçðà÷íûå îáúåêòû âûâîäÿòñÿ ïîñëå íåïðîçðà÷íûõ;ïðè âûâîäå îáúåêòû ñ ïðîçðà÷íîñòüþ äîëæíû áûòü óïîðÿäî÷åíû ïî óìåíüøåíèþ ãëóáèíû, ò.å.
âûâîäèòüñÿ, íà÷èíàÿñ íàèáîëåå îòäàëåííûõ îò íàáëþäàòåëÿ. OpenGL êîìàíäû îáðàáàòûâàþòñÿ â ïîðÿäêå èõ ïîñòóïëåíèÿ, ïîýòîìó äëÿ ðåàëèçàöèè ïåðå÷èñëåííûõ òðåáîâàíèé äîñòàòî÷íî ðàññòàâèòü â ñîîòâåòñòâóþùåì ïîðÿäêå âûçîâû êîìàíäglVertex,íî è ýòî â îáùåì ñëó÷àå íåòðèâèàëüíî.7.2. Áóôåð-íàêîïèòåëü937.2. Áóôåð-íàêîïèòåëüÁóôåð-íàêîïèòåëü (accumulation buer) ýòî îäèí èç äîïîëíèòåëüíûõ áóôåðîâ OpenGL.
 íåì ìîæíî ñîõðàíÿòü âèçóàëèçèðîâàííîå èçîáðàæåíèå, ïðèìåíÿÿ ïðè ýòîì ïîïèêñåëüíî ñïåöèàëüíûå îïåðàöèè. Áóôåð-íàêîïèòåëü øèðîêî èñïîëüçóåòñÿ äëÿñîçäàíèÿ ðàçëè÷íûõ ñïåöýôôåêòîâ.Èçîáðàæåíèå áåðåòñÿ èç áóôåðà, âûáðàííîãî íà ÷òåíèå êîìàíäîévoid glReadBuffer (enum buf )buf îïðåäåëÿåò áóôåð äëÿ ÷òåíèÿ. Çíà÷åíèÿ buf,ðàâíûå GL_BACK, GL_FRONT, îïðåäåëÿþò ñîîòâåòñòâóþùèåáóôåðû öâåòà äëÿ ÷òåíèÿ.
GL_BACK çàäàåò â êà÷åñòâå èñòî÷íèêà ïèêñåëåé âíåýêðàííûé áóôåð; GL_FRONT òåêóùåå ñîäåðÀðãóìåíòæèìîå îêíà âûâîäà. Êîìàíäà èìååò çíà÷åíèå, åñëè èñïîëüçóåòñÿäóáëèðóþùàÿ áóôåðèçàöèÿ.  ïðîòèâíîì ñëó÷àå èñïîëüçóåòñÿòîëüêî îäèí áóôåð, ñîîòâåòñòâóþùèé îêíó âûâîäà (ñòðîãî ãîâîðÿ, OpenGL èìååò íàáîð äîïîëíèòåëüíûõ áóôåðîâ, èñïîëüçóåìûõ, â ÷àñòíîñòè, äëÿ ðàáîòû ñî ñòåðåîèçîáðàæåíèÿìè, íî çäåñüìû èõ ðàññìàòðèâàòü íå áóäåì).Áóôåð-íàêîïèòåëü ÿâëÿåòñÿ äîïîëíèòåëüíûì áóôåðîì öâåòà.Îí íå èñïîëüçóåòñÿ íåïîñðåäñòâåííî äëÿ âûâîäà îáðàçîâ, íî îíèäîáàâëÿþòñÿ â íåãî ïîñëå âûâîäà â îäèí èç áóôåðîâ öâåòà. Ïðèìåíÿÿ ðàçëè÷íûå îïåðàöèè, îïèñàííûå íèæå, ìîæíî ïîíåìíîãó¾íàêàïëèâàòü¿ èçîáðàæåíèå â áóôåðå.Çàòåì ïîëó÷åííîå èçîáðàæåíèå ïåðåíîñèòñÿ èç áóôåðà-íàêîïèòåëÿ â îäèí èç áóôåðîâ öâåòà, âûáðàííûé íà çàïèñü êîìàíäîévoid glDrawBuffer (enum buf )Çíà÷åíèåbufìåíòà â êîìàíäåàíàëîãè÷íî çíà÷åíèþ ñîîòâåòñòâóþùåãî àðãó-glReadBuer.Âñå îïåðàöèè ñ áóôåðîì-íàêîïèòåëåì êîíòðîëèðóþòñÿ êîìàíäîéÃëàâà 7.
Îïåðàöèè ñ ïèêñåëÿìè94void glAccum (enum op , GLfloat value )Àðãóìåíòopçàäàåò îïåðàöèþ íàä ïèêñåëÿìè è ìîæåò ïðè-íèìàòü ñëåäóþùèå çíà÷åíèÿ: ïèêñåëü áåðåòñÿ èç áóôåðà, âûáðàííîãî íà ÷òå-GL_LOADíèå, åãî çíà÷åíèå óìíîæàåòñÿ íà value è çàíîñèòñÿ â áóôåðíàêîïèòåëü;GL_ACCUM àíàëîãè÷íî ïðåäûäóùåìó, íî ïîëó÷åííîå ïî-ñëå óìíîæåíèÿ çíà÷åíèå ñêëàäûâàåòñÿ ñ óæå èìåþùèìñÿ âáóôåðå;GL_MULT ýòà îïåðàöèÿ óìíîæàåò çíà÷åíèå êàæäîãî ïèê-ñåëÿ â áóôåðå íàêîïëåíèÿ íà value;GL_ADD àíàëîãè÷íî ïðåäûäóùåìó, òîëüêî âìåñòî óìíîæå-íèÿ èñïîëüçóåòñÿ ñëîæåíèå;GL_RETURN Èçîáðàæåíèå ïåðåíîñèòñÿ èç áóôåðà íàêî-ïèòåëÿ â áóôåð, âûáðàííûé äëÿ çàïèñè. Ïåðåä ýòèì çíà÷åíèå êàæäîãî ïèêñåëÿ óìíîæàåòñÿ íà value.Ñëåäóåò îòìåòèòü, ÷òî äëÿ èñïîëüçîâàíèÿ áóôåðà-íàêîïèòåëÿ íåò íåîáõîäèìîñòè âûçûâàòü êàêèå-ëèáî êîìàíäûglEnable.Äîñòàòî÷íî èíèöèàëèçèðîâàòü òîëüêî ñàì áóôåð.Ïðèìåð èñïîëüçîâàíèÿ áóôåðà-íàêîïèòåëÿ äëÿ óñòðàíåíèÿïîãðåøíîñòåé ðàñòåðèçàöèè (ñòóïåí÷àòîñòè) ïðèâåäåí â ðàçäåëå 8.1.7.3.
Áóôåð ìàñêèÏðè âûâîäå ïèêñåëåé â áóôåð êàäðà èíîãäà âîçíèêàåò íåîáõîäèìîñòü âûâîäèòü íå âñå ïèêñåëè, à òîëüêî íåêîòîðîå ïîäìíîæåñòâî, ò.å. íàëîæèòü òðàôàðåò (ìàñêó) íà èçîáðàæåíèå. Äëÿ ýòîãî OpenGL ïðåäîñòàâëÿåò òàê íàçûâàåìûé áóôåð ìàñêè (stencil7.3. Áóôåð ìàñêè95buer). Êðîìå íàëîæåíèÿ ìàñêè, ýòîò áóôåð ïðåäîñòàâëÿåò åùåíåñêîëüêî èíòåðåñíûõ âîçìîæíîñòåé.Ïðåæäå ÷åì ïîìåñòèòü ïèêñåëü â áóôåð êàäðà, ìåõàíèçì âèçóàëèçàöèè OpenGL ïîçâîëÿåò âûïîëíèòü ñðàâíåíèå (òåñò) ìåæäó çàäàííûì çíà÷åíèåì è çíà÷åíèåì â áóôåðå ìàñêè. Åñëè òåñòïðîõîäèò, ïèêñåëü ðèñóåòñÿ â áóôåðå êàäðà.Ìåõàíèçì ñðàâíåíèÿ âåñüìà ãèáîê è êîíòðîëèðóåòñÿ ñëåäóþùèìè êîìàíäàìè:void g l S t e n c i l F u n c (enum func , int r e f , u i n t mask )void g l S t e n c i l O p (enum s f a i l , enum d p f a i l ,enum dppass )ÀðãóìåíòrefêîìàíäûglStencilFunc çàäàåò çíà÷åíèå äëÿ ñðàâ-íåíèÿ.
Îí äîëæåí ïðèíèìàòü çíà÷åíèå îò 0 äî2s − 1,ãäås÷èñëî áèò íà òî÷êó â áóôåðå ìàñêè.Ñ ïîìîùüþ àðãóìåíòàfuncçàäàåòñÿ ôóíêöèÿ ñðàâíåíèÿ. Îíìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ:GL_NEVER òåñò íèêîãäà íå ïðîõîäèò, ò.å. âñåãäà âîçâðà-ùàåò false;GL_ALWAYS òåñò ïðîõîäèò âñåãäà;GL_LESS, GL_LEQUAL, GL_EQUALGL_GEQUAL, GL_GREATE, GL_NOTEQUALïðîõîäèò â ñëó÷àå, åñëèref òåñòñîîòâåòñòâåííî ìåíüøå çíà÷å-íèÿ â áóôåðå ìàñêè, ìåíüøå ëèáî ðàâåí, ðàâåí, áîëüøå,áîëüøå ëèáî ðàâåí, èëè íå ðàâåí.Àðãóìåíò mask çàäàåò ìàñêó äëÿ çíà÷åíèé. Ò.å.
â èòîãå äëÿýòîãî òåñòà ïîëó÷àåì ñëåäóþùóþ ôîðìóëó: ((ref AND mask) op(svalue AND mask)).ÊîìàíäàglStencilOp ïðåäíàçíà÷åíà äëÿ îïðåäåëåíèÿ äåéñòâèéíàä ïèêñåëåì áóôåðà ìàñêè â ñëó÷àå ïîëîæèòåëüíîãî èëè îòðèöàòåëüíîãî ðåçóëüòàòà òåñòà.Ãëàâà 7. Îïåðàöèè ñ ïèêñåëÿìè96Àðãóìåíòsfailçàäàåò äåéñòâèå â ñëó÷àå îòðèöàòåëüíîãî ðå-çóëüòàòà òåñòà, è ìîæåò ïðèíèìàòü ñëåäóþùèå çíà÷åíèÿ:GL_KEEP, GL_ZERO, GL_REPLACE, GL_INCRGL_DECR, GL_INVERT ñîîòâåòñòâåííî ñîõðàíÿåò çíà-÷åíèå â áóôåðå ìàñêè, îáíóëÿåò åãî, çàìåíÿåò íà çàäàííîåçíà÷åíèå (ref ),óâåëè÷èâàåò, óìåíüøàåò èëè ïîáèòîâî èí-âåðòèðóåò.Àðãóìåíòû dpfail îïðåäåëÿþò äåéñòâèÿ â ñëó÷àå îòðèöàòåëüíîãî ðåçóëüòàòà òåñòà íà ãëóáèíó â z-áóôåðå, à dppass çàäàåòäåéñòâèå â ñëó÷àå ïîëîæèòåëüíîãî ðåçóëüòàòà ýòîãî òåñòà.
Àðãóìåíòû ïðèíèìàþò òå æå çíà÷åíèÿ, ÷òî è àðãóìåíò sfail. Ïîóìîë÷àíèþ âñå òðè ïàðàìåòðà óñòàíîâëåíû íà GL_KEEP.Äëÿ âêëþ÷åíèÿ ìàñêèðîâàíèÿ íåîáõîäèìî âûïîëíèòü êîìàí-äóglEnable(GL_STENCIL_TEST);Áóôåð ìàñêè èñïîëüçóåòñÿ ïðè ñîçäàíèè òàêèõ ñïåöýôôåêòîâ, êàê ïàäàþùèå òåíè, îòðàæåíèÿ, ïëàâíûå ïåðåõîäû èç îäíîéêàðòèíêè â äðóãóþ è ïð.Ïðèìåð èñïîëüçîâàíèÿ áóôåðà ìàñêè ïðè ïîñòðîåíèè òåíåéè îòðàæåíèé ïðèâåäåí â ðàçäåëàõ 8.2 è 8.3.7.4. Óïðàâëåíèå ðàñòåðèçàöèåéÑïîñîá âûïîëíåíèÿ ðàñòåðèçàöèè ïðèìèòèâîâ ìîæíî ÷àñòè÷íî ðåãóëèðîâàòü êîìàíäîéglHint (target , mode),ãäå target âèäêîíòðîëèðóåìûõ äåéñòâèé, ïðèíèìàþùèé îäíî èç ñëåäóþùèõçíà÷åíèé:GL_FOG_HINT òî÷íîñòü âû÷èñëåíèé ïðè íàëîæåíèè òó-ìàíà.
Âû÷èñëåíèÿ ìîãóò âûïîëíÿòüñÿ ïî ïèêñåëÿì (íàèáîëüøàÿ òî÷íîñòü) èëè òîëüêî â âåðøèíàõ. Åñëè ðåàëèçàöèÿ OpenGL íå ïîääåðæèâàåò ïîïèêñåëüíîãî âû÷èñëåíèÿ,òî âûïîëíÿåòñÿ òîëüêî âû÷èñëåíèå ïî âåðøèíàì;7.4. Óïðàâëåíèå ðàñòåðèçàöèåéGL_LINE_SMOOTH_HINT97 óïðàâëåíèå êà÷åñòâîì ïðÿ-ìûõ. Ïðè çíà÷åíèè mode, ðàâíûì GL_NICEST, óìåíüøàåòñÿ ñòóïåí÷àòîñòü ïðÿìûõ çà ñ÷åò áîëüøåãî ÷èñëà ïèêñåëåé â ïðÿìûõ;GL_PERSPECTIVE_CORRECTION_HINT òî÷íîñòüèíòåðïîëÿöèè êîîðäèíàò ïðè âû÷èñëåíèè öâåòîâ è íàëîæåíèè òåêñòóðû. Åñëè ðåàëèçàöèÿ OpenGL íå ïîääåðæèâàåòðåæèì GL_NICEST, òî îñóùåñòâëÿåòñÿ ëèíåéíàÿ èíòåðïîëÿöèÿ êîîðäèíàò;GL_POINT_SMOOTH_HINT óïðàâëåíèå êà÷åñòâîì òî-÷åê.