3 С. А. Васильев opengl компьютерная графика
Скачать 491.09 Kb.
|
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 Определяет точки. Каждая вер- шина задает координаты неко- торой точки. |