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

3 С. А. Васильев opengl компьютерная графика


Скачать 491.09 Kb.
Название3 С. А. Васильев opengl компьютерная графика
Дата23.03.2018
Размер491.09 Kb.
Формат файлаpdf
Имя файлаvasilev.pdf
ТипУчебное пособие
#39231
страница1 из 9
  1   2   3   4   5   6   7   8   9

3
С.А. ВАСИЛЬЕВ
OpenGL
Компьютерная графика
Издательство ТГТУ
УДК О04.92(075)
ББК Ж11я73
В191
Р е ц е н з е н т ы :
Доктор технических наук, профессор ТГТУ
А.А. Чуриков
Коммерческий директор ООО "Бит"
А.В. Крюков
Васильев, С.А.
OpenGL. Компьютерная графика : учебное пособие / C.А. Васильев. Тамбов : Изд-во Тамб. гос. техн. ун-та, 2005. 80 с.
Данное учебное пособие призвано послужить как в качестве учебника по открытой графической библиотеке, так и в качестве справочника по использованию основных команд OpenGL. Оперируя предметным указателем можно быстро найти то или иной материал по использованию графических функций, процедур и символьных констант.
Пособие призвано помочь студентам в выполнении курсовых работ и проектов, а также в их на- учно-исследовательской работе, где требуется организовать высокоэффективную визуализацию 2D
Z
X
Y
В191

4
или 3D графики.
Предназначено для студентов 3, 4 курсов дневной формы обучения по специальности 230104.
УДК О04.92(075)
ББК Ж11я73
ISBN 5-8265-0417-Х
 Васильев С.А., 2005
 Тамбовский государствен- ный технический университет
(ТГТУ), 2005
Министерство образования и науки Российской Федерации
Государственное образовательное учреждение высшего профессионального образования
"Тамбовский государственный технический университет"
OpenGL
Компьютерная графика
Утверждено Ученым совет ТГТУ в качестве учебного пособия
Тамбов
Издательство ТГТУ
2005

5
Учебное издание
ВАСИЛЬЕВ Сергей Александрович
OpenGL
Компьютерная графика
Учебное пособие
Редактор Т.М. Ф е д ч е н к о
Компьютерное макетирование И.В. Евсеевой
Подписано к печати 03.06.2005
Гарнитура Тimes New Roman. Формат 60
× 84/16. Бумага офсетная.
Печать офсетная. Объем: 4,65 усл. печ. л.; 4,62 уч.-изд. л.
Тираж 200 экз. С. 421
Издательско-полиграфический центр ТГТУ
392000, Тамбов, Советская, 106, к. 14

