Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 3
Текст из файла (страница 3)
ÌàòåðèàëûÎñíîâíûìè êðèòåðèÿìè âûáîðà òîé èëè èíîé ìîäåëè ìàòåðèàëà äëÿ ïîâåðõíîñòè îáúåêòà ÿâëÿþòñÿ òðåáîâàíèÿ ïî ðåàëèñòè÷íîñòè ïîëó÷àåìîãî èçîáðàæåíèÿ è ñêîðîñòè ðàáîòû àëãîðèòìà ýêðàíèçàöèè. Ìîäåëü îñâåùåíèÿ ïðèìåíÿåòñÿ äëÿ êàæäîãîïèêñåëÿ ïîëó÷àåìîãî èçîáðàæåíèÿ, ïîýòîìó äëÿ çàäà÷, òðåáóþùèõ èíòåðàêòèâíîãî âçàèìîäåéñòâèÿ ïðîãðàììû ñ ïîëüçîâàòåëåì, îáû÷íî âûáèðàþòñÿ ïðîñòûå ìîäåëè.OpenGL èçíà÷àëüíî ðàçðàáàòûâàëàñü êàê áèáëèîòåêà äëÿïðîãðàììèðîâàíèÿ èíòåðàêòèâíûõ ãðàôè÷åñêèõ ïðèëîæåíèé, â22Ãëàâà 1. Ãðàôè÷åñêèé ïðîöåññ è OPENGLíåé âñòðîåíà îäíà èç ñàìûõ ïðîñòûõ ìîäåëåé ìàòåðèàëà ìîäåëü Ôîíãà.
Òàêæå OpenGL ïîääåðæèâàåò íàëîæåíèå òåêñòóð. Âñîâîêóïíîñòè ýòî ïîçâîëÿåò äîáèâàòüñÿ äîñòàòî÷íî ðåàëèñòè÷íîé ïåðåäà÷è ñâîéñòâ ¾ïðîñòûõ¿ ìàòåðèàëîâ òèïà ïëàñòèêà, äåðåâà è ò.ï. Ïîäðîáíî âîïðîñ ïðîãðàììèðîâàíèÿ ìàòåðèàëîâ âOpenGL ðàññìàòðèâàåòñÿ â ãëàâå 5.1.5. ÎñâåùåíèåÌîäåëü îñâåùåíèÿ íåîòäåëèìà îò ìîäåëè ìàòåðèàëà, ïîýòîìó ïðèíöèïû åå âûáîðà îïðåäåëÿþòñÿ òåìè æå òðåáîâàíèÿìè. ðåàëüíîì ìèðå ìû ñòàëêèâàåìñÿ ñ êðàéíå ñëîæíûìè äëÿ ìîäåëèðîâàíèÿ óñëîâèÿìè îñâåùåíèÿ ïðîòÿæåííûìè èñòî÷íèêàìè ñâåòà (íåáî, ëþìèíåñöåíòíûå ëàìïû), âòîðè÷íûì îñâåùåíèåì(îñâåùåíèåì îò îòðàæàþùèõ ïîâåðõíîñòåé) è ò.ï.Ñòàíäàðò OpenGL ïîääåðæèâàåò òî÷å÷íûå è ïàðàëëåëüíûåèñòî÷íèêè ñâåòà, öâåò (ìîùíîñòü) êîòîðûõ çàäàåòñÿ â öâåòîâîé ñèñòåìå RGB (Red-Green-Blue).
Íå ïîääåðæèâàþòñÿ ïðîòÿæåííûå èñòî÷íèêè, ñïåêòðàëüíîå çàäàíèå ìîùíîñòè èñòî÷íèêîâ,âòîðè÷íîå îñâåùåíèå. Îäíàêî ñóùåñòâóþò àëãîðèòìè÷åñêèå ïðèåìû, ïîçâîëÿþùèå ìîäåëèðîâàòü è ýòè ýôôåêòû ñ ïîìîùüþ âîçìîæíîñòåé OpenGL. Êðîìå ýòîãî, âñåãäà âîçìîæíî èñïîëüçîâàòüêà÷åñòâåííûå àëãîðèòìû äëÿ ïðîñ÷åòà îñâåùåíèÿ è ïåðåäàâàòüOpenGL óæå âû÷èñëåííûå öâåòà òî÷åê, ÷òî ïîçâîëÿåò çàäåéñòâîâàòü àïïàðàòíûå âîçìîæíîñòè äëÿ îáðàáîòêè ãåîìåòðèè.1.6.
Âèðòóàëüíàÿ êàìåðàÏàðàìåòðû âèðòóàëüíîé êàìåðû îïðåäåëÿþò ñïîñîá îòîáðàæåíèÿ òðåõìåðíûõ îáúåêòîâ â èõ äâóõìåðíîå èçîáðàæåíèå. Ñóùåñòâóåò äîñòàòî÷íî áîëüøîå êîëè÷åñòâî ðàçíîîáðàçíûõ ìîäåëåé êàìåð, ðàçëè÷àþùèåñÿ ñâîéñòâàìè ïðîåêöèè è ó÷åòîì õà-1.7. Àëãîðèòì ýêðàíèçàöèè23ðàêòåðèñòèê ðåàëüíûõ îïòè÷åñêèõ ñèñòåì (ôîòîêàìåð, ÷åëîâå÷åñêîãî ãëàçà). OpenGL ïîääåðæèâàåòñÿ äîñòàòî÷íî øèðîêèé êëàññ ìîäåëåé êàìåð, îïèñûâàåìûé ëèíåéíûì ïðåîáðàçîâàíèåì â îäíîðîäíûõ êîîðäèíàòàõ [15]. Ýòîò êëàññ îãðàíè÷åí ìîäåëèðîâàíèåìêàìåð ñ áåñêîíå÷íî ìàëûì ðàçìåðîì äèàôðàãìû (íåò âîçìîæíîñòè ïåðåäà÷è ãëóáèíû ðåçêîñòè) è ëèíåéíûìè õàðàêòåðèñòèêàìèïðîåêöèè (íåò âîçìîæíîñòè ìîäåëèðîâàíèÿ íåëèíåéíûõ èñêàæåíèé).1.7.
Àëãîðèòì ýêðàíèçàöèèÇà âðåìÿ ðàçâèòèÿ êîìïüþòåðíîé ãðàôèêè áûëî ñîçäàíî ìíîæåñòâî àëãîðèòìîâ ýêðàíèçàöèè, îáëàäàþùèõ ðàçëè÷íûìè õàðàêòåðèñòèêàìè ïî ñòåïåíè ðåàëèñòè÷íîñòè èçîáðàæåíèÿ è ñêîðîñòè ðàáîòû.  íàñòîÿùåå âðåìÿ îñíîâíûìè ÿâëÿþòñÿ äâà âîìíîãîì ïðîòèâîïîëîæíûõ íàïðàâëåíèÿ òðàññèðîâêà ëó÷åé èðàñòåðèçàöèÿ.Àëãîðèòìû òðàññèðîâêè ëó÷åé îñíîâàíû íà ïðîñëåæèâàíèè(òðàññèðîâêå) ðàñïðîñòðàíåíèÿ ñâåòîâîé ýíåðãèè îò èñòî÷íèêîâñâåòà äî ïîïàäàíèÿ íà ñåò÷àòêó ãëàçà âèðòóàëüíîãî íàáëþäàòåëÿ(ðåçóëüòèðóþùåå èçîáðàæåíèå). Òðàññèðîâêà ëó÷åé è ñìåæíûåàëãîðèòìû â îñíîâíîì èñïîëüçóþòñÿ äëÿ ïîëó÷åíèÿ ôîòîðåàëèñòè÷íûõ èçîáðàæåíèé.
 ñèëó àëãîðèòìè÷åñêîé ñëîæíîñòè íàäàííûé ìîìåíò ýòè àëãîðèòìû íå ïîëó÷èëè ðàñïðîñòðàíåíèÿ âçàäà÷àõ èíòåðàêòèâíîãî ñèíòåçà èçîáðàæåíèé, ãäå â îñíîâíîìèñïîëüçóþòñÿ ïîäõîäû íà îñíîâå ðàñòåðèçàöèè.Àëãîðèòìû ðàñòåðèçàöèè ñòðîÿò èçîáðàæåíèå ñ ïîìîùüþïðåîáðàçîâàíèÿ ãåîìåòðè÷åñêîé ìîäåëè òàêèì ñïîñîáîì, ÷òîáûèìèòèðîâàòü ïàðàìåòðû èñïîëüçóåìîé ìîäåëè êàìåðû.
