ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.06.2020

Просмотров: 3124

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 16

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

 


background image

 17

 
/* 

Функция

обрабатывает

сообщения

от

клавиатуры

 */ 

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 

обратным

вызовом

и

главного

цикла

обработки

событий

Инициализация

окна

состоит

из

настройки

соответствующих

буферов

кадра

начального

положения

и

размеров

окна

а

также

заголовка

окна


background image

 18

Функция

   

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, X Window 

и

т

.

д

.), 

которые

как

правило

предоставляют

более

широкие

возможности

Более

подробно

работа

с

библиотекой

 GLUT 

описана

в

Приложении

А

Все

вызовы

команд

 OpenGL 

происходят

в

обработчиках

событий

Более

подробно

они

будут

рассмотрены

в

следующих

главах

Сейчас

обратим

внимание

на

функцию

 Display, 

в

которой

сосредоточен

код

непосредственно

отвечающий

за

  

рисование

на

экране

.  

Следующая

последовательность

команд

из

функции

 Display 

glClearColor(0, 0, 0, 1); 
glClear(GL_COLOR_BUFFER_BIT); 
     
glColor3ub(255,0,0); 
glBegin(GL_QUADS); 


background image

 19

  glVertex2f(left,bottom); 
  glVertex2f(left,top); 
  glVertex2f(right,top); 
  glVertex2f(right,bottom); 
glEnd(); 

очищает

окно

и

выводит

на

экран

квадрат

задавая

координаты

четырех

угловых

вершин

и

цвет

.  

В

приложении

 D.1 

приведен

еще

один

пример

несложной

программы

при

нажатии

кнопку

мыши

рисующей

на

экране

разноцветные

случайные

прямоугольники

.  

Контрольные

вопросы

1. 

В

чем

по

вашему

мнению

заключается

необходимость

создания

стандартной

графической

библиотеки

2. 

Кратко

опишите

архитектуру

библиотек

 OpenGL 

и

организацию

конвейера

3. 

В

чем

заключаются

функции

библиотек

подобных

 GLUT 

или

GLX? 

Почему

они

формально

не

входят

в

 OpenGL? 

4. 

Назовите

категории

команд

 (

функций

библиотеки

5. 

Почему

организацию

 OpenGL 

часто

сравнивают

с

конечным

автоматом

6. 

Зачем

нужны

различные

варианты

команд

 OpenGL, 

отличающиеся

только

типами

параметров

7. 

Что

можно

сказать

о

количестве

и

типе

параметров

команды

glColor4ub()? glVertex3fv()?


background image

 20

Глава

 2  

Рисование

геометрических

объектов

2.1. 

Процесс

обновления

изображения

Как

правило

задачей

программы

использующей

 OpenGL, 

является

обработка

трехмерной

сцены

и

интерактивное

отображение

в

буфере

кадра

Сцена

состоит

из

набора

трехмерных

объектов

источников

света

и

виртуальной

камеры

определяющей

текущее

положение

наблюдателя

.  

Обычно

приложение

 OpenGL 

в

бесконечном

цикле

вызывает

функцию

обновления

изображения

в

окне

В

этой

функции

и

сосредоточены

вызовы

основных

команд

 OpenGL. 

Если

используется

библиотека

 GLUT, 

то

это

будет

функция

с

обратным

вызовом

зарегистрированная

с

помощью

вызова

glutDisplayFunc(). 

GLUT 

вызывает

эту

функцию

когда

операционная

система

информирует

приложение

о

том

что

содержимое

окна

необходимо

перерисовать

(

например

если

окно

было

перекрыто

другим

). 

Создаваемое

изображение

может

быть

как

статичным

так

и

анимированным

т

.

е

зависеть

от

каких

-

либо

параметров

изменяющихся

со

временем

В

этом

случае

лучше

вызывать

функцию

обновления

самостоятельно

Например

с

помощью

команды

glutPostRedisplay()

За

более

подробной

информацией

можно

обратиться

к

приложению

 A. 

Приступим

наконец

к

тому

чем

занимается

типичная

функция

обновления

изображения

Как

правило

она

состоит

из

трех

шагов

1. 

очистка

буферов

 OpenGL; 

2. 

установка

положения

наблюдателя

3. 

преобразование

и

рисование

геометрических

объектов

Очистка

буферов

производится

с

помощью

команды

void 

glClearColor

 ( clampf 

r

, clampf 

g

, clampf 

b

,  

                    clampf 

a

 ) 

void 

glClear

(bitfield 

buf