Скачиваний:
115
Добавлен:
23.02.2015
Размер:
702.98 Кб
Скачать
  1. Демонстрационные программы

    1. Пример 1: Простое glut-приложение

Этот простой пример предназначен для демонстрации структуры GLUT-приложения и простейших основOpenGL. Результатом работы программы является случайный набор цветных прямоугольников, который меняется при нажатии левой кнопки мыши. С помощью правой кнопки мыши можно менять режим заливки прямоугольников.

#include <stdlib.h>

#include <gl/glut.h>

#ifdef random

#undef random

#endif

#define random(m) (float)rand()*m/RAND_MAX

/* ширина и высота окна */

GLint Width = 512, Height = 512;

/* число прямоугольников в окне */

int Times = 100;

/* с заполнением ?*/

int FillFlag = 1;

long Seed = 0;

/* функция отображает прямоугольник */

void

DrawRect( float x1, float y1, float x2, float y2,

int FillFlag )

{

glBegin(FillFlag ? GL_QUADS : GL_LINE_LOOP);

glVertex2f(x1, y1);

glVertex2f(x2, y1);

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);

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();

}

    1. Пример 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);

/* включаем освещение и источник света */

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);

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;

}

}

/* Главный цикл приложения.

* Создается окно, устанавливается режим

* экрана с буфером глубины

*/

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB

| GLUT_DEPTH);

glutInitWindowSize (500, 500);

glutCreateWindow (argv[0]);

init ();

glutReshapeFunc (reshape);

glutDisplayFunc (display);

glutKeyboardFunc (keyboard);

glutMainLoop();

return 0;

}

Соседние файлы в папке Программирование графических приложений