Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 9
Текст из файла (страница 9)
Ñîçäàíèå ýôôåêòà òóìàíàÒåêñòïðîãðàììû,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.
Ïîäãîòîâêà òåêñòóðûÄëÿ èñïîëüçîâàíèÿ òåêñòóðû íåîáõîäèìî ñíà÷àëà çàãðóçèòüâ ïàìÿòü íóæíîå èçîáðàæåíèå è ïåðåäàòü åãî OpenGL.77Ãëàâà 6. Òåêñòóðèðîâàíèå78Ñ÷èòûâàíèå ãðàôè÷åñêèõ äàííûõ èç ôàéëà è èõ ïðåîáðàçîâàíèå ìîæíî ïðîâîäèòü âðó÷íóþ.  ïðèëîæåíèè Á ïðèâåäåí èñõîäíûé òåêñò ôóíêöèè äëÿ çàãðóçêè èçîáðàæåíèÿ èç ôàéëà âôîðìàòå BMP.Ìîæíî òàêæå âîñïîëüçîâàòüñÿ ôóíêöèåé, âõîäÿùåé â ñîñòàâáèáëèîòåêè GLAUX (äëÿ åå èñïîëüçîâàíèÿ íàäî äîïîëíèòåëüíîïîäêëþ÷èòü glaux.lib), êîòîðàÿ ñàìà ïðîâîäèò íåîáõîäèìûå îïåðàöèè. Ýòî ôóíêöèÿAUX_RGBImageRec* auxDIBImageLoad ( const char * f i l e )leãäå íàçâàíèå ôàéëà ñ ðàñøèðåíèåì *.bmp èëè *.dib. Ôóíê-öèÿ âîçâðàùàåò óêàçàòåëü íà îáëàñòü ïàìÿòè, ãäå õðàíÿòñÿ ïðåîáðàçîâàííûå äàííûå.Ïðè ñîçäàíèè îáðàçà òåêñòóðû â ïàìÿòè ñëåäóåò ó÷èòûâàòüóêàçûâàåìûå òðåáîâàíèÿ.
Âî-ïåðâûõ, ðàçìåðû òåêñòóðû, êàê ïîãîðèçîíòàëè, òàê è ïî âåðòèêàëè äîëæíû ïðåäñòàâëÿòü ñîáîéñòåïåíè äâîéêè. Ýòî òðåáîâàíèå íàêëàäûâàåòñÿ äëÿ êîìïàêòíîãî ðàçìåùåíèÿ òåêñòóðû â òåêñòóðíîé ïàìÿòè è ñïîñîáñòâóåò ååýôôåêòèâíîìó èñïîëüçîâàíèþ. Ðàáîòàòü òîëüêî ñ òàêèìè òåêñòóðàìè êîíå÷íî íåóäîáíî, ïîýòîìó ïîñëå çàãðóçêè èõ íàäî ïðåîáðàçîâàòü. Èçìåíåíèå ðàçìåðîâ òåêñòóðû ìîæíî ïðîâåñòè ñ ïîìîùüþ êîìàíäûvoid gluScaleImage (GLenum format , GLint widthin ,GL h e i g h t i n , GLenum typein ,const void * datain ,GLint widthout ,GLint heightout , GLenum typeout ,void * dataout )format îáû÷íî èñïîëüçóåòñÿGL_RGB èëè GL_RGBA, îïðåäåëÿþùåå ôîðìàò õðàíåèíôîðìàöèè.
Ïàðàìåòðû widthin, heightin , widhtout, heightout êà÷åñòâå çíà÷åíèÿ ïàðàìåòðàçíà÷åíèåíèÿîïðåäåëÿþò ðàçìåðû âõîäíîãî è âûõîäíîãî èçîáðàæåíèé, à ñ ïîìîùüþtypeinètypeoutçàäàåòñÿ òèï ýëåìåíòîâ ìàññèâîâ, ðàñïî-6.1. Ïîäãîòîâêà òåêñòóðû79datain è dataout. Êàê è îáû÷íî, ýòî ìîGL_UNSIGNED_BYTE, GL_SHORT, GL_INT è ò.ä.ëîæåííûõ ïî àäðåñàìæåò áûòü òèïÐåçóëüòàò ñâîåé ðàáîòû ôóíêöèÿ çàíîñèò â îáëàñòü ïàìÿòè, íàêîòîðóþ óêàçûâàåò ïàðàìåòðdataout.Âî-âòîðûõ, íàäî ïðåäóñìîòðåòü ñëó÷àé, êîãäà îáúåêò ïîñëåðàñòåðèçàöèè îêàçûâàåòñÿ ïî ðàçìåðàì çíà÷èòåëüíî ìåíüøå íàíîñèìîé íà íåãî òåêñòóðû. ×åì ìåíüøå îáúåêò, òåì ìåíüøåäîëæíà áûòü íàíîñèìàÿ íà íåãî òåêñòóðà è ïîýòîìó ââîäèòñÿ ïîíÿòèå óðîâíåé äåòàëèçàöèè òåêñòóðû (mipmap).
Êàæäûéóðîâåíü äåòàëèçàöèè çàäàåò íåêîòîðîå èçîáðàæåíèå, êîòîðîå ÿâëÿåòñÿ, êàê ïðàâèëî, óìåíüøåííîé â äâà ðàçà êîïèåé îðèãèíàëà.Òàêîé ïîäõîä ïîçâîëÿåò óëó÷øèòü êà÷åñòâî íàíåñåíèÿ òåêñòóðûíà îáúåêò. Íàïðèìåð, äëÿ èçîáðàæåíèÿ ðàçìåðîìïîñòðîèòümax(m, n) + 12m × 2nìîæíîóìåíüøåííûõ èçîáðàæåíèé, ñîîòâåò-ñòâóþùèõ ðàçëè÷íûì óðîâíÿì äåòàëèçàöèè.Ýòè äâà ýòàïà ñîçäàíèÿ îáðàçà òåêñòóðû âî âíóòðåííåé ïàìÿòè OpenGL ìîæíî ïðîâåñòè ñ ïîìîùüþ êîìàíäûvoid gluBuild2DMipmaps (GLenum t a r g e t ,GLint components ,GLint width , GLint height ,GLenum format , GLenum type ,const void * data )target äîëæåí áûòü ðàâåí GL_TEXTURE_2D. Ïàcomponents îïðåäåëÿåò êîëè÷åñòâî öâåòîâûõ êîìïîíåíòãäå ïàðàìåòððàìåòðòåêñòóðû è ìîæåò ïðèíèìàòü ñëåäóþùèå îñíîâíûå çíà÷åíèÿ:GL_LUMINANCE îäíàêîìïîíåíòà ÿðêîñòü(òåêñòóðàáóäåò ìîíîõðîìíîé);GL_RGB êðàñíûé, ñèíèé, çåëåíûé;GL_RGBA êðàñíûé, ñèíèé, çåëåíûé, àëüôà (ñì.
ï. 7.1).Ïàðàìåòðûwidth, height, dataîïðåäåëÿþò ðàçìåðû è ðàñïî-format è typegluScaleImage().ëîæåíèå òåêñòóðû ñîîòâåòñòâåííî, àãè÷íûé ñìûñë, ÷òî è â êîìàíäåèìåþò àíàëî-Ãëàâà 6. Òåêñòóðèðîâàíèå80Ïîñëå âûïîëíåíèÿ ýòîé êîìàíäû òåêñòóðà êîïèðóåòñÿ âîâíóòðåííþþ ïàìÿòü OpenGL, è ïîýòîìó ïàìÿòü, çàíèìàåìóþèñõîäíûì èçîáðàæåíèåì, ìîæíî îñâîáîäèòü. OpenGL äîïóñêàåòñÿ èñïîëüçîâàíèå îäíîìåðíûõ òåêñòóð,òî åñòü ðàçìåðà1 × N,îäíàêî ýòî âñåãäà íàäî óêàçûâàòü, çà-äàâàÿ â êà÷åñòâå çíà÷åíèÿtargetêîíñòàíòóGL_TEXTURE_1D.Îäíîìåðíûå òåêñòóðû èñïîëüçóþòñÿ äîñòàòî÷íî ðåäêî, ïîýòîìóíå áóäåì îñòàíàâëèâàòüñÿ íà ýòîì ïîäðîáíî.Ïðè èñïîëüçîâàíèè â ñöåíå íåñêîëüêèõ òåêñòóð, â OpenGLïðèìåíÿåòñÿ ïîäõîä, íàïîìèíàþùèé ñîçäàíèå ñïèñêîâ èçîáðàæåíèé (òàê íàçûâàåìûå òåêñòóðíûå îáúåêòû).
Ñíà÷àëà ñ ïîìîùüþêîìàíäûvoid glGenTextures ( G L s i z e i n , GLuint * t e x t u r e s )íàäî ñîçäàòü n èäåíòèôèêàòîðîâ òåêñòóð, êîòîðûå áóäóò çàïèñàíû â ìàññèâtextures. Ïåðåä íà÷àëîì îïðåäåëåíèÿ ñâîéñòâ î÷å-ðåäíîé òåêñòóðû ñëåäóåò ñäåëàòü åå òåêóùåé (¾ïðèâÿçàòü¿ òåêñòóðó), âûçâàâ êîìàíäóvoid glBindTexture (GLenum t a r g e t , GLuint t e x t u r e )ãäå target ìîæåò ïðèíèìàòü çíà÷åíèÿGL_TEXTURE_2D,à ïàðàìåòðtextureGL_TEXTURE_1Dèëèäîëæåí áûòü ðàâåí èäåí-òèôèêàòîðó òîé òåêñòóðû, ê êîòîðîé áóäóò îòíîñèòüñÿ ïîñëåäóþùèå êîìàíäû. Äëÿ òîãî, ÷òîáû â ïðîöåññå ðèñîâàíèÿ ñäåëàòüòåêóùåé òåêñòóðó ñ íåêîòîðûì èäåíòèôèêàòîðîì, äîñòàòî÷íîîïÿòü âûçâàòü êîìàíäó÷åíèåìtargetètexture.glBindTexture()c ñîîòâåòñòâóþùèì çíà-glBindTexture()èäåíòèôèêàòîðîì texture,Òàêèì îáðàçîì, êîìàíäàâêëþ÷àåò ðåæèì ñîçäàíèÿ òåêñòóðû ñåñëè òàêàÿ òåêñòóðà åùå íå ñîçäàíà, ëèáî ðåæèì åå èñïîëüçîâàíèÿ, òî åñòü äåëàåò ýòó òåêñòóðó òåêóùåé.Òàê êàê íå âñÿêàÿ àïïàðàòóðà ìîæåò îïåðèðîâàòü òåêñòóðàìèáîëüøîãî ðàçìåðà, öåëåñîîáðàçíî îãðàíè÷èòü ðàçìåðû òåêñòóðûäî256×256 èëè 512×512 ïèêñåëåé.
Îòìåòèì, ÷òî èñïîëüçîâàíèåíåáîëüøèõ òåêñòóð ïîâûøàåò ýôôåêòèâíîñòü ïðîãðàììû.6.2. Íàëîæåíèå òåêñòóðû íà îáúåêòû816.2. Íàëîæåíèå òåêñòóðû íà îáúåêòûÏðè íàëîæåíèè òåêñòóðû, êàê óæå óïîìèíàëîñü, íàäî ó÷èòûâàòü ñëó÷àé, êîãäà ðàçìåðû òåêñòóðû îòëè÷àþòñÿ îò îêîííûõðàçìåðîâ îáúåêòà, íà êîòîðûé îíà íàêëàäûâàåòñÿ. Ïðè ýòîì âîçìîæíî êàê ðàñòÿæåíèå, òàê è ñæàòèå èçîáðàæåíèÿ, è òî, êàê áóäóò ïðîâîäèòüñÿ ýòè ïðåîáðàçîâàíèÿ, ìîæåò ñåðüåçíî ïîâëèÿòüíà êà÷åñòâî ïîñòðîåííîãî èçîáðàæåíèÿ.