Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 20
Текст из файла (страница 20)
Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ// Ïðîâîäèòü óäàëåíèå íåâèäèìûõ ëèíèé è// ïîâåðõíîñòåéglEnable (GL_DEPTH_TEST) ;// Ïðîâîäèòü íîðìèðîâàíèå íîðìàëåéglEnable (GL_NORMALIZE) ;// Ìàòåðèàëû îáúåêòîâ îòëè÷àþòñÿ òîëüêî öâåòîì// äèôôóçíîãî îòðàæåíèÿglEnable (GL_COLOR_MATERIAL) ;g l C o l o r M a t e r i a l (GL_FRONT_AND_BACK,GL_DIFFUSE ) ;// Ñîçäàíèÿ óêàçàòåëÿ íà q u a d r i c −îáúåêò// äëÿ ïîñòðîåíèÿ êîëåöQuadrObj=gluNewQuadric ( ) ;// Îïðåäåëåíèå ñâîéñòâ òåêñòóðûTextureInit ( ) ;// Çàäàíèå ïåðñïåêòèâíîé ïðîåêöèèglMatrixMode (GL_PROJECTION) ;gluPerspective (89.0 , 1.0 , 0.5 , 100.0);// Äàëåå áóäåò ïðîâîäèòüñÿ òîëüêî// ïðåîáðàçîâàíèå îáúåêòîâ ñöåíû}glMatrixMode (GL_MODELVIEW) ;void DrawFigures ( void ){// Âêëþ÷åíèå ðåæèìà íàíåñåíèÿ òåêñòóðûglEnable (GL_TEXTURE_2D) ;// Çàäàåì öâåò äèôôóçíîãî îòðàæåíèÿ äëÿ êîëåög l C o l o r 3 f v ( mat_diff1 ) ;// ×òîáû íå ïðîâîäèòü ïåðåìíîæåíèå ñ ïðåäûäóùåé// ìàòðèöåé çàãðóæàåì åäèíè÷íóþ ìàòðèöóglLoadIdentity ( ) ;// Îïðåäåëÿåì òî÷êó íàáëþäåíèÿ191192Ïðèëîæåíèå Á.
Äåìîíñòðàöèîííûå ïðîãðàììûgluLookAt ( 0 . 0 , 0 . 0 , 2 . 5 ,0.0 , 0.0 , 0.0 ,0.0 , 1.0 , 0.0);// Ñîõðàíÿåì âèäîâóþ ìàòðèöó , òàê êàê äàëüøå// áóäåò ïðîâîäèòüñÿ ïîâîðîò êîëåöglPushMatrix ( ) ;////////Ïðîèçâîäèì íåñêîëüêî ïîâîðîòîâ íà íîâûé óãîë( ýòî áûñòðåå , ÷åì óìíîæàòü ïðåäûäóùóþ âèäîâóþìàòðèöó íà ìàòðèöó ïîâîðîòà ñ ôèêñèðîâàííûìóãëîì ïîâîðîòà )g l R o t a t e f (−CurAng , 1 , 1 , 0 ) ;g l R o t a t e f ( CurAng , 1 , 0 , 0 ) ;// Äëÿ ðèñîâàíèÿ êîëåö êàæäîå èç íèõ íàäî// ïðåîáðàçîâàòü îòäåëüíî , ïîýòîìó ñíà÷àëà// ñîõðàíÿåì âèäîâóþ ìàòðèöó , çàòåì âîññòàíàâëèâàåìglPushMatrix ( ) ;g l T r a n s l a t e f (0 ,0 , − RingHeight / 2 ) ;DrawRing ( ) ;glPopMatrix ( ) ;glPushMatrix ( ) ;g l T r a n s l a t e f ( 0 , RingHeight / 2 , 0 ) ;glRotatef (90 ,1 ,0 ,0);DrawRing ( ) ;glPopMatrix ( ) ;glPushMatrix ( ) ;g l T r a n s l a t e f (− RingHeight / 2 , 0 , 0 ) ;glRotatef (90 ,0 ,1 ,0);DrawRing ( ) ;glPopMatrix ( ) ;// Âîññòàíàâëèâàåì ìàòðèöó äëÿ ïîâîðîòîâ òåðàýäðàglPopMatrix ( ) ;// Âûêëþ÷àåì ðåæèì íàëîæåíèÿ òåêñòóðûg l D i s a b l e (GL_TEXTURE_2D) ;// Ïðîâîäèì ïîâîðîòûg l R o t a t e f ( CurAng , 1 , 0 , 0 ) ;Á.4.
Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ193g l R o t a t e f ( CurAng / 2 , 1 , 0 , 1 ) ;// ×òîáû òåòðàýäð âðàùàëñÿ âîêðóã öåíòðà , å ã î// íàäî ñäâèíóòü âíèç ïî îñè ozg l T r a n s l a t e f ( 0 , − 0.33 , 0 ) ;// Çàäàåì öâåò äèôôóçíîãî îòðàæåíèÿ äëÿ òåòðàýäðàg l C o l o r 3 f v ( mat_diff2 ) ;// Ïðîâîäèì ïîñòðîåíèå òåòðàýäðà}g l C a l l L i s t (TETR_LIST ) ;void Display ( void ){// Èíèöèàëèçàöèÿ ( î÷èñòêà ) òåêóùåãî áóôåðà// êàäðà è ãëóáèíûg l C l e a r (GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT) ;// Ïîñòðîåíèå îáúåêòîâDrawFigures ( ) ;// Ïåðåñòàíîâêà áóôåðîâ êàäðà}glutSwapBuffers ( ) ;void Redraw ( void ){// Óâåëè÷åíèå òåêóùåãî óãëà ïîâîðîòàCurAng+=1;// Ñèãíàë äëÿ âûçîâà ïðîöåäóðû ñîçäàíèÿ èçîáðàæåíèÿ// ( äëÿ îáíîâëåíèÿ )}glutPostRedisplay ( ) ;int main ( int argc , char{** argv )Ïðèëîæåíèå Á.
Äåìîíñòðàöèîííûå ïðîãðàììû194// Èíèöèàëèçàöèÿ ôóíêöèé áèáëèîòåêè GLUTg l u t I n i t (&argc , argv ) ;// Çàäàíèå ðåæèìà ñ äâîéíîé áóôåðèçàöèåé ,// ïðåäñòàâëåíèå öâåòà â ôîðìàòå RGB,// èñïîëüçîâàíèå áóôåðà ãëóáèíûg l u t I n i t D i s p l a y M o d e (GLUT_DOUBLE |GLUT_RGB |GLUT_DEPTH) ;// Ñîçäàíèå îêíà ïðèëîæåíèÿglutCreateWindow ( "Example o f u s i n g OpenGL" ) ;// Ðåãèñòðàöèÿ ôóíêöèè ïîñòðîåíèÿ èçîáðàæåíèÿglutDisplayFunc ( Display ) ;// Ðåãèñòðàöèÿ ôóíêöèè îáíîâëåíèÿ èçîáðàæåíèÿg l u t I d l e F u n c ( Redraw ) ;// Èíèöèàëèçàöèÿ ôóíêöèé OpenGLInit ();// Öèêë îáðàáîòêè ñîáûòèéglutMainLoop ( ) ;}return 0 ;Ðèñ.
Á.3. Ðåçóëüòàò ðàáîòû ïðîãðàììû Á.5.Á.5. Êëàññ äëÿ ðàáîòû ñ OPENGL â WIN32195Á.5. Êëàññ äëÿ ðàáîòû ñ OpenGL â Win32Ïðîãðàììà Á.6. Ôàéë glrc.h.#ifndef _GLRC_H_#define _GLRC_H_// çàãîëîâêè OpenGL#include <g l / g l . h>#include <g l / gl u . h>class GLRC{public :// ñîçäàíèå èç èäåíòèôèêàòîðà îêíàGLRC( HWND wnd ) ;// äåñòðóêòîð~GLRC( ) ;// óäàëåíèå (òàêæå âûçûâàåòñÿ èç äåñòðóêòîðà )void Destroy ( ) ;// Ñîçäàíèå êîíòåêñòà ðèñîâàíèÿ .// Íåîáõîäèìî âûçâàòü äî èñïîëüçîâàíèÿ OpenGLbool Create ( ) ;// Ñîçäàí ëè êîíòåêñò ðèñîâàíèÿ ?bool I s C r e a t e d ( ) ;// ßâëÿåòñÿ ëè êîíòåêñò ðèñîâàíèÿ òåêóùèì?bool I s C u r r e n t ( ) const ;// Äåëàåò êîíòåêò òåêóùèìbool MakeCurrent ( ) ;196Ïðèëîæåíèå Á.
Äåìîíñòðàöèîííûå ïðîãðàììû// Âûçûâàåòñÿ â êîíöå ðèñîâàíèÿ ,// ïîêàç ñ î ç ä à í í î ã î èçîáðàæåíèÿvoid SwapBuffers ( ) ;private :// ñîçäàí ëè êîíòåêñòbool m_created ;// îêíî , äëÿ êîòîðîãî êîíòåêñòHWND m_wnd;// êîíòåêñò óñòðîéñòâàHDC m_dc ;// êîíòåêñò ðèñîâàíèÿ OpenGLHGLRC m_glrc ;};#endifÏðîãðàììà Á.7. Ôàéë glrc.cpp.#include <windows . h>#include " g l r c . h"#include " a s s e r t . h"GLRC : : GLRC(HWND wnd): m_created ( f a l s e ){a s s e r t ( wnd ) ;m_wnd = wnd ;m_dc = : : GetDC( wnd ) ;a s s e r t ( m_dc ) ;}GLRC: : ~GLRC( ){i f ( m_created )Á.5. Êëàññ äëÿ ðàáîòû ñ OPENGL â WIN32Destroy ( ) ;}void GLRC : : Destroy ( ){}wglDeleteContext ( m_glrc ) ;: : ReleaseDC (m_wnd, m_dc ) ;m_created = f a l s e ;bool GLRC : : MakeCurrent ( ){a s s e r t ( m_created ) ;i f ( IsCurrent ( ) )return true ;}BOOL r e s = wglMakeCurrent (m_dc, m_glrc ) ;return ( r e s != FALSE ) ;bool GLRC : : Create ( ){a s s e r t ( ! m_created ) ;int nPixelFormat = 0 ;DWORD f l a g s ;flags =PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER;static PIXELFORMATDESCRIPTOR pfd ={sizeof (PIXELFORMATDESCRIPTOR) ,1,197198};Ïðèëîæåíèå Á.
Äåìîíñòðàöèîííûå ïðîãðàììûflags ,PFD_TYPE_RGBA,24 ,0, 0, 0, 0, 0, 0,1,0,0,0, 0, 0, 0,32 ,0,0,PFD_MAIN_PLANE,0,0, 0, 0pfd . cAlphaBits = 8 ;nPixelFormat = ChoosePixelFormat ( m_dc, &pfd ) ;BOOL r e s =SetPixelFormat ( m_dc, nPixelFormat , &pfd ) ;i f ( r e s == FALSE)return f a l s e ;m_glrc = wglCreateContext ( m_dc ) ;m_created = true ;}return MakeCurrent ( ) ;void GLRC : : SwapBuffers ( ){a s s e r t ( m_created ) ;: : SwapBuffers (m_dc ) ;Á.5. Êëàññ äëÿ ðàáîòû ñ OPENGL â WIN32}bool GLRC : : I s C u r r e n t ( ) const{}a s s e r t ( m_created ) ;return : : wglGetCurrentContext ( ) == m_glrc ;bool GLRC : : I s C r e a t e d ( ){}return m_created ;199Ïðèëîæåíèå Â.Ïðèìåðû ïðàêòè÷åñêèõçàäàíèéÂ.1. Cornell BoxÖåëüþ çàäàíèÿ ÿâëÿåòñÿ ñîçäàíèå èçîáðàæåíèÿ çàäàííîéòðåõìåðíîé ñòàòè÷íîé ñöåíû ñðåäñòâàìè OpenGL ñ èñïîëüçîâàíèåì ñòàíäàðòíûõ ãåîìåòðè÷åñêèõ ïðèìèòèâîâ.Òðåáóåòñÿ ñîçäàòü èçîáðàæåíèå ñöåíû Cornell Box.
Ýòà êëàññè÷åñêàÿ ñöåíà ïðåäñòàâëÿåò ñîáîé êîìíàòó êóáè÷åñêîãî âèäà, ñîòñóòñòâóþùåé ïåðåäíåé ñòåíêîé.  êîìíàòå íàõîäÿòñÿ ãåîìåòðè÷åñêèå ïðåäìåòû ðàçëè÷íûõ ôîðì è ñâîéñòâ (êóáû, ïàðàëëåëåïèïåäû, øàðû), à òàêæå ïðîòÿæåííûé èñòî÷íèê ñâåòà íàïîòîëêå. Ïðèñóòñòâóåò òàêæå êàìåðà ñ çàäàííûìè ïàðàìåòðàìè(îáû÷íî îíà ðàñïîëîæåíà òàê, ÷òîáû áûëà âèäíà âñÿ êîìíàòà). îäíîé èç ëàáîðàòîðèé Êîðíåëüñêîãî óíèâåðñèòåòà òàêàÿêîìíàòà ñóùåñòâóåò â ðåàëüíîñòè, è åå ôîòîãðàôèè ñðàâíèâàþòñÿ ñ èçîáðàæåíèÿìè, ïîñòðîåííûìè ìåòîäàìè òðàññèðîâêèëó÷åé äëÿ îöåíêè òî÷íîñòè ìåòîäîâ.
Íà ñòðàíèöå ëàáîðàòîðèè(http://graphics.cornell.edu) ìîæíî íàéòè îïèñàíèå ãåîìåòðèèñöåíû â òåêñòîâîì ôîðìàòå.201202Ïðèëîæåíèå Â. Ïðèìåðû ïðàêòè÷åñêèõ çàäàíèéÐèñ. Â.1. Ïðèìåð ñöåíû Cornell Box.Ðåàëèçàöèè ñöåíû, ïðèâåäåííîé íà ðèñóíêå Â.1, äîñòàòî÷íîäëÿ âûïîëíåíèÿ çàäàíèÿ, õîòÿ âîçìîæíî ââåäåíèå íîâûõ ïðåäìåòîâ äîïîëíèòåëüíî ê ñóùåñòâóþùèì èëè âìåñòî íèõ. Ïðèâåòñòâóåòñÿ èñïîëüçîâàíèå ïðèìèòèâîâ áèáëèîòåê GLUT è GLU.Âíèìàíèå! Ñöåíà íå äîëæíà ïðåâðàùàòüñÿ â íàáîð ðàçíîðîäíûõ ïðåäìåòîâ. Ýñòåòè÷íîñòü è îðèãèíàëüíîñòü âûïîëíåííîãîçàäàíèÿ ïðèíèìàåòñÿ âî âíèìàíèå.Ïðîòÿæåííûé èñòî÷íèê ñâåòà íà ïîòîëêå êîìíàòû ìîæíîýìóëèðîâàòü íåñêîëüêèìè òî÷å÷íûìè èñòî÷íèêàìè.Çà ïðîñòåéøóþ ðåàëèçàöèþ ñöåíû ñòàâèòñÿ 7 áàëëîâ.Ðåàëèñòè÷íîñòü ñöåíû ìîæíî çíà÷èòåëüíî ïîâûñèòü çà ñ÷åòðàçáèåíèÿ ìíîãîóãîëüíèêîâ.
Ñóòü ýòîãî â òîì, ÷òî â ìîäåëè îñâåùåíèÿ OpenGL îñâåùåííîñòü âû÷èñëÿåòñÿ â âåðøèíàõ ìíîãîóãîëüíèêà ñ ó÷åòîì íàïðàâëåíèÿ íîðìàëåé â ýòèõ âåðøèíàõ, àçàòåì ëèíåéíî èíòåðïîëèðóåòñÿ ïî âñåé ïîâåðõíîñòè. Åñëè èñïîëüçóþòñÿ îòíîñèòåëüíî áîëüøèå ìíîãîóãîëüíèêè, òî, î÷åâèäíî, íåâîçìîæíî ïîëó÷èòü äåéñòâèòåëüíî ïëàâíûå ïåðåõîäû è çà-Â.1. CORNELL BOX203òåíåíèÿ. Äëÿ ïðåîäîëåíèÿ ýòîãî íåäîñòàòêà ìîæíî ðàçáèâàòüáîëüøèå ãðàíè (ñòåíû, íàïðèìåð) íà ìíîæåñòâî ìåíüøèõ ïî ðàçìåðàì.
Ñîîòâåòñòâåííî ðàçáðîñ â íàïðàâëåíèè íîðìàëåé â âåðøèíàõ îäíîãî ìíîãîóãîëüíèêà íå áóäåò ñòîëü âåëèê è çàòåíåíèåñòàíåò áîëåå ïëàâíûì (1 áàëë).Íàëîæåíèå òåêñòóð íà îáúåêòû ñöåíû ïîîùðÿåòñÿ 2-ìÿ áàëëàìè.Äîïîëíèòåëüíûìè áàëëàìè îöåíèâàåòñÿ ïðèñóòñòâèå â ñöåíåòåíåé. Îäèí èç ïðîñòåéøèõ àëãîðèòìîâ íàëîæåíèÿ òåíåé ïðèâåäåí â ðàçäåëå 8.2. Çà åãî ðåàëèçàöèþ ìîæíî ïîëó÷èòü äî 2 áàëëîâ. Èñïîëüçîâàíèå áîëåå ïðîäâèíóòûõ àëãîðèòìîâ (íàïðèìåð,shadow volumes) áóäåò îöåíåíî äîïîëíèòåëüíûìè áàëëàìè.Ðåàëèçàöèÿ óñòðàíåíèÿ ñòóïåí÷àòîñòè (antialiasing) ìåòîäîì,ïðåäëîæåííûì â ðàçäåëå 8.1 èëè êàêèì-ëèáî äðóãèì, îöåíèâàåòñÿ â 2 áàëëà.Çà ââåäåíèå â ñöåíó ïðîçðà÷íûõ îáúåêòîâ è êîððåêòíûé èõâûâîä äàåòñÿ 1 áàëë.
Ìåõàíèçì ðàáîòû ñ ïðîçðà÷íûìè îáúåêòàìè îïèñàí â ðàçäåëå 7.1.Çàäàíèå îöåíèâàåòñÿ, èñõîäÿ èç 15 áàëëîâ. ïðèâåäåííîé íèæå òàáëèöå óêàçàíî ðàñïðåäåëåíèå áàëëîââ çàâèñèìîñòè îò ðåàëèçîâàííûõ òðåáîâàíèé:Ïðîñòåéøèé âàðèàíò ñöåíû (òîëüêî îñâåùåíèå)7 áàëëîâÐàçáèåíèå ïîëèãîíîâ+1 áàëëÈñïîëüçîâàíèå òåêñòóð+2 áàëëàÍàëîæåíèå òåíåé+2 áàëëàÓñòðàíåíèå ñòóïåí÷àòîñòè+2 áàëëàÈñïîëüçîâàíèå ïðîçðà÷íûõ îáúåêòîâ+1 áàëëÄîïîëíèòåëüíûå áàëëû ìîæíî ïîëó÷èòü çà õîðîøóþ îïòèìèçàöèþ ïðîãðàììû, íåîáû÷íûå ðåøåíèÿ, ýñòåòè÷íîñòü è ò.ä.Ïðèëîæåíèå Â.