Пример приложения
Типичная программа, использующая OpenGL, начинается с определения окна, в котором будет происходить отображение. Затем создается контекст (клиент) OpenGL и ассоциируется с этим окном. Далее программист может свободно использовать команды и операции OpenGL API. Ниже приведен текст небольшой программы, написанной с использованием библиотеки GLUT. Результат работы программы –красный квадрат в центре окна.
#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(); }
Рассмотрим более подробно функцию 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 и оконной подсистемой, предоставляя минимальный интерфейс. Рассмотрим функцию 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();
очищает окно и выводит на экран квадрат, задавая координаты четырех угловых вершин и цвет.
|