Баяковский.Начальный курс OpenGL (1124482), страница 18
Текст из файла (страница 18)
Ïðèìåð 1: Ïðîñòîå GLUT-ïðèëîæåíèåÝòîò ïðîñòîé ïðèìåð ïðåäíàçíà÷åí äëÿ äåìîíñòðàöèè ñòðóêòóðû GLUT-ïðèëîæåíèÿ è ïðîñòåéøèõ îñíîâ OpenGL. Ðåçóëüòàòîì ðàáîòû ïðîãðàììû ÿâëÿåòñÿ ñëó÷àéíûé íàáîð öâåòíûõïðÿìîóãîëüíèêîâ, êîòîðûé ìåíÿåòñÿ ïðè íàæàòèè ëåâîé êíîïêèìûøè. Ñ ïîìîùüþ ïðàâîé êíîïêè ìûøè ìîæíî ìåíÿòü ðåæèìçàëèâêè ïðÿìîóãîëüíèêîâ.Ïðîãðàììà Á.1. Ïðîñòîé ïðèìåð OpenGL.#include <s t d l i b .
h>#include <g l \ g l u t . h>#i f d e f random#undef random#endif#define random (m) ( float ) rand ( ) *m/RAND_MAX169170Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû// øèðèíà è âûñîòà îêíàGLint Width = 512 , Height = 5 1 2 ;// ÷èñëî ïðÿìîóãîëüíèêîâ â îêíåintTimes = 1 0 0 ;intFillFlaglongSeed = 0 ;// ñ çàïîëíåíèåì ?= 1;// ôóíêöèÿ îòîáðàæàåò ïðÿìîóãîëüíèêvoid DrawRect ( float x1 , float y1 ,float x2 , float y2 ,int F i l l F l a g ){}g l B e g i n ( F i l l F l a g ? GL_QUADS : GL_LINE_LOOP) ;g l V e r t e x 2 f ( x1 , y1 ) ;g l V e r t e x 2 f ( x2 , y1 ) ;g l V e r t e x 2 f ( x2 , y2 ) ;g l V e r t e x 2 f ( x1 , y2 ) ;glEnd ( ) ;// óïðàâëÿåò âñåì âûâîäîì íà ýêðàívoid Display ( void ){int i ;float x1 , y1 , x2 , y2 ;float r , g , b ;srand ( Seed ) ;glClearColor (0 , 0 , 0 , 1);g l C l e a r (GL_COLOR_BUFFER_BIT) ;for ( i = 0 ; i < Times ; i++ ) {r = random ( 1 ) ;g = random ( 1 ) ;Á.1.
Ïðèìåð 1: Ïðîñòîå GLUT-ïðèëîæåíèåb = random ( 1 ) ;glColor3f ( r , g , b );}}x1 = random ( 1 ) * Width ;y1 = random ( 1 ) * Height ;x2 = random ( 1 ) * Width ;y2 = random ( 1 ) * Height ;DrawRect ( x1 , y1 , x2 , y2 , F i l l F l a g ) ;glFinish ();// Âûçûâàåòñÿ ïðè èçìåíåíèè ðàçìåðîâ îêíàvoid Reshape ( GLint w, GLint h ){Width = w;Height = h ;glViewport ( 0 , 0 , w, h ) ;glMatrixMode (GL_PROJECTION) ;glLoadIdentity ( ) ;glOrtho ( 0 , w, 0 , h , − 1.0 , 1 . 0 ) ;}glMatrixMode (GL_MODELVIEW) ;glLoadIdentity ( ) ;// Îáðàáàòûâàåò ñîîáùåíèÿ îò ìûøèvoid Mouse ( int button , int s t a t e ,int x , int y ){i f ( s t a t e == GLUT_DOWN ) {switch ( button ) {case GLUT_LEFT_BUTTON:Seed = random (RAND_MAX) ;171Ïðèëîæåíèå Á.
Äåìîíñòðàöèîííûå ïðîãðàììû172break ;case GLUT_RIGHT_BUTTON:FillFlag = ! FillFlag ;break ;}}}glutPostRedisplay ( ) ;// Îáðàáàòûâàåò ñîîáùåíèÿ îò êëàâèàòóðûvoid Keyboard ( unsigned char key , int x , int y ){const char ESCAPE = ' \033 ' ;i f ( key == ESCAPE )}exit (0);void main ( int argc , char{* argv [ ] )g l u t I n i t (&argc , argv ) ;g l u t I n i t D i s p l a y M o d e (GLUT_RGB) ;glutInitWindowSize ( Width , Height ) ;glutCreateWindow ( " Rect draw example (RGB) " ) ;glutDisplayFunc ( Display ) ;glutReshapeFunc ( Reshape ) ;glutKeyboardFunc ( Keyboard ) ;glutMouseFunc ( Mouse ) ;}glutMainLoop ( ) ;Á.2. Ïðèìåð 2: Ìîäåëü îñâåùåíèÿ OPENGL173Ðèñ. Á.1. Ðåçóëüòàò ðàáîòû ïðîãðàììû Á.1. Ñëåâà ðåæèì çàïîëíåíèÿ, ñïðàâà ðåæèì êîíòóðîâ.Á.2.
Ïðèìåð 2: Ìîäåëü îñâåùåíèÿ OpenGLÏðîãðàììà ïðåäíàçíà÷åíà äëÿ äåìîíñòðàöèè ìîäåëè îñâåùåíèÿ OpenGL íà ïðèìåðå ïðîñòîé ñöåíû, ñîñòîÿùåé èç òîðà, êîíóñà è øàðà. Îáúåêòàì íàçíà÷àþòñÿ ðàçíûå ìàòåðèàëû.  ñöåíåïðèñóòñòâóåò òî÷å÷íûé èñòî÷íèê ñâåòà.Ïðîãðàììà Á.2. Ìîäåëü îñâåùåíèÿ OpenGL.#include <s t d l i b . h>#include <GL/ g l u t . h>// ïàðàìåòðû ìàòåðèàëà òîðàfloatfloatfloatfloatmat1_dif [ ] = { 0 . 8 f , 0 . 8 f , 0 . 0 f } ;mat1_amb[] = { 0 .
2 f , 0 . 2 f , 0 . 2 f } ;mat1_spec [ ] = { 0 . 6 f , 0 . 6 f , 0 . 6 f } ;mat1_shininess =0.5 f * 1 2 8 ;// ïàðàìåòðû ìàòåðèàëà êîíóñàfloat mat2_dif [ ] = { 0 . 0 f , 0 . 0 f , 0 . 8 f } ;float mat2_amb[] = { 0 . 2 f , 0 . 2 f , 0 . 2 f } ;float mat2_spec [ ] = { 0 . 6 f , 0 . 6 f , 0 . 6 f } ;Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììû174float mat2_shininess =0.7 f * 1 2 8 ;// ïàðàìåòðû ìàòåðèàëà øàðàfloatfloatfloatfloatmat3_dif [ ] = { 0 . 9 f , 0 .
2 f , 0 . 0 f } ;mat3_amb[] = { 0 . 2 f , 0 . 2 f , 0 . 2 f } ;mat3_spec [ ] = { 0 . 6 f , 0 . 6 f , 0 . 6 f } ;mat3_shininess =0.1 f * 1 2 8 ;// Èíèöèàëèçèðóåì ïàðàìåòðû ìàòåðèàëîâ è// èñòî÷íèêà ñâåòàvoid i n i t ( void ){GLfloatGLfloatGLfloatGLfloatlight_ambient [ ] = { 0 . 0 , 0 . 0 , 0 . 0 , 1 . 0 } ;light_diffuse [ ] = { 1.0 , 1.0 , 1.0 , 1.0 };light_specular [ ] = { 1.0 , 1.0 , 1.0 , 1.0 };light_position [ ] = { 1.0 , 1.0 , 1.0 , 0.0 };/* óñòàíàâëèâàåì ïàðàìåòðû èñòî÷íèêà ñâåòà */g l L i g h t f v (GL_LIGHT0,light_ambient ) ;g l L i g h t f v (GL_LIGHT0,light_diffuse );g l L i g h t f v (GL_LIGHT0,light_specular );g l L i g h t f v (GL_LIGHT0,light_position );GL_AMBIENT,GL_DIFFUSE,GL_SPECULAR,GL_POSITION,/* âêëþ÷àåì îñâåùåíèå è èñòî÷íèê ñâåòà */glEnable (GL_LIGHTING ) ;glEnable (GL_LIGHT0 ) ;/* âêëþ÷àåì z −áóôåð */glEnable (GL_DEPTH_TEST) ;}// Ôóíêöèÿ âûçûâàåòñÿ ïðè íåîáõîäèìîñòè// ïåðåðèñîâêè èçîáðàæåíèÿ .Á.2.
Ïðèìåð 2: Ìîäåëü îñâåùåíèÿ OPENGL//  íåé îñóùåñòâëÿåòñÿ âå ñü âûâîä ãåîìåòðèè .void d i s p l a y ( void ){/* î÷èùàåì áóôåð êàäðà è áóôåð ãëóáèíû */g l C l e a r (GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT) ;glPushMatrix ( ) ;glRotatef (20.0 , 1.0 , 0.0 , 0 . 0 ) ;/* îòîáðàæàåì òîð */g l M a t e r i a l f v (GL_FRONT,GL_AMBIENT,mat1_amb ) ;g l M a t e r i a l f v (GL_FRONT,GL_DIFFUSE,mat1_dif ) ;g l M a t e r i a l f v (GL_FRONT,GL_SPECULAR,mat1_spec ) ;g l M a t e r i a l f (GL_FRONT, GL_SHININESS ,mat1_shininess ) ;glPushMatrix ( ) ;g l T r a n s l a t e f ( − 0.75 , 0 . 5 , 0 . 0 ) ;glRotatef (90.0 , 1.0 , 0.0 , 0 .
0 ) ;g l u t S o l i d T o r u s ( 0 . 2 7 5 , 0 . 8 5 , 15 , 1 5 ) ;glPopMatrix ( ) ;/* îòîáðàæàåì êîíóñ */g l M a t e r i a l f v (GL_FRONT,GL_AMBIENT,mat2_amb ) ;g l M a t e r i a l f v (GL_FRONT,GL_DIFFUSE,mat2_dif ) ;g l M a t e r i a l f v (GL_FRONT,GL_SPECULAR,mat2_spec ) ;g l M a t e r i a l f (GL_FRONT, GL_SHININESS ,mat2_shininess ) ;glPushMatrix ( ) ;175176Ïðèëîæåíèå Á.
Äåìîíñòðàöèîííûå ïðîãðàììûg l T r a n s l a t e f ( − 0.75 , − 0.5 , 0 . 0 ) ;glRotatef (270.0 , 1.0 , 0.0 , 0 . 0 ) ;g l u t S o l i d C o n e ( 1 . 0 , 2 . 0 , 15 , 1 5 ) ;glPopMatrix ( ) ;/* îòîáðàæàåì øàð */g l M a t e r i a l f v (GL_FRONT,GL_AMBIENT,mat3_amb ) ;g l M a t e r i a l f v (GL_FRONT,GL_DIFFUSE,mat3_dif ) ;g l M a t e r i a l f v (GL_FRONT,GL_SPECULAR,mat3_spec ) ;g l M a t e r i a l f (GL_FRONT, GL_SHININESS ,mat3_shininess ) ;glPushMatrix ( ) ;g l T r a n s l a t e f ( 0 . 7 5 , 0 . 0 , − 1.0);g l u t S o l i d S p h e r e ( 1 . 0 , 15 , 1 5 ) ;glPopMatrix ( ) ;glPopMatrix ( ) ;/* âûâîäèì ñöåíó íà ýêðàí */}glFlush ( ) ;// Âûçûâàåòñÿ ïðè èçìåíåíèè ïîëüçîâàòåëåì// ðàçìåðîâ îêíàvoid reshape ( int w, int h ){// óñòàíàâëèâàåì ðàçìåð îáëàñòè âûâîäà// ðàâíûì ðàçìåðó îêíàglViewport ( 0 , 0 , ( G L s i z e i ) w, ( G L s i z e i ) h ) ;// çàäàåì ìàòðèöó ïðîåêöèè ñ ó÷åòîì// ðàçìåðîâ îêíàglMatrixMode (GL_PROJECTION) ;glLoadIdentity ( ) ;Á.2.
Ïðèìåð 2: Ìîäåëü îñâåùåíèÿ OPENGLgluPerspective (// óãîë çðåíèÿ â ãðàäóñàõ40.0 ,// êîýôôèöèåíò ñæàòèÿ îêíà( GLfloat )w/h ,// ðàññòîÿíèå äî ïëîñêîñòåé îòñå÷åíèÿ1 ,100.0);glMatrixMode (GL_MODELVIEW) ;glLoadIdentity ( ) ;gluLookAt (// ïîëîæåíèå êàìåðû0.0 f ,0.0 f ,8.0 f ,// öåíòð ñöåíû0.0 f ,0.0 f ,0.0 f ,// ïîëîæèòåëüíîå íàïðàâëåíèå îñè y0.0 f ,1.0 f ,0.0 f ) ;}// Âûçûâàåòñÿ ïðè íàæàòèè êëàâèøè íà êëàâèàòóðåvoid keyboard ( unsigned char key , int x , int y ){}//////switch ( key ) {case 2 7 : /*}int{exit (0);break ;e s c a p e */Ãëàâíûé öèêë ïðèëîæåíèÿÑîçäàåòñÿ îêíî , óñòàíàâëèâàåòñÿ ðåæèìýêðàíà ñ áóôåðîì ãëóáèíûmain ( int argc , char ** argv )g l u t I n i t (&argc , argv ) ;177178}Ïðèëîæåíèå Á. Äåìîíñòðàöèîííûå ïðîãðàììûglutInitDisplayMode (GLUT_SINGLE |GLUT_RGB |GLUT_DEPTH) ;glutInitWindowSize ( 5 0 0 , 5 0 0 ) ;glutCreateWindow ( argv [ 0 ] ) ;init ();glutReshapeFunc ( reshape ) ;glutDisplayFunc ( d i s p l a y ) ;glutKeyboardFunc ( keyboard ) ;glutMainLoop ( ) ;return 0 ;Ðèñ.
Á.2. Ðåçóëüòàò ðàáîòû ïðîãðàììû Á.2.Á.3. Çàãðóçêà 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.