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

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

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

Текст из файла (страница 19)

Çàãðóçêà BMP ôàéëà ýòîì ïóíêòå ïðèâîäèòñÿ èñõîäíûé òåêñò ôóíêöèèLoadBMP(),êîòîðàÿ ïîçâîëÿåò çàãðóæàòü ôàéëû ïîëíîöâåòíûõ èçîáðàæåíèé (24 áèòà íà òî÷êó) â ôîðìàòå Windows Bitmap (BMP).Ñèíòàêñèñ âûçîâà ôóíêöèè:Á.3. Çàãðóçêà BMP ôàéëà179int LoadBMP( const char * filen ame , IMAGE* out_img )Ïàðàìåòðlename îïðåäåëÿåò èìÿ ôàéëà. Ðåçóëüòàò âûïîëíåout_img, êîòîðàÿ îïðå-íèÿ ôóíêöèè çàïèñûâàåòñÿ â ñòðóêòóðóäåëåíà ñëåäóþùèì îáðàçîì:typedef struct _IMAGE{int width ;int h e i g h t ;unsigned char * data ;} IMAGE;Ïîëÿwidth è height õðàíÿò, ñîîòâåòñòâåííî, âûñîòó è øèðèíódata ïîñòðî÷íî õðàíèòñÿ ñàìî èçîáðàæåíèå,èçîáðàæåíèÿ.  ïîëåâ âèäå ïîñëåäîâàòåëüíîñòè RGB-êîìïîíåíò öâåòîâ ïèêñåëåé.Ïðîãðàììà Á.3. Çàãðóçêà BMP.

Ôàéë loadbmp.h.#ifndef _LOADBMP_H#define _LOADBMP_Htypedef struct _IMAGE{int width ;int h e i g h t ;unsigned char * data ;} IMAGE;int LoadBMP( const char * f i l e , IMAGE* out_img ) ;#endifÏðîãðàììà Á.4. Çàãðóçêà BMP. Ôàéë loadbmp.cpp.#include "loadbmp . h"#include <s t d i o . h>180Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû#include <s t d l i b . h>#include <memory . h>// ðàçìåð ç à ã î ë î â ê à BMP−ôàéëà#define BMP_SIZE_FILEHEADER 14// ðàçìåð èíôîðìàöèîííîãî ç à ã î ë î â ê à BMP−ôàéëà#define BMP_SIZE_INFOHEADER 40#define BMP_COLOR_BITS_24 24// âñïîìîãàòåëüíûå ôóíêöèèstatic unsigned int uInt16Number ( unsigned char buf [ 2 ] ){}return ( buf [ 1 ] << 8) | buf [ 0 ] ;static unsigned int uInt32Number ( unsigned char buf [ 4 ] ){}unsigned numb =numb = (numb <<numb = (numb <<numb = (numb <<return numb ;buf [ 3 ] ;8) | buf [ 2 ] ;8) | buf [ 1 ] ;8) | buf [ 0 ] ;int ReadFileHeader ( FILE * f , int * bitmap_pos ){unsigned char header [BMP_SIZE_FILEHEADER ] ;s i z e _ t numb = 0 ;int o f f s e t = 0 ;i f ( f s e e k ( f , 0 , SEEK_SET) )return 0 ;numb = f r e a d ( header , BMP_SIZE_FILEHEADER, 1 , f ) ;Á.3.

Çàãðóçêà BMP ôàéëài f (numb != 1)return 0 ;i f ( header [ 0 ] != 'B ' | | header [ 1 ] != 'M' )return 0 ;o f f s e t = uInt32Number ( header + 1 0 ) ;numb = f r e a d ( header , 4 , 1 , f ) ;i f (numb != 1)return 0 ;i f ( uInt32Number ( header ) != 40)return 0 ;* bitmap_pos}return 1 ;= offset ;// ç à ã ð ó ç ê à BMP−ôàéëàint LoadBMP( const char * f i l e , IMAGE* out_img ){FILE * f ;int bitmap_pos ;unsigned char buf [ 4 0 ] ;s i z e _ t numb ;int x_res ;int y_res ;int n_bits ;int compression ;int size_image ;int n_used_colors ;// îòêðûâàåì ôàéëf = fopen ( f i l e , " rb " ) ;181Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû182if (! f )return 0 ;i f ( out_img == NULL)return 0 ;// ÷èòàåì ç à ã î ë î â î êi f ( ! ReadFileHeader ( f , &bitmap_pos ) ){}fclose ( f );return 0 ;i f ( f s e e k ( f , BMP_SIZE_FILEHEADER, SEEK_SET) ){}fclose ( f );return 0 ;numb = f r e a d ( buf , 40 , 1 , f ) ;i f (numb != 1){fclose ( f );return 0 ;}x_res = ( int ) uInt32Number ( buf + 4 ) ;y_res = ( int ) uInt32Number ( buf + 8 ) ;n_bitscompressionsize_imagen_used_colors====( int ) uInt16Number ( buf( int ) uInt32Number ( buf( int ) uInt32Number ( buf( int ) uInt32Number ( buf// ÷èòàåì òîëüêî ïîëíîöâåòíûå ôàéëûi f ( n_bits == BMP_COLOR_BITS_24)++++14);16);20);32);Á.3.

