Главная > Контрольные вопросы


Содержание

Введение 4

Глава 1 Основы OpenGL 6

1.1.Основные возможности 6

1.2.Интерфейс OpenGL 7

1.3.Архитектура OpenGL 8

1.4.Синтаксис команд 10

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

Контрольные вопросы: 15

Глава 2 Рисование геометрических объектов 16

2.1.Процесс обновления изображения 16

2.2.Вершины и примитивы 17

2.3.Операторные скобки glBegin / glEnd 19

2.4.Дисплейные списки 24

2.5.Массивы вершин 25

Контрольные вопросы 27

Глава 3 Преобразования объектов 28

3.1.Работа с матрицами 28

3.2.Модельно-видовые преобразования 31

3.3.Проекции 32

3.4.Область вывода 34

Контрольные вопросы 35

Глава 4 Материалы и освещение 36

4.1.Модель освещения 36

4.2.Спецификация материалов 37

4.3.Описание источников света 39

4.4.Создание эффекта тумана 42

Контрольные вопросы 44

Глава 5 Текстурирование 45

5.1.Подготовка текстуры 45

5.2.Наложение текстуры на объекты 48

5.3.Текстурные координаты 51

Контрольные вопросы 53

Глава 6 Операции с пикселями 54

6.1.Смешивание изображений. Прозрачность 55

6.2.Буфер-накопитель 57

6.3.Буфер маски 58

6.4.Управление растеризацией 60

Контрольные вопросы 61

Глава 7 Приемы работы с OpenGL 62

7.1.Устранение ступенчатости 62

7.2.Построение теней 63

7.3.Зеркальные отражения 68

Контрольные вопросы 71

Глава 8 Оптимизация программ 72

8.1.Организация приложения 72

8.2.Оптимизация вызовов OpenGL 76

Контрольные вопросы 84

Приложение A. Структура GLUT-приложения 85

Приложение B. Примитивы библиотек GLU и GLUT 89

Приложение C. Настройка приложений OpenGL 93

C.1.Создание приложения в среде Borland C++ 5.02 93

C.2.Создание приложения в среде MS Visual C++ 6.0 94

C.3.Создание приложения в среде Borland C++ Builder 6. 95

Приложение D. Демонстрационные программы 96

D.1.Пример 1: Простое GLUT-приложение 96

D.2.Пример 2: Модель освещения OpenGL 99

D.3.Загрузка BMP файла 102

D.4.Пример 3: Текстурирование 107

Приложение E. Примеры практических заданий 114

E.1.Cornell Box 114

E.2.Виртуальные часы 116

E.3.Интерактивный ландшафт 117

Литература 122



Введение

OpenGL является одним из самых популярных прикладных программных интерфейсов (API – Application Programming Interface) для разработки приложений в области двумерной и трехмерной графики.

Стандарт OpenGL (Open Graphics Library – открытая графическая библиотека) был разработан и утвержден в 1992 году ведущими фирмами в области разработки программного обеспечения как эффективный аппаратно-независимый интерфейс, пригодный для реализации на различных платформах. Основой стандарта стала библиотека IRIS GL, разработанная фирмой Silicon Graphics Inc.

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

На сегодняшний день графическая система OpenGL поддерживается большинством производителей аппаратных и программных платформ. Эта система доступна тем, кто работает в среде Windows, пользователям компьютеров Apple. Свободно распространяемые коды системы Mesa (пакет API на базе OpenGL) можно компилировать в большинстве операционных систем, в том числе в Linux.

