Главная страница

Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика


Скачать 0.66 Mb.
НазваниеРуководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
Дата21.10.2022
Размер0.66 Mb.
Формат файлаdocx
Имя файла221937-83556.docx
ТипРуководство
#747097
страница4 из 30
1   2   3   4   5   6   7   8   9   ...   30
29

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



Рис. 2.2. Функционирование конвейера OpenGL

OpenGL является прослойкой между аппаратурой и пользо­вательским уровнем, что позволяет предоставлять единый ин­терфейс на разных платформах, используя возможности аппа­ратной поддержки.

Кроме того, OpenGL можно рассматривать как конечный ав-

30

Глава 2. Введение в OPENGL

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

2.4. Синтаксис команд

Определения команд GL находятся в файле gl.h, для вклю­чения которого нужно написать

^include

Для работы с библиотекой GLU нужно аналогично подклю­чить файл glu.h. Версии этих библиотек, как правило, вклю­чаются в дистрибутивы систем программирования, например, Microsoft Visual C++ или Borland C++ Builder. В отличие от стандартных библиотек, пакет GLUT нужно инсталлировать и подключать отдельно. Подробная информация о настройке сред программирования для работы с OpenGL приведена в Части III.

Все команды (процедуры и функции) библиотеки GL начина­ются с префикса gl, все константы — с префикса GL_. Соответ­ствующие команды и константы библиотек GLU и GLUT ана­логично имеют префиксы glu (GLU_) и glut (GLUT_) Кроме того, в имена команд входят суффиксы, несущие информацию о числе и типе передаваемых параметров. В OpenGL полное имя команды имеет вид:

type glCommand_name[ 1 2 3 4][b s i f d ub us ui][v]

(typel argl ,..., typeN argN)

Имя состоит из нескольких частей:

2.5. Пример приложения

31

gl —имя библиотеки, в которой описана эта функция: для ба­зовых функций OpenGL, функций из библиотек GL, GLU, GLUT, GLAUX это gl, glu, glut, aux соответственно;

Command name —имя команды (процедуры или функции);

[12 3 4 ] — число аргументов команды;

[b s i f d ub us ui ] — тип аргумента: символ b — GLbyte (ана­лог char в C/C++), символ i — GLint (аналог int), символ f— GLfloat (аналог float) и так далее. Полный список типов и их описание можно посмотреть в файле gl.li;

[v ] — наличие этого символа показывает, что в качестве пара­метров функции используется указатель на массив значе­ний.

Символы в квадратных скобках в некоторых названиях не используются. Например, команда glVertex2i() описана в библио­теке GL и использует в качестве параметров два целых числа, а команда glColor3fv () использует в качестве параметра указатель на массив из трех вещественных чисел.

Использования нескольких вариантов каждой команды мож­но частично избежать, применяя перегрузку функций языка C++. Но интерфейс OpenGL не рассчитан на конкретный язык программирования, и, следовательно, должен быть максимально универсален.

2.5. Пример приложения

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

32

Глава 2. Введение в OPENGL

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

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

Программа 2.1. Простейший пример OpenGL.

^include

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

^include

// начальная ширина и высота окна 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.7, 0.7, 0.7, 1); g 1С1 e ar (GL_COLOR_BUFFTER_Brr);

glColor3ub (255 ,0 ,0); glBegin(GL_QUADS); glVertex2f (left , bottom ) ; glVertex2f (left , top ); glVertex2f( right , top ); glVertex2f( right , bottom ) ;

2.5. Пример приложения

33

glEnd();

glFinish () ; }

// Функция вызывается при изменении размеров окна void Reshape (GLint w, GLint h)

{

Width = w;

Height = h;

/* устанавливаем размеры области отображения */ glViewport (0 , 0, w, h);

/* ортографическая проекция */ glMatrixMode (GL_PROJECTION); glLoadldentity () ; glOrtho(0, w, 0, h, -1.0, 1.0);

glMatrixMode (GL_MODELVIEW); glLoadldentity () ; }

// Функция обрабатывает сообщения от клавиатуры void Keyboard ( unsigned char key, int x, int у )

{

const char ESCAPE = '\033';

if ( key = ESCAPE ) exit(0); }

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

void main (int argc , char *argv[])

{

glutlnit (&argc, argv);

34

Глава 2. Введение в OPENGL

glutlnitDisplayMode (GLUT_RGB) ; glutlnitWindowSize (Width , Height ); glutCreateWindow ("Redwsquare„example " );

glutDisplayFunc( Display ) ; gl ut Re shape Fun с (Reshape ) ; glutKeyboardFunc (Keyboard);

glutMainLoop () ; }



Рис. 2.З. Результат работы программы 2.1.

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

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

Рассмотрим более подробно функцию main данного примера.

2.5. Пример приложения

35

Она состоит из трех частей: инициализации окна, в котором бу­дет рисовать OpenGL, настройки функций с обратным вызовом и главного цикла обработки событий.

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

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

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

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

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

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

glutDisplayFunc( Display); glutReshapeFunc (Reshape ); glutKeyboardFimc (Keyboard ) ;

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

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

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

1   2   3   4   5   6   7   8   9   ...   30


написать администратору сайта