Скачиваний:
115
Добавлен:
23.02.2015
Размер:
702.98 Кб
Скачать
    1. Пример приложения

Типичная программа, использующая OpenGL, начинается с определения окна, в котором будет происходить отображение. Затем создается контекст (клиент)OpenGLи ассоциируется с этим окном. Далее программист может свободно использовать команды и операцииOpenGLAPI.

Ниже приведен текст небольшой программы, написанной с использованием библиотеки GLUT– своеобразный аналог классического примера “Hello,World!”.

Все, что делает эта программа – рисует в центре окна красный квадрат. Тем не менее, даже на этом простом примере можно понять принципы программирования с помощью OpenGL.

#include <stdlib.h>

/* подключаем библиотеку GLUT*/

#include <gl/glut.h>

/* начальная ширина и высота окна */

GLint Width = 512, Height = 512;

/* размер куба */

const int CubeSize = 200;

/* эта функция управляет всем выводом на экран */

void Display(void)

{

int left, right, top, bottom;

left = (Width - CubeSize) / 2;

right = left + CubeSize;

bottom = (Height - CubeSize) / 2;

top = bottom + CubeSize;

glClearColor(0, 0, 0, 1);

glClear(GL_COLOR_BUFFER_BIT);

glColor3ub(255,0,0);

glBegin(GL_QUADS);

glVertex2f(left,bottom);

glVertex2f(left,top);

glVertex2f(right,top);

glVertex2f(right,bottom);

glEnd();

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

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("Red square example");

glutDisplayFunc(Display);

glutReshapeFunc(Reshape);

glutKeyboardFunc(Keyboard);

glutMainLoop();

}

Несмотря на малый размер, это полностью завершенная программа, которая должна компилироваться и работать на любой системе, поддерживающей OpenGL и GLUT.

Библиотека GLUTподдерживает взаимодействие с пользователем с помощью так называемых функцийcобратным вызовом (callback function). Если пользователь подвинул мышь, нажал на кнопку клавиатуры или изменил размеры окна, происходит событие и вызывается соответствующая функция пользователя – обработчик событий (функция с обратным вызовом).

Рассмотрим более подробно функцию main данного примера. Она состоит из трех частей – инициализации окна, в котором будет рисоватьOpenGL, настройки функцийcобратным вызовом и главного цикла обработки событий.

Инициализация окна состоит из настройки соответствующих буферов кадра, начального положения и размеров окна, а также заголовка окна.

Функция glutInit(&argc, argv)производит начальную инициализацию самой библиотекиGLUT.

Команда glutInitDisplayMode(GLUT_RGB) инициализирует буфер кадра и настраивает полноцветный (непалитровый) режимRGB.

glutInitWindowSize(Width, Height)используется для задания начальных размеров окна.

Наконец, glutCreateWindow("Red square example") задает заголовок окна и визуализирует само окно на экране.

Затем команды

glutDisplayFunc(Display);

glutReshapeFunc(Reshape);

glutKeyboardFunc(Keyboard);

регистрируют функции Display(),Reshape()иKeyboard()как функции, которые будут вызваны, соответственно, при перерисовке окна, изменении размеров окна, нажатии клавиши на клавиатуре.

Контроль всех событий и вызов нужных функций происходит внутри бесконечного цикла в функции glutMainLoop()

Заметим, что библиотека GLUTне входит в составOpenGL, а является лишь переносимой прослойкой междуOpenGLи оконной подсистемой, предоставляя минимальный интерфейс.OpenGL-приложение для конкретной платформы может быть написано с использованием специфическихAPI(Win32,XWindowи т.д.), которые как правило предоставляют более широкие возможности.

Более подробно работа с библиотекой GLUTописана в Приложении А.

Все вызовы команд OpenGLпроисходят в обработчиках событий. Более подробно они будут рассмотрены в следующих главах. Сейчас обратим внимание на функциюDisplay, в которой сосредоточен код, непосредственно отвечающий за рисование на экране.

Следующая последовательность команд из функции Display

glClearColor(0, 0, 0, 1);

glClear(GL_COLOR_BUFFER_BIT);

glColor3ub(255,0,0);

glBegin(GL_QUADS);

glVertex2f(left,bottom);

glVertex2f(left,top);

glVertex2f(right,top);

glVertex2f(right,bottom);

glEnd();

очищает окно и выводит на экран квадрат, задавая координаты четырех угловых вершин и цвет.

В приложении B.1 приведен еще один пример несложной программы, при нажатии кнопку мыши рисующей на экране разноцветные случайные прямоугольники.

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