Главная страница

Планета знаний


Скачать 1.68 Mb.
НазваниеПланета знаний
АнкорOpenGL book
Дата14.06.2021
Размер1.68 Mb.
Формат файлаpdf
Имя файлаgltutorialcourse2.pdf
ТипКнига
#217321
страница7 из 9
1   2   3   4   5   6   7   8   9

// с заполнением ?
int
F i l l F l a g = 1 ;
long
Seed = 0 ;
// функция отображает прямоугольник void DrawRect ( float x1 , float y1 ,
float x2 , float y2 ,
int F i l l F l a g )
{
glBegin ( 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 ) ;
gl Cle ar C o l o r (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-приложение
171
b = random ( 1 ) ;
g l C o l o r 3 f ( 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 ) ;
}
g l F i n i s h ( ) ;
}
// Вызывается при изменении размеров окна void Reshape ( GLint w, GLint h)
{
Width = w;
Height = h ;
glViewport (0 , 0 , w, h ) ;
glMatrixMode (GL_PROJECTION) ;
glLoadIde nt ity ( ) ;
glOrtho (0 , w, 0 , h , ?1.0 , 1 . 0 ) ;
glMatrixMode (GL_MODELVIEW) ;
glLo adIde ntity ( ) ;
}
// Обрабатывает сообщения от мыши void Mouse ( int button , int state ,
int x , int y )
{
i f ( s t a t e == GLUT_DOWN ) {
switch ( button ) {
case GLUT_LEFT_BUTTON:
Seed = random (RAND_MAX) ;

172
Приложение Б. Демонстрационные программы break ;
case GLUT_RIGHT_BUTTON:
F i l l F l a g = ! F i l l F l a g ;
break ;
}
glutPostRedisplay ( ) ;
}
}
// Обрабатывает сообщения от клавиатуры void Keyboard ( unsigned char key , int x , int y )
{
const char ESCAPE = ' \033 ' ;
i f ( key == ESCAPE )
e x i t ( 0 ) ;
}
void main ( int argc , char * argv [ ] )
{
g l u t I n i t (&argc , argv ) ;
glutInitDisplayMode (GLUT_RGB) ;
glutInitWindowSize ( Width , Height ) ;
glutCreateWindow ( "Rect draw example (RGB) " ) ;
glutDisplayFunc ( Display ) ;
glutReshapeFunc ( Reshape ) ;
glutKeyboardFunc ( Keyboard ) ;
glutMouseFunc ( Mouse ) ;
glutMainLoop ( ) ;
}

Б.2. Пример 2: Модель освещения OPENGL
173
Рис. Б.1. Результат работы программы Б.1. Слева  режим за- полнения, справа  режим контуров.
Б.2. Пример 2: Модель освещения OpenGL
Программа предназначена для демонстрации модели освеще- ния OpenGL на примере простой сцены, состоящей из тора, ко- нуса и шара. Объектам назначаются разные материалы. В сцене присутствует точечный источник света.
Программа Б.2. Модель освещения OpenGL.
#include
#include
// параметры материала тора float mat1_dif [ ] = { 0 . 8 f , 0 . 8 f , 0 . 0 f } ;
float mat1_amb[]= {0.2 f , 0 . 2 f , 0 . 2 f } ;
float mat1_spec [ ] = { 0 . 6 f , 0 . 6 f , 0 . 6 f } ;
float mat1_shininess =0.5 f *128;
// параметры материала конуса 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 } ;

174
Приложение Б. Демонстрационные программы float mat2_shininess =0.7 f *128;
// параметры материала шара float mat3_dif [ ] = { 0 . 9 f , 0 . 2 f , 0 . 0 f } ;
float mat3_amb[]= {0.2 f , 0 . 2 f , 0 . 2 f } ;
float mat3_spec [ ] = { 0 . 6 f , 0 . 6 f , 0 . 6 f } ;
float mat3_shininess =0.1 f *128;
// Инициализируем параметры материалов и
// источника света void i n i t ( void )
{
GLfloat light_ambient [ ] = { 0 . 0 , 0 . 0 , 0 . 0 , 1. 0 } ;
GLfloat l i g h t _ d i f f u s e [ ] = { 1 . 0 , 1 . 0 , 1 . 0 , 1 . 0 } ;
GLfloat l i g h t _ s p e c u l a r [ ] = { 1 . 0 , 1 . 0 , 1 . 0 , 1 . 0 } ;
GLfloat l i g h t _ p o s i t i o n [ ] = { 1 . 0 , 1 . 0 , 1 . 0 , 0 . 0 } ;
/* устанавливаем параметры источника света */
g l L i g h t f v (GL_LIGHT0, GL_AMBIENT,
light_ambient ) ;
g l L i g h t f v (GL_LIGHT0, GL_DIFFUSE,
l i g h t _ d i f f u s e ) ;
g l L i g h t f v (GL_LIGHT0, GL_SPECULAR,
l i g h t _ s p e c u l a r ) ;
g l L i g h t f v (GL_LIGHT0, GL_POSITION,
l i g h t _ p o s i t i o n ) ;
/* включаем освещение и источник света */
glEnable (GL_LIGHTING) ;
glEnable (GL_LIGHT0) ;
/* включаем z?буфер */
glEnable (GL_DEPTH_TEST) ;
}
// Функция вызывается при необходимости
// перерисовки изображения .