6
ВВЕДЕНИЕ
Стремительный рост интереса к компьютерной графике во многих сферах деятельности человека способствует развитию ее математических и алгоритмических основ. Соответственно видоизменяется и стандартизация в области компьютерной графики. Наблюдается тенденция смены общепринятых стан- дартов CORE, GKS, GKS-3D, PHIGS на стандарт открытой графической библиотеки – OpenGL (Open
Graphic Library) – являющимся базовым стандартом для большинства рабочих графических станций в мире (Sun, Silicon Graphics и т.п.).
Стандарт OpenGL был разработан и утвержден в 1992 году ведущими фирмами в области разработ- ки программного обеспечения, среди которых Digital Equipment Corporation, Evans & Sutherland, Hewlett
Packard Co., IBM Corp., Intel Cor., Intergraph Cor., Silicon Graphics Inc., Sun Microsystems и Microsoft. Ос- новой его стала библиотека IRIS GL, разработанная Silicon Graphics.
Характерные особенности OpenGL, обеспечивающие распространение и развитие этого графиче- ского стандарта.
СТАБИЛЬНОСТЬ. ВСЕ ВНОСИМЫЕ В НЕГО ДОПОЛНЕНИЯ И ИЗМЕНЕНИЯ РЕАЛИ-
ЗУЮТСЯ ПРИ СОХРАННОСТИ СОВМЕСТИМОСТИ С РАЗРАБОТАННЫМ РАНЕЕ ПРО-
ГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
НАДЕЖНОСТЬ. ПРИЛОЖЕНИЯ, ИСПОЛЬЗУЮЩИЕ OPENGL, ГАРАНТИРУЮТ ОДИ-
НАКОВЫЙ ВИЗУАЛЬНЫЙ РЕЗУЛЬТАТ ВНЕ ЗАВИСИМОСТИ ОТ ТИПА ИСПОЛЬЗУЕМОЙ
ОПЕРАЦИОННОЙ СИСТЕМЫ И ОБОРУДОВАНИЯ.
ПЕРЕНОСИМОСТЬ. ПРИЛОЖЕНИЯ МОГУТ ВЫПОЛНЯТЬСЯ КАК НА ПЕРСОНАЛЬ-
НЫХ КОМПЬЮТЕРАХ, ТАК И НА РАБОЧИХ СТАНЦИЯХ И СУПЕРКОМПЬЮТЕРАХ.
ПРОСТОТА ИСПОЛЬЗОВАНИЯ. СТАНДАРТ OPENGL ИМЕЕТ ПРОДУМАННУЮ
СТРУКТУРУ И ИНТУИТИВНО ПОНЯТНЫЙ ИНТЕРФЕЙС, ЧТО ПОЗВОЛЯЕТ С МЕНЬШИ-
МИ ЗАТРАТАМИ СОЗДАВАТЬ ЭФФЕКТИВНЫЕ ПРИЛОЖЕНИЯ, СОДЕРЖАЩИЕ МЕНЬШЕ
СТРОК КОДА, ЧЕМ С ИСПОЛЬЗОВАНИЕМ ДРУГИХ ГРАФИЧЕСКИХ БИБЛИОТЕК. НЕОБ-
ХОДИМЫЕ ФУНКЦИИ ДЛЯ ОБЕСПЕЧЕНИЯ СОВМЕСТИМОСТИ С РАЗЛИЧНЫМ ОБОРУ-
ДОВАНИЕМ РЕАЛИЗОВАНЫ НА УРОВНЕ БИБЛИОТЕКИ И ЗНАЧИТЕЛЬНО УПРОЩАЮТ
РАЗРАБОТКУ ПРИЛОЖЕНИЙ.
OpenGL – не язык программирования, а программный интерфейс приложений. Всякий раз, когда мы говорим, что программное приложение выполнено на OpenGL, то подразумеваем, что оно было на- писано на некотором языке программирования (например, C ++) и делает запросы к одной или более библиотекам OpenGL.
Основные возможности OpenGL, предоставленные разработчикам:
− геометрические примитивы (точки, линии и многоугольники);
− растровые примитивы (битовые массивы пикселей);
− работа с цветом в RGBA и индексном режимах;
− видовые, модельные и текстурные преобразования;
− удаление невидимых линий и поверхностей (z-буфер);
− работа с прозрачностью поверхности многоугольников;
− использования В-сплайнов;
− работа с текстурами;
применение освещения;
− использование смешивания цветов, устранение ступенчатости (anti-aliasing), моделирование "ту- мана" и других "атмосферных" эффектов.
Данное учебное пособие предполагается использовать как учебник по открытой библиотеке, и как справочник по использованию основных команд OpenGL. Поможет предметный указатель быстро най- ти тот или иной материал по использованию графических функций, процедур и символьных констант.
Описание многих команд OpenGL сопровождается фрагментами программных кодов на языке C++, по- казывающих их практическое использование.
Кроме этого, данное пособие призвано помочь студентам в выполнении курсовых работ и проектов, а также в их научно-исследовательской работе, где требуется организовать высокоэффективную визуа- лизацию 2D или 3D графики.