Ò.å. äëÿêàæäîé òî÷êè(x, y, z)ìîäåëè âûïîëíÿåòñÿ ïðåîáðàçîâàíèå(îáû÷íî ëèíåéíîå), òàêîå, ÷òî(xs , ys ) = T (x, y, z),ãäåT(xs , ys ) êîîðäèíàòû ñïðîåöèðîâàííîé òî÷êè íà ýêðàíå.  ñëó÷àå ïîëè-Ãëàâà 1. Ãðàôè÷åñêèé ïðîöåññ è OPENGL24ãîíàëüíîé ìîäåëè ïðåîáðàçîâàíèå âûïîëíÿåòñÿ äëÿ êàæäîé âåðøèíû ïîëèãîíà, ïîñëå ÷åãî ïîëó÷àåìàÿ ïðîåêöèÿ ïåðåâîäèòñÿâ ðàñòð íà ðåçóëüòèðóþùåé êàðòèíêå. Îñâåùåíèå âû÷èñëÿåòñÿ îòäåëüíî îò ïðåîáðàçîâàíèé, îáû÷íî ñ ïîìîùüþ äîñòàòî÷íîïðîñòîé ìîäåëè.OpenGL îñíîâàíà íà ýêðàíèçàöèè ñ ïîìîùüþ ðàñòåðèçàöèè.Îðèåíòèðîâàííîñòü íà ïîëèãîíàëüíûå ìîäåëè âêóïå ñ èñïîëüçîâàíèåì ëèíåéíîé ìîäåëè êàìåðû ïîçâîëÿåò îïèñàòü âåñü àëãîðèòì ýêðàíèçàöèè â òåðìèíàõ àëãåáðû ìàòðèö è âåêòîðîâ 4-ãîïîðÿäêà â åâêëèäîâîì ïðîñòðàíñòâå.
 ñâîþ î÷åðåäü, ýòî ïîçâîëèëî ïåðåíåñòè áîëüøóþ ÷àñòü îïåðàöèé àëãîðèòìà íà ñïåöèàëèçèðîâàííûå ãðàôè÷åñêèå ïðîöåññîðû (â íàñòîÿùåå âðåìÿñòàâøèå ñòàíäàðòîì).Òàêèì îáðàçîì, àëãîðèòì ýêðàíèçàöèè OpenGL îðèåíòèðîâàí íà èíòåðàêòèâíûå ïðèëîæåíèÿ ñ äîñòàòî÷íî îãðàíè÷åííîéïîääåðæêîé ìîäåëåé ìàòåðèàëîâ è îñâåùåíèÿ. Îäíàêî, â ñèëóïðîñòîòû è ãèáêîñòè ñòàíäàðòà áèáëèîòåêè, ñ ïîìîùüþ åå áàçîâûõ ôóíêöèé âîçìîæíî ðåàëèçîâàòü øèðîêèé ñïåêòð ðàçëè÷íûõ ìîäåëåé âïëîòü äî ôèçè÷åñêè-òî÷íûõ, îñòàâàÿñü â ðàìêàõòðåáîâàíèé ê èíòåðàêòèâíûì ïðèëîæåíèÿì (âî ìíîãîì çà ñ÷åòøèðîêîé àïïàðàòíîé ïîääåðæêè OpenGL).Ãëàâà 2.Ââåäåíèå â OpenGL2.1. Îñíîâíûå âîçìîæíîñòèÎïèñûâàòü âîçìîæíîñòè OpenGL ìû áóäåì ÷åðåç ôóíêöèèåãî áèáëèîòåêè. Âñå ôóíêöèè ìîæíî ðàçäåëèòü íà ïÿòü êàòåãîðèé: Ôóíêöèè îïèñàíèÿ ïðèìèòèâîâîïðåäåëÿþò îáúåêòû íèæ-íåãî óðîâíÿ èåðàðõèè (ïðèìèòèâû), êîòîðûå ñïîñîáíà îòîáðàæàòü ãðàôè÷åñêàÿ ïîäñèñòåìà.
 OpenGL â êà÷åñòâåïðèìèòèâîâ âûñòóïàþò òî÷êè, ëèíèè, ìíîãîóãîëüíèêè èò.ä. Ôóíêöèè îïèñàíèÿ èñòî÷íèêîâ ñâåòàñëóæàò äëÿ îïèñà-íèÿ ïîëîæåíèÿ è ïàðàìåòðîâ èñòî÷íèêîâ ñâåòà, ðàñïîëîæåííûõ â òðåõìåðíîé ñöåíå. Ôóíêöèè çàäàíèÿ àòðèáóòîâ. Ñ ïîìîùüþ çàäàíèÿ àòðè-áóòîâ ïðîãðàììèñò îïðåäåëÿåò, êàê áóäóò âûãëÿäåòü íàýêðàíå îòîáðàæàåìûå îáúåêòû. Äðóãèìè ñëîâàìè, åñëèñ ïîìîùüþ ïðèìèòèâîâ îïðåäåëÿåòñÿ, ÷òî ïîÿâèòñÿ íàýêðàíå, òî àòðèáóòû îïðåäåëÿþò ñïîñîá âûâîäà íà ýêðàí.25Ãëàâà 2. Ââåäåíèå â OPENGL26 êà÷åñòâå àòðèáóòîâ OpenGL ïîçâîëÿåò çàäàâàòü öâåò, õàðàêòåðèñòèêè ìàòåðèàëà, òåêñòóðû, ïàðàìåòðû îñâåùåíèÿ. Ôóíêöèè âèçóàëèçàöèèïîçâîëÿþò çàäàòü ïîëîæåíèå íà-áëþäàòåëÿ â âèðòóàëüíîì ïðîñòðàíñòâå, ïàðàìåòðû îáúåêòèâà êàìåðû. Çíàÿ ýòè ïàðàìåòðû, ñèñòåìà ñìîæåò íå òîëüêî ïðàâèëüíî ïîñòðîèòü èçîáðàæåíèå, íî è îòñå÷ü îáúåêòû,îêàçàâøèåñÿ âíå ïîëÿ çðåíèÿ.Íàáîðôóíêöèé ãåîìåòðè÷åñêèõ ïðåîáðàçîâàíèé ïîçâîëÿåòïðîãðàììèñòó âûïîëíÿòü ðàçëè÷íûå ïðåîáðàçîâàíèÿ îáúåêòîâ ïîâîðîò, ïåðåíîñ, ìàñøòàáèðîâàíèå.Ïðè ýòîì OpenGL ìîæåò âûïîëíÿòü äîïîëíèòåëüíûå îïåðàöèè, òàêèå êàê èñïîëüçîâàíèå ñïëàéíîâ äëÿ ïîñòðîåíèÿ ëèíèéè ïîâåðõíîñòåé, óäàëåíèå íåâèäèìûõ ôðàãìåíòîâ èçîáðàæåíèé,ðàáîòà ñ èçîáðàæåíèÿìè íà óðîâíå ïèêñåëåé è ò.ä.2.2.