Çàãðóçêà BMP ôàéëà{int rgb_size ;unsigned char * rgb ;int y ;unsigned char * l i n e ;int rest_4 ;i f ( bitmap_pos !={}BMP_SIZE_FILEHEADER + BMP_SIZE_INFOHEADER)fclose ( f );return 0 ;i f ( f s e e k ( f , bitmap_pos , SEEK_SET) ){}fclose ( f );return 0 ;rgb_size = 3 * x_res ;rest_4 = rgb_size % 4 ;i f ( rest_4 > 0)rgb_size += 4 − rest_4 ;out_img−>width = x_res ;out_img−>h e i g h t = y_res ;out_img−>data =( unsigned char * ) malloc ( x_res * y_res * 3 ) ;i f ( out_img−>data == NULL)return 0 ;rgb = ( unsigned char * ) malloc ( rgb_size ) ;// çàïîëíÿåì äàííûå èç ôàéëà183Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû184for ( y = 0 ; y < y_res ; y++){s i z e _ t numb = 0 ;int x = 0 ;numb = f r e a d ( rgb , rgb_size , 1 , f ) ;i f (numb != 1){fclose ( f );f r e e ( rgb ) ;return 0 ;}numb = 0 ;l i n e = out_img−>data + x_res * 3 * y ;for ( x = 0 ; x < x_res ; x++){l i n e [ 2 ] = rgb [ numb++];l i n e [ 1 ] = rgb [ numb++];l i n e [0]= rgb [ numb++];l i n e += 3 ;}}}fclose ( f );f r e e ( rgb ) ;elsereturn 0 ;}return 1 ;typedef unsigned char BYTE;typedef unsigned short WORD;typedef unsigned int DWORD;typedef struct tagBITMAPFILEHEADERÁ.3.

Çàãðóçêà BMP ôàéëà{WORDbfType ;DWORDbfSize ;WORDbfReserved1 ;WORDbfReserved2 ;DWORDbfOffBits ;} BITMAPFILEHEADER;typedef struct tagBITMAPINFOHEADER {DWORDbiSize ;biWidth ;b iH e ig h t ;WORD b i P l a n e s ;WORD biBitCount ;DWORD biCompression ;DWORD b i S i z e I m a g e ;longbiXPelsPerMeter ;longbiYPelsPerMeter ;DWORD biClrUsed ;DWORD biClrImportant ;} BITMAPINFOHEADER;longlongstatic void IntTo2Bytes ( int val , BYTE buf [ 2 ] ){}buf [ 0 ] = (BYTE) v a l ;buf [ 1 ] = (BYTE) ( v a l >> 8 ) ;static void IntTo4Bytes ( int val , BYTE buf [ 4 ] ){}buf [ 0 ]buf [ 1 ]buf [ 2 ]buf [ 3 ]====(BYTE) v a l ;(BYTE) ( v a l >> 8 ) ;(BYTE) ( v a l >> 1 6 ) ;(BYTE) ( v a l >> 2 4 ) ;185Ïðèëîæåíèå Á.

Äåìîíñòðàöèîííûå ïðîãðàììû186Á.4. Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿÐåçóëüòàòîì âûïîëíåíèÿ ýòîé ïðîãðàììû ÿâëÿåòñÿ ïîñòðîåíèå òåòðàýäðà ñ âðàùàþùèìèñÿ âîêðóã íåãî êîëüöàìè, íà êîòîðûå íàíåñåíà òåêñòóðà.Ïðè êîìïèëÿöèè ïðîãðàììû â Microsoft Visual C++ ôàéë¾texture.bmp¿ íàäî ïîìåñòèòü â êàòàëîã ïðîåêòà èëè óêàçàòüïîëíûé ïóòü ê íåìó. Åñëè ïóòü íå óêàçàí, òî ïðè çàïóñêå èñïîëíÿåìîãî ôàéëà èç îïåðàöèîííîé ñèñòåìû ôàéë ñ òåêñòóðîéäîëæåí íàõîäèòüñÿ â òîì æå êàòàëîãå. Äëÿ çàãðóçêè èçîáðàæåíèÿ òåêñòóðû ïðîãðàììà èñïîëüçóåò ôóíêöèþLoadBMP,ïðèâå-äåííóþ â ïðåäûäóùåì ïóíêòå.Ïðîãðàììà Á.5. Ïðèìåð òåêñòóðèðîâàíèÿ è àíèìàöèè.#include#include#include#include<s t d l i b . h><math . h><GL\ g l u t .

h>"loadbmp . h"#define TETR_LIST 1GLfloat l i g h t _ c o l [ ] = { 1 , 1 , 1 } ;float mat_diff1 [ ] = { 0 . 8 , 0 . 8 , 0 . 8 } ;float mat_diff2 [ ] = { 0 . 0 , 0 . 0 , 0 . 9 } ;float mat_amb[] = { 0 . 2 , 0 . 2 , 0 . 2 } ;float mat_spec [ ] = { 0 . 6 , 0 . 6 , 0 . 6 } ;float s h i n i n e s s =0.7 * 128 , CurAng=0, RingRad=1,RingHeight =0.1;GLUquadricObj * QuadrObj ;GLuint TexId ;GLfloat TetrVertex [ 4 ] [ 3 ] , TetrNormal [ 4 ] [ 3 ] ;// Âû÷èñëåíèå íîðìàëè ê ïëîñêîñòè ,// çàäàâàåìîé òî÷êàìè a , b , cvoid getnorm ( float a [ 3 ] , float b [ 3 ] , float c [ 3 ] ,float * n )Á.4. Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ{float mult =0;int i , j ;n [ 0 ] = ( b [1] − a [ 1 ] ) * ( c [2] − a [ 2 ] ) − ( b[2] − a [ 2 ] ) *( c [1] − a [ 1 ] ) ;n [ 1 ] = ( c [0] − a [ 0 ] ) * ( b [2] − a [ 2 ] ) − ( b[0] − a [ 0 ] ) *( c [2] − a [ 2 ] ) ;n [ 2 ] = ( b [0] − a [ 0 ] ) * ( c [1] − a [ 1 ] ) − ( c [0] − a [ 0 ] ) *( b[1] − a [ 1 ] ) ;}// Îïðåäåëåíèå íóæíîãî íàïðàâëåíèÿ íîðìàëè :// îò òî÷êè ( 0 , 0 , 0 )for ( i =0; i <3; i ++) mult+=a [ i ] * n [ i ] ;i f ( mult <0) for ( j =0; j <3; j++) n [ j ]=−n [ j ] ;//Âû÷èñëåíèå êîîðäèíàò âåðøèí òåòðàýäðàvoid I n i t V e r t e x T e t r ( ){float alpha =0;int i ;TetrVertex [ 0 ] [ 0 ] = 0 ;TetrVertex [ 0 ] [ 1 ] = 1 .

3 ;TetrVertex [ 0 ] [ 2 ] = 0 ;// Âû÷èñëåíèå êîîðäèíàò îñíîâàíèÿ òåòðàýäðàfor ( i =1; i <4; i ++){}}TetrVertex [ i ] [ 0 ] = 0 . 9 4 * cos ( alpha ) ;TetrVertex [ i ] [ 1 ] = 0 ;TetrVertex [ i ] [ 2 ] = 0 . 9 4 * s i n ( alpha ) ;alpha +=120.0 * 3.14/180.0;// Âû÷èñëåíèå íîðìàëåé ñòîðîí òåòðàýäðàvoid InitNormsTetr ( ){getnorm ( TetrVertex [ 0 ] , TetrVertex [ 1 ] ,187Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû188}TetrVertex [ 2 ]getnorm ( TetrVertex [ 0 ]TetrVertex [ 3 ]getnorm ( TetrVertex [ 0 ]TetrVertex [ 1 ]getnorm ( TetrVertex [ 1 ]TetrVertex [ 3 ], TetrNormal [ 0 ] ) ;, TetrVertex [ 2 ] ,, TetrNormal [ 1 ] ) ;, TetrVertex [ 3 ] ,, TetrNormal [ 2 ] ) ;, TetrVertex [ 2 ] ,, TetrNormal [ 3 ] ) ;// Ñîçäàíèå ñïèñêà ïîñòðîåíèÿ òåòðàýäðàvoid MakeTetrList ( ){int i ;glNewList (TETR_LIST,GL_COMPILE) ;// Çàäàíèå ñòîðîí òåòðàýäðàg l B e g i n (GL_TRIANGLES) ;for ( i =1; i <4; i ++){glNormal3fv ( TetrNormal [ i − 1 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 0 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ i ] ) ;i f ( i !=3)g l V e r t e x 3 f v ( TetrVertex [ i + 1 ] ) ;else}g l V e r t e x 3 f v ( TetrVertex [ 1 ] ) ;}glNormal3fv ( TetrNormal [ 3 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 1 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 2 ] ) ;g l V e r t e x 3 f v ( TetrVertex [ 3 ] ) ;glEnd ( ) ;glEndList ( ) ;void DrawRing ( ){// Ïîñòðîåíèå öèëèíäðà ( êîëüöà ) , ðàñïîëîæåííîãîÁ.4.

Ïðèìåð 3: Òåêñòóðèðîâàíèå è àíèìàöèÿ////////////}ïàðàëëåëüíî îñè zÂòîðîé è òðåòèé ïàðàìåòðû çàäàþòðàäèóñû îñíîâàíèé , ÷åòâåðòûé âûñîòó ,ïîñëåäíèå äâà −÷èñëî ðàçáèåíèé âîêðóã èâäîëü îñè z . Ïðè ýòîì äàëüíåå îñíîâàíèåöèëèíäðà íàõîäèòñÿ â ïëîñêîñòè z=0g l u C y l i n d e r ( QuadrObj , RingRad , RingRad ,RingHeight , 3 0 , 2 ) ;void T e x t u r e I n i t ( ){char s t r F i l e [ ] = " t e x t u r e . bmp" ;IMAGE img ;// Âûðàâíèâàíèå â * . bmp ïî áàéòóg l P i x e l S t o r e i (GL_UNPACK_ALIGNMENT, 1 ) ;// Ñîçäàíèå èäåíòèôèêàòîðà äëÿ òåêñòóðûglGenTextures (1 ,& TexId ) ;// Çàãðóçêà èçîáðàæåíèÿ â ïàìÿòüi f ( ! LoadBMP( s t r F i l e , &img ) )return ; ;// Íà÷àëî îïèñàíèÿ ñâîéñòâ òåêñòóðûglBindTexture (GL_TEXTURE_2D, TexId ) ;// Ñîçäàíèå óðîâíåé äåòàëèçàöèè è èíèöèàëèçàöèÿ// òåêñòóðûgluBuild2DMipmaps (GL_TEXTURE_2D, 3 ,img .

width , img . height ,GL_RGB,GL_UNSIGNED_BYTE, img . data ) ;// Ðàçðåøåíèå íàëîæåíèÿ ýòîé òåêñòóðû íà// q u a d r i c −îáúåêòûgluQuadricTexture ( QuadrObj , GL_TRUE) ;// Çàäàíèå ïàðàìåòðîâ òåêñòóðû// Ïîâòîð èçîáðàæåíèÿ ïî ïàðàìåòðè÷åñêèì189190Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû// îñÿì s è tglTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT) ;glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT) ;// Íå èñïîëüçîâàòü èíòåðïîëÿöèþ ïðè âûáîðå òî÷êè// íà òåêñòóðåglTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_NEAREST) ;glTexParameteri (GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST) ;// Ñîâìåùàòü òåêñòóðó è ìàòåðèàë îáúåêòà}glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE) ;void I n i t ( void ){InitVertexTetr ( ) ;InitNormsTetr ( ) ;MakeTetrList ( ) ;// Îïðåäåëåíèå ñâîéñòâ ìàòåðèàëàg l M a t e r i a l f v (GL_FRONT_AND_BACK, GL_AMBIENT,mat_amb ) ;g l M a t e r i a l f v (GL_FRONT_AND_BACK, GL_SPECULAR,mat_spec ) ;g l M a t e r i a l f (GL_FRONT, GL_SHININESS ,shininess );// Îïðåäåëåíèå ñâîéñòâ îñâåùåíèÿg l L i g h t f v (GL_LIGHT0, GL_DIFFUSE, l i g h t _ c o l ) ;glEnable (GL_LIGHTING ) ;glEnable (GL_LIGHT0 ) ;Á.4.

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

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

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

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