7
1
ИНТЕРФЕЙС OPENGL
Интерфейс OpenGL реализован в виде набора команд (функций и процедур), которые позволяют программисту организовывать высококачественную визуализацию 2D или 3D графику.
Все базовые функции OpenGL хранятся в основной библиотеке GL
и нескольких дополнительных, например, библиотеке утилит – GLU (GL Utility).
Функции библиотеки GLU определены через базовые функции GL. Благодаря GLU можно легко строить такие геометрических примитивы, как куб, шар, цилиндр, диск. Кроме этого, GLU предоставля- ет функции построения сплайнов, реализацию дополнительных операций над матрицами и т.п.
OpenGL не включает в себя никакие специальные команды для работы с окнами или вводом ин- формации от пользователя. Программист должен самостоятельно организовывать связь своих графиче- ских приложений с оконными подсистемами и обеспечивать взаимодействия с функциями пользовате- ля. Для облегчения подобной работы программиста были созданы специальные библиотеки для обеспе- чения часто используемых функций взаимодействия с пользователем и для отображения информации с помощью оконной подсистемы. Наиболее популярной является библиотека GLUT (GL Utility Toolkit).
Официально GLUT не входит в OpenGL, но ее легко найти в Интернете. Более того, имеются свои реа- лизации GLUT для различных операционных систем.
2
СТРУКТУРА ГРАФИЧЕСКОЙ ПРОГРАММЫ OPENGL ДЛЯ СРЕДЫ WINDOWS
ДЛЯ РАБОТЫ OPENGL В ОПЕРАЦИОННОЙ СИСТЕМЕ WINDOWS ИСПОЛЬЗУЕТСЯ
ПОНЯТИЕ КОНТЕКСТА ВОСПРОИЗВЕДЕНИЯ (RENDERING CONTEXT), КОТОРЫЙ СВЯ-
ЗЫВАЕТ OPENGL С ОКОННОЙ СИСТЕМОЙ WINDOWS.
ПРИЛОЖЕНИЕ, РАБОТАЮЩЕЕ С КОМАНДАМИ OPENGL, ДОЛЖНО СОЗДАТЬ ОДНО
ИЛИ НЕСКОЛЬКО КОНТЕКСТОВ ВОСПРОИЗВЕДЕНИЯ ДЛЯ ПОТОКА И СДЕЛАТЬ ОДНО
ИЗ НИХ ТЕКУЩИМ. ПЕРЕД СОЗДАНИЕМ КОНТЕКСТА ВОСПРОИЗВЕДЕНИЯ НЕОБХО-
ДИМО УСТАНОВИТЬ ДЛЯ НЕГО ФОРМАТ ПИКСЕЛЕЙ, КОТОРЫЙ ОПРЕДЕЛЯЕТ НЕКО-
ТОРЫЕ СВОЙСТВА ПОВЕРХНОСТИ РИСОВАНИЯ OPENGL. ТАКИМ ОБРАЗОМ, ПРО-
ГРАММЫ, ИСПОЛЬЗУЮЩИЕ OPENGL, СТРОЯТСЯ ПО СЛЕДУЮЩЕЙ СХЕМЕ.
1
СОЗДАЕМ ОКНО ПРОГРАММЫ. ЗДЕСЬ НЕОБХОДИМО ОБЯЗАТЕЛЬНО УСТАНОВИТЬ
СТИЛЬ ОКНА ФУНКЦИЕЙ CREATEWINDOW ЧЕРЕЗ ПАРАМЕТРЫ WS_CLIPCHILDREN И
WS_CLIPSIBLINGS.
2
ПОСЛЕ УСПЕШНОГО СОЗДАНИЯ ОКНА НЕОБХОДИМО ОТКРЫТЬ КОНТЕКСТ
ОТОБРАЖЕНИЯ (RENDERING CONTEXT). РЕКОМЕНДУЕТСЯ ОТКРЫВАТЬ КОНТЕКСТ
ОТОБРАЖЕНИЯ ВО ВРЕМЯ ОБРАБОТКИ СООБЩЕНИЯ WM_CREATE.
3
ДЛЯ СОЗДАНИЯ КОНТЕКСТА ОТОБРАЖЕНИЯ НЕОБХОДИМО ПРЕДВАРИТЕЛЬНО
ОТКРЫТЬ КОНТЕКСТ ОКНА (HDC), НАПРИМЕР, ФУНКЦИЕЙ GETDC.
4
ПРИ НАСТРОЙКЕ ХАРАКТЕРИСТИК КОНТЕКСТА ОТОБРАЖЕНИЯ УСТАНОВИТЬ
СООТВЕТСТВУЮЩИЕ ЗНАЧЕНИЯ ПОЛЕЙ СТРУКТУРЫ PIXELFORMATDESCRIPTOR И
ВЫЗВАТЬ ФУНКЦИЮ CHOOSEPIXELFORMAT. ЭТА ФУНКЦИЯ ВОЗВРАЩАЕТ НОМЕР
ПИКСЕЛЬНОГО ФОРМАТА, КОТОРЫЙ МОЖНО ИСПОЛЬЗОВАТЬ.
5
ВЫЗОВОМ ФУНКЦИИ SETPIXELFORMAT ЗАДАТЬ СООТВЕТСТВУЮЩИЙ ПИК-
СЕЛЬНЫЙ ФОРМАТ В КОНТЕКСТЕ HDC.
6
НА ОСНОВАНИИ КОНТЕКСТА HDC СОЗДАТЬ КОНТЕКСТ ОТОБРАЖЕНИЯ (HRC)
ВЫЗОВОМ ФУНКЦИИ WGLCREATECONTEXT. ДЛЯ ПЕРЕАДРЕСАЦИИ ТЕКУЩЕГО ВЫ-
ВОДА ГРАФИКИ OPENGL В HRC НЕОБХОДИМО ВЫЗЫВАТЬ ФУНКЦИЮ WGLMAKECUR-
RENT.
7
В ТЕКУЩИЙ КОНТЕКСТ ОТОБРАЖЕНИЯ ВЫВЕСТИ ГРАФИЧЕСКИЕ ОБЪЕКТЫ,
ИСПОЛЬЗУЯ ФУНКЦИИ ДЛЯ РАБОТЫ С ГРАФИЧЕСКИМИ ПРИМИТИВАМИ OPENGL.
ГРАФИЧЕСКИЙ ВЫВОД МОЖНО ОСУЩЕСТВЛЯТЬ ВО ВРЕМЯ ОБРАБОТКИ СООБЩЕ-
НИЯ WM_PAINT ИЛИ ДРУГИХ НЕОБХОДИМЫХ СООБЩЕНИЙ WINDOWS.
8
ПЕРЕД ЗАКРЫТИЕМ ОКНА ПРОГРАММЫ НЕОБХОДИМО ЗАКРЫТЬ ВСЕ ОТКРЫ-
ТЫЕ КОНТЕКСТЫ ОТОБРАЖЕНИЯ. ТАКЖЕ СЛЕДУЕТ ЗАКРЫТЬ ВСЕ КОНТЕКСТЫ ГРА-
ФИЧЕСКОГО УСТРОЙСТВА. ЭТО МОЖНО СДЕЛАТЬ В ХОДЕ ОБРАБОТКИ СООБЩЕНИЙ
WM_DESTROY ВЫЗОВОМ ФУНКЦИЙ RELEASEDC И WGLDELETECONTEXT.

