Ю.М. Баяковский, А.В. Игнатенко - Начальный курс OpenGL (PDF) (1124368), страница 19
Текст из файла (страница 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.