Характерными особенностями OpenGL, которые обеспечили распространение и развитие этого графического стандарта, являются:

  • Стабильность. Дополнения и изменения в стандарте реализуются таким образом, чтобы сохранить совместимость с разработанным ранее программным обеспечением.

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

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

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



  1. Основы
    OpenGL

    1. Основные возможности

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

  • Функции описания примитивов определяют объекты нижнего уровня иерархии (примитивы), которые способна отображать графическая подсистема. В OpenGL в качестве примитивов выступают точки, линии, многоугольники и т.д.

  • Функции описания источников света служат для описания положения и параметров источников света, расположенных в трехмерной сцене.

  • Функции задания атрибутов. С помощью задания атрибутов программист определяет, как будут выглядеть на экране отображаемые объекты. Другими словами, если с помощью примитивов определяется, что появится на экране, то атрибуты определяют способ вывода на экран. В качестве атрибутов OpenGL позволяет задавать цвет, характеристики материала, текстуры, параметры освещения.

  • Функции визуализации позволяет задать положение наблюдателя в виртуальном пространстве, параметры объектива камеры. Зная эти параметры, система сможет не только правильно построить изображение, но и отсечь объекты, оказавшиеся вне поля зрения.

  • Набор функций геометрических преобразований позволяют программисту выполнять различные преобразования объектов – поворот, перенос, масштабирование.

При этом OpenGL может выполнять дополнительные операции, такие как использование сплайнов для построения линий и поверхностей, удаление невидимых фрагментов изображений, работа с изображениями на уровне пикселей и т.д.

    1. Интерфейс OpenGL

OpenGL состоит из набора библиотек. Все базовые функции хранятся в основной библиотеке, для обозначения которой в дальнейшем мы будем использовать аббревиатуру GL. Помимо основной, OpenGL включает в себя несколько дополнительных библиотек.

Первая из них – библиотека утилитGL(GLUGL Utility). Все функции этой библиотеки определены через базовые функции GL. В состав GLU вошла реализация более сложных функций, таких как набор популярных геометрических примитивов (куб, шар, цилиндр, диск), функции построения сплайнов, реализация дополнительных операций над матрицами и т.п.



Рис. 1 Организация библиотеки OpenGL




OpenGL не включает в себя никаких специальных команд для работы с окнами или ввода информации от пользователя. Поэтому были созданы специальные переносимые библиотеки для обеспечения часто используемых функций взаимодействия с пользователем и для отображения информации с помощью оконной подсистемы. Наиболее популярной является библиотека GLUT (GL Utility Toolkit). Формально GLUT не входит в OpenGL, но de facto включается почти во все его дистрибутивы и имеет реализации для различных платформ. GLUT предоставляет только минимально необходимый набор функций для создания OpenGL-приложения. Функционально аналогичная библиотека GLX менее популярна. В дальнейшем в этом пособии в качестве основной будет рассматриваться GLUT.

Кроме того, функции, специфичные для конкретной оконной подсистемы, обычно входят в ее прикладной программный интерфейс. Так, функции, поддерживающие выполнение OpenGL, есть в составе Win32 API и X Window. На рисунке схематически представлена организация системы библиотек в версии, работающей под управлением системы Windows. Аналогичная организация используется и в других версиях OpenGL.

    1. Архитектура OpenGL

Функции OpenGL реализованы в модели клиент-сервер. Приложение выступает в роли клиента – оно вырабатывает команды, а сервер OpenGL интерпретирует и выполняет их. Сам сервер может находиться как на том же компьютере, на котором находится клиент (например, в виде динамически загружаемой библиотеки – DLL), так и на другом (при этом может быть использован специальный протокол передачи данных между машинами).

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

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

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

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

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



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




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

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

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

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

#include

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

В отличие от стандартных библиотек, пакет GLUT нужно инсталлировать и подключать отдельно. Подробная информация о настройке сред программирования для работы с OpenGL дана в Приложении С.

Все команды (процедуры и функции) библиотеки 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]
(type1 arg1,…,typeN argN)

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

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

Command_name имя команды (процедуры или функции)

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

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

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

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

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

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

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

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

Все, что делает эта программа – рисует в центре окна красный квадрат. Тем не менее, даже на этом простом примере можно понять принципы программирования с помощью 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, 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, X Window и т.д.), которые как правило предоставляют более широкие возможности.