Èíòåðôåéñ OpenGLOpenGL ñîñòîèò èç íàáîðà áèáëèîòåê. Âñå áàçîâûå ôóíêöèè õðàíÿòñÿ â îñíîâíîé áèáëèîòåêå, äëÿ îáîçíà÷åíèÿ êîòîðîé âäàëüíåéøåì ìû áóäåì èñïîëüçîâàòü àááðåâèàòóðó GL. Ïîìèìîîñíîâíîé, OpenGL âêëþ÷àåò â ñåáÿ íåñêîëüêî äîïîëíèòåëüíûõáèáëèîòåê.Ïåðâàÿ èç íèõ áèáëèîòåêà óòèëèò GL(GLU GL Utility).Âñå ôóíêöèè ýòîé áèáëèîòåêè îïðåäåëåíû ÷åðåç áàçîâûå ôóíêöèè GL.  ñîñòàâ GLU âîøëà ðåàëèçàöèÿ áîëåå ñëîæíûõ ôóíêöèé, òàêèõ êàê íàáîð ïîïóëÿðíûõ ãåîìåòðè÷åñêèõ ïðèìèòèâîâ(êóá, øàð, öèëèíäð, äèñê), ôóíêöèè ïîñòðîåíèÿ ñïëàéíîâ, ðåàëèçàöèÿ äîïîëíèòåëüíûõ îïåðàöèé íàä ìàòðèöàìè è ò.ï.OpenGL íå âêëþ÷àåò â ñåáÿ íèêàêèõ ñïåöèàëüíûõ êîìàíääëÿ ðàáîòû ñ îêíàìè èëè ââîäà èíôîðìàöèè îò ïîëüçîâàòåëÿ.Ïîýòîìó áûëè ñîçäàíû ñïåöèàëüíûå ïåðåíîñèìûå áèáëèîòåêè2.2.
Èíòåðôåéñ OPENGL27Ðèñ. 2.1. Îðãàíèçàöèÿ áèáëèîòåêè OpenGLäëÿ îáåñïå÷åíèÿ ÷àñòî èñïîëüçóåìûõ ôóíêöèé âçàèìîäåéñòâèÿ ñïîëüçîâàòåëåì è äëÿ îòîáðàæåíèÿ èíôîðìàöèè ñ ïîìîùüþ îêîííîé ïîäñèñòåìû.Íàèáîëåå ïîïóëÿðíîé ÿâëÿåòñÿ áèáëèîòåêà GLUT (GL UtilityToolkit). Ôîðìàëüíî GLUT íå âõîäèò â OpenGL, íî de factoâêëþ÷àåòñÿ ïî÷òè âî âñå åãî äèñòðèáóòèâû è èìååò ðåàëèçàöèè äëÿ ðàçëè÷íûõ ïëàòôîðì. GLUT ïðåäîñòàâëÿåò òîëüêî ìèíèìàëüíî íåîáõîäèìûé íàáîð ôóíêöèé äëÿ ñîçäàíèÿ OpenGLïðèëîæåíèÿ. Ôóíêöèîíàëüíî àíàëîãè÷íàÿ áèáëèîòåêà GLX ìåíåå ïîïóëÿðíà.  äàëüíåéøåì â ýòîé êíèãå â êà÷åñòâå îñíîâíîéáóäåò ðàññìàòðèâàòüñÿ GLUT.Êðîìå òîãî, ôóíêöèè, ñïåöèôè÷íûå äëÿ êîíêðåòíîé îêîííîéïîäñèñòåìû, îáû÷íî âõîäÿò â åå ïðèêëàäíîé ïðîãðàììíûé èíòåðôåéñ. Òàê, ôóíêöèè, ïîääåðæèâàþùèå âûïîëíåíèå OpenGL,åñòü â ñîñòàâå Win32 API è X Window.
Íà ðèñóíêå 2.1 ñõåìàòè÷åñêè ïðåäñòàâëåíà îðãàíèçàöèÿ ñèñòåìû áèáëèîòåê â âåðñèè,ðàáîòàþùåé ïîä óïðàâëåíèåì ñèñòåìû Windows. Àíàëîãè÷íàÿîðãàíèçàöèÿ èñïîëüçóåòñÿ è â äðóãèõ âåðñèÿõ OpenGL.Ãëàâà 2. Ââåäåíèå â OPENGL282.3. Àðõèòåêòóðà OpenGLÔóíêöèè OpenGL ðåàëèçîâàíû â ìîäåëè êëèåíò-ñåðâåð. Ïðèëîæåíèå âûñòóïàåò â ðîëè êëèåíòà îíî âûðàáàòûâàåò êîìàíäû, à ñåðâåð OpenGL èíòåðïðåòèðóåò è âûïîëíÿåò èõ.
Ñàì ñåðâåð ìîæåò íàõîäèòüñÿ êàê íà òîì æå êîìïüþòåðå, íà êîòîðîìíàõîäèòñÿ êëèåíò (íàïðèìåð, â âèäå äèíàìè÷åñêè çàãðóæàåìîéáèáëèîòåêè DLL), òàê è íà äðóãîì (ïðè ýòîì ìîæåò áûòü èñïîëüçîâàí ñïåöèàëüíûé ïðîòîêîë ïåðåäà÷è äàííûõ ìåæäó ìàøèíàìè).GL îáðàáàòûâàåò è ðèñóåò â áóôåðå êàäðà ãðàôè÷åñêèå ïðèìèòèâû ñ ó÷åòîì íåêîòîðîãî ÷èñëà âûáðàííûõ ðåæèìîâ. Êàæäûé ïðèìèòèâ ýòî òî÷êà, îòðåçîê, ìíîãîóãîëüíèê è ò.ä. Êàæäûé ðåæèì ìîæåò áûòü èçìåíåí íåçàâèñèìî îò äðóãèõ. Îïðåäåëåíèå ïðèìèòèâîâ, âûáîð ðåæèìîâ è äðóãèå îïåðàöèè îïèñûâàþòñÿ ñ ïîìîùüþ êîìàíä â ôîðìå âûçîâîâ ôóíêöèé ïðèêëàäíîéáèáëèîòåêè.Ïðèìèòèâû îïðåäåëÿþòñÿ íàáîðîì èç îäíîé èëè áîëåå âåðøèí (vertex). Âåðøèíà îïðåäåëÿåò òî÷êó, êîíåö îòðåçêà èëè óãîëìíîãîóãîëüíèêà. Ñ êàæäîé âåðøèíîé àññîöèèðóþòñÿ íåêîòîðûåäàííûå (êîîðäèíàòû, öâåò, íîðìàëü, òåêñòóðíûå êîîðäèíàòû èò.ä.), íàçûâàåìûå àòðèáóòàìè.
 ïîäàâëÿþùåì áîëüøèíñòâå ñëó÷àåâ êàæäàÿ âåðøèíà îáðàáàòûâàåòñÿ íåçàâèñèìî îò äðóãèõ.Ñ òî÷êè çðåíèÿ àðõèòåêòóðû, ãðàôè÷åñêàÿ ñèñòåìà OpenGLÿâëÿåòñÿ êîíâåéåðîì, ñîñòîÿùèì èç íåñêîëüêèõ ïîñëåäîâàòåëüíûõ ýòàïîâ îáðàáîòêè ãðàôè÷åñêèõ äàííûõ.Êîìàíäû OpenGL âñåãäà îáðàáàòûâàþòñÿ â òîì ïîðÿäêå, âêîòîðîì îíè ïîñòóïàþò, õîòÿ ìîãóò ïðîèñõîäèòü çàäåðæêè ïåðåä òåì, êàê ïðîÿâèòñÿ ýôôåêò îò èõ âûïîëíåíèÿ.  áîëüøèíñòâå ñëó÷àåâ OpenGL ïðåäîñòàâëÿåò íåïîñðåäñòâåííûé èíòåðôåéñ, ò.å. îïðåäåëåíèå îáúåêòà âûçûâàåò åãî âèçóàëèçàöèþ â áóôåðå êàäðà.Ñ òî÷êè çðåíèÿ ðàçðàáîò÷èêîâ, OpenGL ýòî íàáîð êîìàíä,2.3. Àðõèòåêòóðà OPENGL29êîòîðûå óïðàâëÿþò èñïîëüçîâàíèåì ãðàôè÷åñêîé àïïàðàòóðû.Åñëè àïïàðàòóðà ñîñòîèò òîëüêî èç àäðåñóåìîãî áóôåðà êàäðà,òîãäà OpenGL äîëæåí áûòü ðåàëèçîâàí ïîëíîñòüþ ñ èñïîëüçîâàíèåì ðåñóðñîâ öåíòðàëüíîãî ïðîöåññîðà.