Наконец, нужно вызвать соответствующие стандартные функции OpenGL, чтобы создать наш отрезок прямой. Следующий код задает двухмерный прямолинейный отрезок с целочисленными декартовыми координатами его концов (180, 15) и (10, 145). В главе 3 будет дано подробное объяснение этих функций, а также других функций OpenGL, позволяющих создавать графические примитивы.

glBegin (GL_LINES) ;

glVertex2i (180, 15); glVertex2i (10, 145); glEnd ( ); Теперь мы готовы к тому, чтобы собрать все части воедино. Следующая программа OpenGL состоит из трех процедур. Мы поместили все функции инициализации и присваивания соответствующих одноразовых параметров в процедуру init. Геометрическое описание “рисунка”, который мы хотим изобразить, содержится в процедуре lineSegment, которая обозначается функцией библиотеки GLUT glutDisplay-Func. А в процедуре main записаны функции библиотеки GLUT, отображающие окно и наш отрезок прямой на экран. На рис. 2.62 показано окно изображения и отрезок прямой красного цвета, полученный с помощью этой программы.

♦include <GL/glut.h> // (или другие, в зависимости

// от используемой системы)

void init (void){

glClearColor (1.0, 1.0, 1.0, 0.0); // Задает белый цвет

// окна изображения. glMatrixMode (GL_PROJECTION); // Задает параметры

// проектирования.

glu0rtho2D (0.0, 200.0, 0.0, 150.0);

}

void lineSegment (void) {

glClear (GL_COLOR_BUFFER_BIT);

/* Очищает окно изображения. */

glColor3f (1.0, 0.0, 0.0); // Задает красный цвет отрезка.

glBegin (GL_LINES);

glVertex2i (180, 15); // Описывает геометрию отрезка.

glVertex2i (10, 145); glEnd ( ); glFlush ( );

/* Обрабатывает все функции OpenGL как можно быстрее. */

}

void main (int arge, char** argv){

glutlnit (Sarge, argv); // Инициализация GLUT.

glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB);

/* Установка режима дисплея. */ glutlnitWindowPosition (50, 100);

/* Задает верхнее левое положение окна изображения. */ glutlnitWindowSize (400, 300); // Задает ширину и высоту

// окна изображения. glutCreateWindow ("En Example OpenGL Program");

/* Создает окно изображения. */

init ( ); // Процедура инициализации.

glutDisplayFunc (lineSegment); // Посылает графическое

// изображение в окно. glutMainLoop ( ); // Изображает все и ожидает.

}

В конце процедуры lineSegment стоит функция, glFlush, которую мы еще не обсуждали. Это просто стандартная функция для ускорения выполнения функций OpenGL, записанных в буферах, которые находятся в различных местах вычислительной системы, в зависимости от того, как реализована сама программа OpenGL. В загруженной сети, например, могут быть задержки при обработке данных в некоторых буферах. Но вызов функции glFlush приводит к освобождению таких буферов и обработке функций OpenGL.

Окно изображения и отрезок прямой, полученный с помощью демонстрационной программы

Рис. 2.62. Окно изображения и отрезок прямой, полученный с помощью демонстрационной программы

Процедура lineSegment, которую мы установили для описания нашего рисунка, называется функцией обратного вызова изображения. И эта процедура описывается так, что она “регистрируется” функцией glutDisplayFunc как стандартная функция, которая вызывается всякий раз, когда может понадобиться заново вывести на экран окно изображения. Это может произойти, например, если окно изображения передвигается. В последующих главах мы посмотрим на другие типы функций обратного вызова и связанные с ними стандартные функции библиотеки GLUT, которые используются для их регистрации. В общем случае, программы OpenGL строятся в виде набора функций обратного вызова, которые вызываются при выполнении определенных действий.


⇐ вернуться назад | | далее ⇒