8
3
СИНТАКСИС КОМАНД
Синтаксис полного имени команды имеет вид: rt glCom_name[1 2 3 4][b s i f d ub us ui][v] (type1 arg1,…,typeN argN)
Таким образом, имя состоит из нескольких частей:
Gl
Это имя библиотеки, в которой описана эта функция: для базовых функций OpenGL, функций из библиотек GLU, GLUT, GLAUX это gl, glu, glut, aux соответственно. rt
Определяет тип возвращаемого значения и для каждой команды указывается в явном виде.
Com_name
Имя команды, например glColor или glVer- tex.
[1 2 3 4]
Цифра, показывающая число аргументов команды.
[b s i f d ub us
ui]
Симолы, определяющие тип аргумента: символ b означает тип GLbyte (аналог char в
С\С++), символ f – тип GLfloat (аналог float), символ i – тип GLint (аналог int) и так далее.
Полный список типов и их описание можно посмотреть в файле gl.h.
[v]
Наличие этого символа показывает, что в качестве параметров функции используется указатель на массив значений.
Компоненты, представленные в квадратных скобках в некоторых названиях не используются.
Например, команда для определения вершины, имеющая вид: void glVertex3f(float arg1, float arg2, float arg3) в представленном синтаксисе записывается в виде void glVertex3[f](atype arg).
Благодаря тому, что OpenGL реализован по модели клиент сервер, то имеется возможность управ- лять процессом рисования примитивов. Для этого в OpenGL существуют две команды: void glFinish()
void glFlush()
Команда glFinish() приостанавливает выполнение программы, пока не будут завершены все вызван- ные перед ней команды OpenGL.
Команда glFlush() вызывает немедленное рисование ранее переданных команд.
4
ПРОЦЕСС РЕГЕНЕРАЦИИ ИЗОБРАЖЕНИЯ
Основной задачей программы, использующей OpenGL, является обработка трехмерной сцены и инте- рактивное отображение в буфере кадра ее проекции. Для динамической графики приложение OpenGL в бесконечном цикле должно вызывать функцию регенерации (обновления) изображения.
Обычно функция регенерации изображения состоит из следующих шагов:
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 определяет какие именно буферы нужно очи- стить. Данный параметр формируется маску для очистки комбинацией (логической функцией OR) кон-

