ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 09.06.2020
Просмотров: 1701
Скачиваний: 4
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);
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();
}
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);
/*
включаем
освещение
и
источник
света
*/
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);
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;
}