Более подробно работа с библиотекой 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();

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

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

Контрольные вопросы:

  1. В чем, по вашему мнению, заключается необходимость создания стандартной графической библиотеки?

  2. Кратко опишите архитектуру библиотек OpenGL и организацию конвейера.

  3. В чем заключаются функции библиотек, подобных GLUT или GLX? Почему они формально не входят в OpenGL?

  4. Назовите категории команд (функций) библиотеки.

  5. Почему организацию OpenGL часто сравнивают с конечным автоматом?

  6. Зачем нужны различные варианты команд OpenGL, отличающиеся только типами параметров?

  7. Что можно сказать о количестве и типе параметров команды glColor4ub()? glVertex3fv()?



  1. Рисование геометрических объектов

    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)

КомандаglClearColor устанавливает цвет, которым будет заполнен буфер кадра. Первые три параметра команды задают R,G и B компоненты цвета и должны принадлежать отрезку [0,1]. Четвертый параметр задает так называемую альфа компоненту (см. п. Смешивание изображений. Прозрачность). Как правило, он равен 1. По умолчанию цвет – черный (0,0,0,1).

Команда glClear очищает буферы, а параметр buf определяет комбинацию констант, соответствующую буферам, которые нужно очистить (см. главу 6). Типичная программа вызывает команду

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

для очистки буферов цвета и глубины.

Установка положения наблюдателя и преобразования трехмерных объектов (поворот, сдвиг и т.д.) контролируются с помощью задания матриц преобразования. Преобразования объектов и настройка положения виртуальной камеры описаны в главе 3.

Сейчас сосредоточимся на том, как передать в OpenGL описания объектов, находящихся в сцене. Каждый объект является набором примитивов OpenGL.

    1. Вершины и примитивы

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

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

      1. Положение вершины в пространстве



Скачать документ

Похожие документы:

  1. Предисловие содержание

    Контрольные вопросы
    ... 2002 УДК 681.3 Предисловие СодержаниеВведение 7 Глава 1. ОсновыOpenGL 9 1.1. Основныевозможности 9 1.2. Интерфейс OpenGL 9 1.3. Архитектура OpenGL 11 1.4. Синтаксис команд 13 ...
  2. МАТЕМАТИКИ И КИБЕРНЕТИКИ ЛАБОРАТОРИЯ КОМПЬЮТЕРНОЙ ГРАФИКИ И МУЛЬТИМЕДИА

    Методическое пособие
    ... им. М.В. Ломоносова. Содержание Предисловие 7 Введение 9 Глава 1 ОсновыOpenGL 11 1.1. Основныевозможности 11 1.2. Интерфейс OpenGL 12 1.3. Архитектура OpenGL 13 1.4. Синтаксис ...
  3. Основные главы

    Документ
    ... ОсновныеглавыВведение ... микропрограммирование, предусматривающее возможность легкой загрузки ... X Cosortium, в основе которого находится лаборатория ... в стандартный файл вывода первых нескольких строк; taib ... доступ в сети Com­puServe; средства построения ...
  4. Основные темы ­­­­­

    Изложение
    ... Приводится краткое введение в основы ОС UNIX ... основной памяти. Существует возможность выполнения ... систему, во главе находится корневой каталог ... позволяет определить внутреннее содержание файла. tee_[ф 1 ... поддержка стандарта OpenGL; поддержка Java ...
  5. Основы алгоритмизации и программирования в традиционных и интеллектуальных компьютерах

    Пояснительная записка
    ... взаимодействий. СОДЕРЖАНИЕ ДИСЦИПЛИНЫ ВведениеОсновные понятия, ... «Введение в специальность», «Математические основы ... возможности и формализованность, динамичность и возможности пополнения ... трехмерной графикой OpenGL и Direct ... М.: Наука. Глав. ред. физ ...

Другие похожие документы..