Б.2. Пример 2: Модель освещения OPENGL
175
// В ней осуществляется весь вывод геометрии .
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 ( ) ;
g l R o t a t e f ( 2 0 . 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 ) ;
g l R o t a t e f ( 9 0 . 0 , 1 . 0 , 0 . 0 , 0 . 0 ) ;
glut S oli d T oru 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 ( ) ;

176
Приложение Б. Демонстрационные программы g l T r a n s l a t e f ( ?0.75 , ?0.5 , 0 . 0 ) ;
g l R o t a t e f ( 2 7 0 . 0 , 1 . 0 , 0 . 0 , 0 . 0 ) ;
glutSolidCone ( 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 , ( GLsizei ) w, ( GLsizei ) h ) ;
// задаем матрицу проекции с учетом
// размеров окна glMatrixMode (GL_PROJECTION) ;
glLo adI de nt ity ( ) ;

Б.2. Пример 2: Модель освещения OPENGL
177
g l u P e r s p e c t i v e (
// угол зрения в градусах
4 0 . 0 ,
// коэффициент сжатия окна
( GLfloat )w/h ,
// расстояние до плоскостей отсечения
1 , 1 0 0 . 0 ) ;
glMatrixMode (GL_MODELVIEW) ;
glLo adI de nt ity ( ) ;
gluLookAt (
// положение камеры
0 . 0 f , 0 . 0 f , 8 . 0 f ,
// центр сцены
0 . 0 f , 0 . 0 f , 0 . 0 f ,
// положительное направление оси y
0. 0 f , 1 . 0 f , 0 . 0 f ) ;
}
// Вызывается при нажатии клавиши на клавиатуре void keyboard ( unsigned char key , int x , int y )
{
switch ( key ) {
case 2 7: /* escape */
e x i t ( 0 ) ;
break ;
}
}
// Главный цикл приложения
//
Создается окно , устанавливается режим
//
экрана с буфером глубины int main ( int argc , char** argv )
{
g l u t I n i t (&argc , argv ) ;

178
Приложение Б. Демонстрационные программы glutInitDisplayMode (
GLUT_SINGLE |
GLUT_RGB |
GLUT_DEPTH) ;
glutInitWindowSize (500 , 5 0 0 ) ;
glutCreateWindow ( argv [ 0 ] ) ;
i n i t ( ) ;
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 файла
179
int LoadBMP( const char* filename , IMAGE* out_img )
Параметр
lename определяет имя файла. Результат выполне- ния функции записывается в структуру out_img
, которая опре- делена следующим образом:
typedef struct _IMAGE
{
int width ;
int height ;
unsigned char* data ;
} IMAGE;
Поля width и
height хранят, соответственно, высоту и ширину изображения. В поле data построчно хранится само изображение,
в виде последовательности RGB-компонент цветов пикселей.
Программа Б.3. Загрузка BMP. Файл loadbmp.h.
#ifndef _LOADBMP_H
#define _LOADBMP_H
typedef struct _IMAGE
{
int width ;
int height ;
unsigned char* data ;
} IMAGE;
int LoadBMP( const char* f i l e , IMAGE* out_img ) ;
#endif
Программа Б.4. Загрузка BMP. Файл loadbmp.cpp.
#include "loadbmp . h"
#include

180
Приложение Б. Демонстрационные программы
#include
#include
// размер заголовка 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 = buf [ 3 ] ;
numb = (numb << 8) | buf [ 2 ] ;
numb = (numb << 8) | buf [ 1 ] ;
numb = (numb << 8) | buf [ 0 ] ;
return numb ;
}
int ReadFileHeader (FILE* f , int * bitmap_pos )
{
unsigned char header [BMP_SIZE_FILEHEADER ] ;
size_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 файла
181
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 = o f f s e t ;
return 1 ;
}
// загрузка BMP?файла int LoadBMP( const char* f i l e , IMAGE* out_img )
{
FILE* f ;
int bitmap_pos ;
unsigned char buf [ 4 0 ] ;
size_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 " ) ;

182
Приложение Б. Демонстрационные программы i f ( ! f )
return 0 ;
i f ( out_img == NULL)
return 0 ;
// читаем заголовок i f ( ! ReadFileHeader ( f , &bitmap_pos ) )
{
f c l o s e ( f ) ;
return 0 ;
}
i f ( f s e e k ( f , BMP_SIZE_FILEHEADER, SEEK_SET) )
{
f c l o s e ( f ) ;
return 0 ;
}
numb = f r e a d ( buf , 40 , 1 , f ) ;
i f (numb != 1)
{
f c l o s e ( f ) ;
return 0 ;
}
x_res = ( int ) uInt32Number ( buf + 4 ) ;
y_res = ( int ) uInt32Number ( buf + 8 ) ;
n_bits
= ( int ) uInt16Number ( buf + 1 4 ) ;
compression
= ( int ) uInt32Number ( buf + 1 6 ) ;
size_image
= ( int ) uInt32Number ( buf + 2 0 ) ;
n_used_colors
= ( int ) uInt32Number ( buf + 3 2 ) ;
// читаем только полноцветные файлы i f ( n_bits == BMP_COLOR_BITS_24)

Б.3. Загрузка BMP файла
183
{
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)
{
f c l o s e ( f ) ;
return 0 ;
}
i f ( f s e e k ( f , bitmap_pos , SEEK_SET) )
{
f c l o s e ( 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?>height = 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 ) ;
// заполняем данные из файла

184
Приложение Б. Демонстрационные программы for ( y = 0 ; y < y_res ; y++)
{
size_t numb = 0 ;
int x = 0 ;
numb = f r e a d ( rgb , rgb_size , 1 , f ) ;
i f (numb != 1)
{
f c l o s e ( 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 ;
}
}
f c l o s e ( f ) ;
f r e e ( rgb ) ;
}
else return 0 ;
return 1 ;
}
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef struct tagBITMAPFILEHEADER

Б.3. Загрузка BMP файла
185
{
WORD
bfType ;
DWORD
b f S i z e ;
WORD
bfReserved1 ;
WORD
bfReserved2 ;
DWORD
b f O f f B i t s ;
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER {
DWORD b i S i z e ;
long biWidth ;
long biHeight ;
WORD
biPlanes ;
WORD
biBitCount ;
DWORD biCompression ;
DWORD biSizeImage ;
long biXPelsPerMeter ;
long biYPelsPerMeter ;
DWORD biClrUsed ;
DWORD biClrImportant ;
} BITMAPINFOHEADER;
static void IntTo2Bytes ( int val , BYTE buf [ 2 ] )
{
buf [ 0 ] = (BYTE) val ;
buf [ 1 ] = (BYTE) ( val >> 8 ) ;
}
static void IntTo4Bytes ( int val , BYTE buf [ 4 ] )
{
buf [ 0 ] = (BYTE) val ;
buf [ 1 ] = (BYTE) ( val >> 8 ) ;
buf [ 2 ] = (BYTE) ( val >> 1 6 ) ;
buf [ 3 ] = (BYTE) ( val >> 2 4 ) ;
}

186
Приложение Б. Демонстрационные программы
Б.4. Пример 3: Текстурирование и анимация
Результатом выполнения этой программы является построе- ние тетраэдра с вращающимися вокруг него кольцами, на кото- рые нанесена текстура.
При компиляции программы в Microsoft Visual C++ файл
ѕtexture.bmpї надо поместить в каталог проекта или указать полный путь к нему. Если путь не указан, то при запуске ис- полняемого файла из операционной системы файл с текстурой должен находиться в том же каталоге. Для загрузки изображе- ния текстуры программа использует функцию
LoadBMP
, приве- денную в предыдущем пункте.
Программа Б.5. Пример текстурирования и анимации.
#include
#include
#include
#include "loadbmp . h"
#define TETR_LIST 1
GLfloat 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 , c void getnorm ( float a [ 3 ] , float b [ 3 ] , float c [ 3 ] ,
float *n)

Б.4. Пример 3: Текстурирование и анимация
187
{
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 InitVertexTetr ( )
{
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 ] ,

188
Приложение Б. Демонстрационные программы
TetrVertex [ 2 ] , TetrNormal [ 0 ] ) ;
getnorm ( TetrVertex [ 0 ] , TetrVertex [ 2 ] ,
TetrVertex [ 3 ] , TetrNormal [ 1 ] ) ;
getnorm ( TetrVertex [ 0 ] , TetrVertex [ 3 ] ,
TetrVertex [ 1 ] , TetrNormal [ 2 ] ) ;
getnorm ( TetrVertex [ 1 ] , TetrVertex [ 2 ] ,
TetrVertex [ 3 ] , TetrNormal [ 3 ] ) ;
}
// Создание списка построения тетраэдра void MakeTetrList ( )
{
int i ;
glNewList (TETR_LIST,GL_COMPILE) ;
// Задание сторон тетраэдра glBegin (GL_TRIANGLES) ;
for ( i =1; i <4; i++)
{
glNormal3fv ( TetrNormal [ i ?1] ) ;
glVertex3fv ( TetrVertex [ 0 ] ) ;
glVertex3fv ( TetrVertex [ i ] ) ;
i f ( i !=3)
glVertex3fv ( TetrVertex [ i +1] );
else glVertex3fv ( TetrVertex [ 1 ] ) ;
}
glNormal3fv ( TetrNormal [ 3 ] ) ;
glVertex3fv ( TetrVertex [ 1 ] ) ;
glVertex3fv ( TetrVertex [ 2 ] ) ;
glVertex3fv ( TetrVertex [ 3 ] ) ;
glEnd ( ) ;
glEndList ( ) ;
}
void DrawRing ( )
{
// Построение цилиндра ( кольца ) , расположенного

Б.4. Пример 3: Текстурирование и анимация
189
// параллельно оси z
// Второй и третий параметры задают
// радиусы оснований , четвертый высоту ,
// последние два?число разбиений вокруг и
// вдоль оси z . При этом дальнее основание
// цилиндра находится в плоскости z=0
gluCylinder ( QuadrObj , RingRad , RingRad ,
RingHeight , 3 0 , 2 ) ;
}
void TextureInit ( )
{
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 ) ;
// Разрешение наложения этой текстуры на
// quadric ?объекты gluQuadricTexture ( QuadrObj , GL_TRUE) ;
// Задание параметров текстуры
// Повтор изображения по параметрическим

190
Приложение Б. Демонстрационные программы
// осям s и t glTexParameteri (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,
s h i n i n e s s ) ;
// Определение свойств освещения 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. Пример 3: Текстурирование и анимация
191
// Проводить удаление невидимых линий и
// поверхностей 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) ;
// Создания указателя на quadric ?объект
// для построения колец
QuadrObj=gluNewQuadric ( ) ;
// Определение свойств текстуры
TextureInit ( ) ;
// Задание перспективной проекции glMatrixMode (GL_PROJECTION) ;
g l u P e r s p e c t i v e ( 8 9 . 0 , 1 . 0 , 0 . 5 , 1 0 0 . 0 ) ;
// Далее будет проводиться только
// преобразование объектов сцены glMatrixMode (GL_MODELVIEW) ;
}
void DrawFigures ( void )
{
// Включение режима нанесения текстуры glEnable (GL_TEXTURE_2D) ;
// Задаем цвет диффузного отражения для колец g l C o l o r 3 f v ( mat_diff1 ) ;
// Чтобы не проводить перемножение с предыдущей
// матрицей загружаем единичную матрицу glLo adI de nt ity ( ) ;
// Определяем точку наблюдения

192
Приложение Б. Демонстрационные программы 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 ) ;
g l R o t a t e f ( 9 0 , 1 , 0 , 0 ) ;
DrawRing ( ) ;
glPopMatrix ( ) ;
glPushMatrix ( ) ;
g l T r a n s l a t e f (?RingHeight / 2 , 0 , 0 ) ;
g l R o t a t e f ( 9 0 , 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: Текстурирование и анимация
193
g l R o t a t e f (CurAng / 2 , 1 , 0 , 1 ) ;
// Чтобы тетраэдр вращался вокруг центра , его
// надо сдвинуть вниз по оси oz g 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
Приложение Б. Демонстрационные программы
// Инициализация функций библиотеки GLUT
g l u t I n i t (&argc , argv ) ;
// Задание режима с двойной буферизацией ,
// представление цвета в формате RGB,
// использование буфера глубины glutInitDisplayMode (GLUT_DOUBLE |
GLUT_RGB |
GLUT_DEPTH) ;
// Создание окна приложения glutCreateWindow ( "Example o f using OpenGL" ) ;
// Регистрация функции построения изображения glutDisplayFunc ( Display ) ;
// Регистрация функции обновления изображения glutIdleFunc ( Redraw ) ;
// Инициализация функций OpenGL
I n i t ( ) ;
// Цикл обработки событий glutMainLoop ( ) ;
return 0 ;
}
Рис. Б.3. Результат работы программы Б.5.

Б.5. Класс для работы с OPENGL в WIN32 195
Б.5. Класс для работы с OpenGL в Win32
Программа Б.6. Файл glrc.h.
#ifndef _GLRC_H_
#define _GLRC_H_
// заголовки OpenGL
#include
#include
class GLRC
{
public :
// создание из идентификатора окна
GLRC( HWND wnd ) ;
// деструктор

GLRC( ) ;
// удаление (также вызывается из деструктора )
void Destroy ( ) ;
// Создание контекста рисования .
// Необходимо вызвать до использования OpenGL
bool Create ( ) ;

1   2   3   4   5   6   7   8   9


написать администратору сайта