Главная » Просмотр файлов » Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF)

Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 20

Файл №1124368 Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF)) 20 страницаЮ.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368) страница 202019-05-11СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 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 áàëëÄîïîëíèòåëüíûå áàëëû ìîæíî ïîëó÷èòü çà õîðîøóþ îïòèìèçàöèþ ïðîãðàììû, íåîáû÷íûå ðåøåíèÿ, ýñòåòè÷íîñòü è ò.ä.Ïðèëîæåíèå Â.

Характеристики

Тип файла
PDF-файл
Размер
1,68 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6384
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее