Файл: графическая библиотека opengl.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.06.2020

Просмотров: 1701

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 101

  glVertex2f(x2, y2); 
  glVertex2f(x1, y2); 
  glEnd(); 

 
/* 

управляет

 

всем

 

выводом

 

на

 

экран

 */ 

void 
Display(void) 

  int i; 
  float x1, y1, x2, y2; 
  float r, g, b; 
 
  srand(Seed); 
 
  glClearColor(0, 0, 0, 1); 
  glClear(GL_COLOR_BUFFER_BIT); 
 
  for( i = 0; i < Times; i++ ) { 
    r = random(1); 
    g = random(1); 
    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, FillFlag); 
  } 
 
  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); 
 


background image

 102

  glMatrixMode(GL_MODELVIEW); 
  glLoadIdentity(); 

 
/* 

Обрабатывает

 

сообщения

 

от

 

мыши

 */ 

void 
Mouse(int button, int state, int x, int y) 

  if( state == GLUT_DOWN ) { 
    switch( button ) { 
      case GLUT_LEFT_BUTTON: 
        Seed = random(RAND_MAX); 
        break; 
      case GLUT_RIGHT_BUTTON: 
        FillFlag = !FillFlag; 
        break; 
    } 
    glutPostRedisplay(); 
  } 

 
/* 

Обрабатывает

 

сообщения

 

от

 

клавиатуры

 */ 

void 
Keyboard( unsigned char key, int x, int y ) 

#define ESCAPE '\033' 

 
  if( key == ESCAPE ) 
      exit(0); 

 
main(int argc, char *argv[]) 

  glutInit(&argc, argv); 
  glutInitDisplayMode(GLUT_RGB); 
  glutInitWindowSize(Width, Height); 
  glutCreateWindow("Rect draw example (RGB)"); 
 
  glutDisplayFunc(Display); 
  glutReshapeFunc(Reshape); 
  glutKeyboardFunc(Keyboard); 
  glutMouseFunc(Mouse); 
 
  glutMainLoop(); 


background image

 103

D.2. 

Пример

 2: 

Модель

 

освещения

  OpenGL 

 

Программа

 

предназначена

 

для

 

демонстрации

 

модели

 

освещения

 

OpenGL 

на

 

примере

 

простой

 

сцена

состоящей

 

из

 

тора

конуса

 

и

 

шара

Объектам

 

назначаются

 

разные

 

материалы

В

 

сцене

 

присутствует

 

точечный

 

источник

 

света

 
#include <GL/glut.h> 
#include <stdlib.h> 

 
/* 

параметры

 

материала

 

тора

 */ 

float mat1_dif[]={0.8f,0.8f,0.0f}; 
float mat1_amb[]= {0.2f,0.2f,0.2f}; 
float mat1_spec[]={0.6f,0.6f,0.6f}; 
float mat1_shininess=0.5f*128; 
 
/* 

параметры

 

материала

 

конуса

 */ 

float mat2_dif[]={0.0f,0.0f,0.8f}; 
float mat2_amb[]= {0.2f,0.2f,0.2f}; 
float mat2_spec[]={0.6f,0.6f,0.6f}; 
float mat2_shininess=0.7f*128; 
 
/* 

параметры

 

материала

 

шара

 */ 

float mat3_dif[]={0.9f,0.2f,0.0f}; 
float mat3_amb[]= {0.2f,0.2f,0.2f}; 
float mat3_spec[]={0.6f,0.6f,0.6f}; 
float mat3_shininess=0.1f*128; 
 
/* 

Инициализируем

 

параметры

 

материалов

 

и

 

 * 

источника

 

света

 

 */ 
void init (void) 

   GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; 
   GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; 

   GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; 
   GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 }; 
 
   /* 

устанавливаем

 

параметры

 

источника

 

света

 */ 

   glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient); 
   glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse); 
   glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular); 
   glLightfv (GL_LIGHT0, GL_POSITION, light_position); 
 
   /* 

включаем

 

освещение

 

и

 

источник

 

света

 */ 


background image

 104

   glEnable (GL_LIGHTING); 
   glEnable (GL_LIGHT0); 
 
   /* 

включаем

 z-

буфер

 */ 

   glEnable(GL_DEPTH_TEST); 
 

 