9
стант.
Маска
Буфер для очистки
GL_COLOR_BUFFER_BIT
Буфер изображения
GL_DEPTH_BUFFER_BIT
Z-буфер
GL_ACCUM_BUFFER_BIT
Аккумулирующий бу- ер
GL_STENCIL_BUFFER_BI
T
Буфер трафарета
Например, в программах для очистки буферов цвета и глубины
(Z-буфера) вызывают команду: glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
Установка положения наблюдателя (виртуальной камеры) и преобразования трехмерных объектов
(масштабирование, поворот, и т.д.) выполняются с помощью задания соответствующих матриц преоб- разования. Подробное рассмотрение преобразований объектов и настройки положения виртуальной ка- меры будут приведены далее.
Для улучшения качества визуализации динамически изменяющихся сцен рекомендуется использо- вать двойную буферизацию, т.е. необходимо обеспечить перезапись внеэкранного буфера в основной.
Для этого предусмотрена команда BOOL SwapBuffers (HDC hDC);
Следует помнить, что после выполнения команды SwapBuffers(hDC) содержание внеэкранного бу- фера не определено.
5
ВЫВОД ГЕОМЕТРИЧЕСКИХ ПРИМИТИВОВ
Геометрические объекты в OpenGL задаются вершинами. Вершина – это точка в пространстве гра- фической сцены. Для ее определения в библиотеке OpenGL реализована специальная команда: void glVertex [2 3 4][s i f d][v](type coord)
Вызов любой команды glVertex* всегда определяется четырьмя однородными координатами: x, y, z и w. Если вызывается команда glVertex3*, то вершина задается x, y и z координатами, при этом w полага- ется равной 1. Для двумерного случая z – 0, а w – 1.
Вершины в OpenGL объединяются в графические примитивы. Это может быть фигура, такая как точка, линия, многоугольник, прямоугольник пикселей или битовый массив. Каждая вершина примити- ва имеет ассоциированные с ней данные.
Текущий цвет – который вместе с условиями освещения определяет результирующий цвет вер- шины. Цвет задается, например, командой glColor* для режима RGBA.
Текущая позиция растра – используется для определения координат растра при работе с пиксе- лями и битовыми массивами. Задается командой glRasterPoos*.
Текущая нормаль – определяет вектор нормали, ассоциированный с отдельной вершиной, и зада- ет ориентацию содержащей ее поверхности в трехмерном пространстве. Для указания нормали исполь- зуется команда glNormal*.
Текущие координаты текстуры – определяют местоположение вершины в карте текстуры. Зада- ется командой glTexCoord*.
5.1 Задание цветовых атрибутов геометрическим объектам
В OpenGL предусмотрено два режима установки цвета:
− задание индекса в палитру цветов;
− указание непосредственных значений базовых составляющих R (красный), G (зеленный), B
(синий) цвета.
В настоящее время графические приложения в основном используют покомпонентное (RGBA) за- дание цвета. Благодаря этому максимально используются возможности High Color и True Color режимов графических карт. В данных режимах в полной мере моделируется реалистическая графика (работа с

10
освещением, туманом, прозрачностью, устранение ступенчатости и т.д.).
Для установки цвета в режиме RGBA в OpenGL предусмотрены команды: void glColor[3 4][b s I f d](GLtype components) void glColor[3 4][b s I f d]v(GLtype components)
Первые три параметра команды glColor4* задают значения R, G, B составляющих цвета. Четвер- тый параметр (A) определяет "прозрачность" цвета. Независимо от типа задаваемых параметров, все они хранятся в формате с плавающей точкой и принимают значения из диапазона
[0.0, 1.0]. Значение 1.0 соответствует максимальной интенсивности соответствующего компонента. Для параметра альфа (A) 1.0 соответствует непрозрачному состоянию, а 0.0 – полному прозрачному состоя- нию цвета. При целочисленных значениях аргументов происходит внутреннее преобразование к форма- ту с плавающей точкой в диапазон [0.0, 1.0] по следующей схеме.
GLtype
Преобразование
GLbyte
(2c + 1) / (2 8

1)
GLshort
(2c + 1) / (2 16
– 1)
Glint
(2c + 1) / (2 32
– 1)
GLfloat
с
GLdouble
с
П р и м е ч а н и е. с – значение аргументов.
После того как установлен цвет, его значение распространяется на все последующие графические примитивы.
Если требуется плавный переход цветов от одной вершины при- митива к другой, то для этого в OpenGL предусмотрена команда glEnable(GL_SMOOTH). В этом случае рассчитывается плавный переход цвета между соседними вер- шинами по закону линейной интерполяции
c = t c
1
+ (1 – t) c
2
, где с
1
и с
2
– значения цвета соседних вершин, а t – коэффициент интерполяции, изме- няющийся в диапазоне [0,1].
5.2 Типовые графические примитивы
Примитивы или группа примитивов определяются внутри командных скобок glBegin/glEnd: void glBegin (GLenum mode) void glEnd ()
Параметр mode определяет тип примитива, который задается внутри и может принимать следую- щие значения.
Значение mode
Описание
GL_POINTS
Определяет точки. Каждая вер- шина задает координаты неко- торой точки.
  1   2   3   4   5   6   7   8   9


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