/* 

Функция

 

вызывается

 

при

 

необходимости

 

 * 

перерисовки

 

изображения

В

 

ней

 

осуществляется

 

 * 

весь

 

вывод

 

геометрии

 */ 
void display (void) 

   /* 

очищаем

 

буфер

 

кадра

 

и

 

буфер

 

глубины

 */ 

   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
 
   glPushMatrix (); 
   glRotatef (20.0, 1.0, 0.0, 0.0); 
 
   /* 

отображаем

 

тор

 */ 

   glMaterialfv (GL_FRONT,GL_AMBIENT,mat1_amb); 
   glMaterialfv (GL_FRONT,GL_DIFFUSE,mat1_dif); 
   glMaterialfv (GL_FRONT,GL_SPECULAR,mat1_spec); 
   glMaterialf  (GL_FRONT,GL_SHININESS,mat1_shininess); 
 

   glPushMatrix (); 
   glTranslatef (-0.75, 0.5, 0.0); 
   glRotatef (90.0, 1.0, 0.0, 0.0); 
   glutSolidTorus (0.275, 0.85, 15, 15); 
   glPopMatrix (); 
 
   /* 

отображаем

 

конус

 */ 

   glMaterialfv (GL_FRONT,GL_AMBIENT,mat2_amb); 
   glMaterialfv (GL_FRONT,GL_DIFFUSE,mat2_dif); 
   glMaterialfv (GL_FRONT,GL_SPECULAR,mat2_spec); 
   glMaterialf  (GL_FRONT,GL_SHININESS,mat2_shininess); 
 
   glPushMatrix (); 
   glTranslatef (-0.75, -0.5, 0.0); 
   glRotatef (270.0, 1.0, 0.0, 0.0); 
   glutSolidCone (1.0, 2.0, 15, 15); 
   glPopMatrix (); 
 
   /* 

отображаем

 

шар

 */ 

   glMaterialfv (GL_FRONT,GL_AMBIENT,mat3_amb); 
   glMaterialfv (GL_FRONT,GL_DIFFUSE,mat3_dif); 


background image

 105

   glMaterialfv (GL_FRONT,GL_SPECULAR,mat3_spec); 
   glMaterialf  (GL_FRONT,GL_SHININESS,mat3_shininess); 
 
   glPushMatrix (); 
   glTranslatef (0.75, 0.0, -1.0); 
   glutSolidSphere (1.0, 15, 15); 
   glPopMatrix (); 
 
   glPopMatrix (); 
   /* 

выводим

 

сцену

 

на

 

экран

 */ 

   glFlush (); 

 
/* 

Вызывается

 

при

 

изменении

 

пользователем

 

размеров

 

окна

   

 */ 
void reshape(int w, int h) 

  /* 

устанавливаем

 

размер

 

области

 

вывода

 

   * 

равным

 

размеру

 

окна

 

   */ 
  glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
 
  /* 

задаем

 

матрицу

 

проекции

 

с

 

учетом

 

размеров

 

окна

 */ 

  glMatrixMode (GL_PROJECTION); 
  glLoadIdentity (); 
 

  gluPerspective( 
    40.0, /* 

угол

 

зрения

 

в

 

градусах

 */ 

    (GLfloat)w/h, /* 

коэффициент

 

сжатия

 

окна

 */ 

    1,100.0);  /* 

расстояние

 

до

 

плоскостей

 

отсечения

 */ 

  glMatrixMode (GL_MODELVIEW); 
 
  glLoadIdentity (); 
  gluLookAt( 
   0.0f,0.0f,8.0f, /* 

положение

 

камеры

 */ 

   0.0f,0.0f,0.0f, /* 

центр

 

сцены

 */ 

   0.0f,1.0f,0.0f); /* 

положительное

 

направление

 

оси

 y */ 


 
/* 

Вызывается

 

при

 

нажатии

 

клавиши

 

на

 

клавиатуре

 */ 

void keyboard(unsigned char key, int x, int y) 

   switch (key) { 
      case 27: /* escape */ 
         exit(0); 
         break; 
   }