Планета знаний
Скачать 1.68 Mb.
|
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИМЕНИ М.В. ЛОМОНОСОВА ФАКУЛЬТЕТ ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ ЛАБОРАТОРИЯ КОМПЬЮТЕРНОЙ ГРАФИКИ И МУЛЬТИМЕДИА Ю.М. Баяковский, А.В. Игнатенко НАЧАЛЬНЫЙ КУРС OPENGL ПЛАНЕТА ЗНАНИЙ Москва 2007 УДК 681.3.07 ББК 32.973.26-018.2 Б34 Баяковский Ю.М., Игнатенко А.В. Начальный курс OpenGL. М.: ЅПланета Знаний, 2007. 221c. ISBN 978-5-903242-02-3 Настоящая книга представляет собой практическое руководство по ра- боте с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса ѕКомпьютерная графикаї на факультете ВМиК МГУ им. М.В. Ломоносова. Книга включает в себя описание базовых возможно- стей OpenGL и приемы работы с библиотекой, вопросы оптимизации при- ложений и использования OpenGL в различных средах программирования. Книга снабжена вопросами и практическими заданиями. Руководство рассчитано на читателей, знакомых с языками программи- рования С/C++ и имеющих представление о базовых алгоритмах компью- терной графики. Рекомендуется студентам математических и прикладных специальностей, аспирантам, научным сотрудникам и всем желающим изу- чить OpenGL в сжатые сроки. Издание подготовлено в рамках образовательной программы ѕФорми- рование системы инновационного образования в МГУї. Рецензенты: Шикин Е.В., профессор, доктор физ.-мат. наук, ф-т ВМиК МГУ Крылов А.С., кандидат физ.-мат. наук, ф-т ВМиК МГУ ISBN 978-5-903242-02-3 © Баяковский Ю.М., Игнатенко А.В. © ООО ЅПланета Знаний, 2007 Оглавление Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . 7 Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 I Основы OpenGL 15 1. Графический процесс и OpenGL 17 1.1. Графический процесс . . . . . . . . . . . . . . . . . 17 1.2. Геометрические модели . . . . . . . . . . . . . . . . 19 1.3. Анимация . . . . . . . . . . . . . . . . . . . . . . . . 20 1.4. Материалы . . . . . . . . . . . . . . . . . . . . . . . 21 1.5. Освещение . . . . . . . . . . . . . . . . . . . . . . . 22 1.6. Виртуальная камера . . . . . . . . . . . . . . . . . 22 1.7. Алгоритм экранизации . . . . . . . . . . . . . . . . 23 2. Введение в OpenGL 25 2.1. Основные возможности . . . . . . . . . . . . . . . . 25 2.2. Интерфейс OpenGL . . . . . . . . . . . . . . . . . . 26 2.3. Архитектура OpenGL . . . . . . . . . . . . . . . . . 28 2.4. Синтаксис команд . . . . . . . . . . . . . . . . . . . 30 2.5. Пример приложения . . . . . . . . . . . . . . . . . 31 2.6. Контрольные вопросы . . . . . . . . . . . . . . . . 36 3 4 Оглавление 3. Рисование геометрических объектов 39 3.1. Процесс обновления изображения . . . . . . . . . . 39 3.2. Вершины и примитивы . . . . . . . . . . . . . . . . 41 3.3. Операторные скобки glBegin / glEnd . . . . . . . . 43 3.4. Дисплейные списки . . . . . . . . . . . . . . . . . . 47 3.5. Массивы вершин . . . . . . . . . . . . . . . . . . . . 49 3.6. Контрольные вопросы . . . . . . . . . . . . . . . . 51 4. Преобразования объектов 55 4.1. Работа с матрицами . . . . . . . . . . . . . . . . . . 56 4.2. Модельно-видовые преобразования . . . . . . . . . 58 4.3. Проекции . . . . . . . . . . . . . . . . . . . . . . . . 60 4.4. Область вывода . . . . . . . . . . . . . . . . . . . . 63 4.5. Контрольные вопросы . . . . . . . . . . . . . . . . 64 5. Материалы и освещение 65 5.1. Модель освещения . . . . . . . . . . . . . . . . . . . 65 5.2. Спецификация материалов . . . . . . . . . . . . . . 67 5.3. Описание источников света . . . . . . . . . . . . . 69 5.4. Создание эффекта тумана . . . . . . . . . . . . . . 73 5.5. Контрольные вопросы . . . . . . . . . . . . . . . . 74 6. Текстурирование 77 6.1. Подготовка текстуры . . . . . . . . . . . . . . . . . 77 6.2. Наложение текстуры на объекты . . . . . . . . . . 81 6.3. Текстурные координаты . . . . . . . . . . . . . . . 84 6.4. Контрольные вопросы . . . . . . . . . . . . . . . . 87 7. Операции с пикселями 89 7.1. Смешивание изображений и прозрачность . . . . . 90 7.2. Буфер-накопитель . . . . . . . . . . . . . . . . . . . 93 7.3. Буфер маски . . . . . . . . . . . . . . . . . . . . . . 94 7.4. Управление растеризацией . . . . . . . . . . . . . . 96 7.5. Контрольные вопросы . . . . . . . . . . . . . . . . 98 Оглавление 5 II Приемы работы с OpenGL 99 8. Графические алгоритмы на основе OpenGL 101 8.1. Устранение ступенчатости . . . . . . . . . . . . . . 101 8.2. Построение теней . . . . . . . . . . . . . . . . . . . 103 8.3. Зеркальные отражения . . . . . . . . . . . . . . . . 109 8.4. Контрольные вопросы . . . . . . . . . . . . . . . . 113 9. Оптимизация программ 115 9.1. Организация приложения . . . . . . . . . . . . . . 115 9.2. Оптимизация вызовов OpenGL . . . . . . . . . . . 120 9.3. Контрольные вопросы . . . . . . . . . . . . . . . . 128 III Создание приложений с OpenGL 131 10.OpenGL-приложения с помощью GLUT 133 10.1. Структура GLUT-приложения . . . . . . . . . . . . 133 10.2. GLUT в среде Microsoft Visual C++ 6.0 . . . . . . 137 10.3. GLUT в среде Microsoft Visual C++ 2005 . . . . . 139 10.4. GLUT в среде Borland C++ Builder 6 . . . . . . . 140 10.5. GLUT в среде Borland C++ Builder 2006 . . . . . . 141 11.Использование OpenGL в MFC и VCL 145 11.1. Контекст устройства . . . . . . . . . . . . . . . . . 146 11.2. Установка формата пикселей . . . . . . . . . . . . 147 11.3. Контекст рисования (render context) . . . . . . . . 148 11.4. Класс GLRC . . . . . . . . . . . . . . . . . . . . . . 149 11.5. Использование OpenGL c MFC . . . . . . . . . . . 150 11.6. Использование OpenGL c VCL . . . . . . . . . . . . 153 12.OpenGL в .NET 157 12.1. GLUT в среде Microsoft Visual C# 2005 . . . . . . 157 12.2. Использование OpenGL в WindowsForms . . . . . . 160 6 Оглавление IV Приложения 163 А. Примитивы библиотек GLU и GLUT 165 Б. Демонстрационные программы 169 Б.1. Пример 1: Простое GLUT-приложение . . . . . . . 169 Б.2. Пример 2: Модель освещения OpenGL . . . . . . . 173 Б.3. Загрузка BMP файла . . . . . . . . . . . . . . . . . 178 Б.4. Пример 3: Текстурирование и анимация . . . . . . 186 Б.5. Класс для работы с OpenGL в Win32 . . . . . . . . 195 В. Примеры практических заданий 201 В.1. Cornell Box . . . . . . . . . . . . . . . . . . . . . . . 201 В.2. Виртуальные часы . . . . . . . . . . . . . . . . . . . 204 В.3. Интерактивный ландшафт . . . . . . . . . . . . . . 206 Литература 215 Предметный указатель 217 Предисловие Компьютерная (машинная) графика очень молодая дисци- плина. Появление машинной графики как научно-исследователь- ского направления обычно связывают с именем Айвена Сазер- ленда (Ivan Sutherland), который в 1963 г. опубликовал статью с результатами своей диссертационной работы. В 1967 г. была образована профессиональная группа ACM SIGGRAPH. В ран- ний период развития машинной графики ассоциация SIGGRAPH развивалась как научно-техническая организация. В 1983 г. был сформирован Комитет SIGGRAPH по образованию для совер- шенствования обучения машинной графике и использования ее в учебном процессе. Мы стали свидетелями драматических изменений, которые произошли в компьютерной графике в 1990-е годы. Если в кон- це 80-х графические рабочие станции стоили безумно дорого и работать с ними могли только в очень богатых организациях (как правило из ВПК), то в конце 1990-х графические станции с вполне удовлетворительными возможностями за 1000 USD ста- ли доступны университетам и даже отдельным студентам. Если в 1980-е использовалась преимущественно векторная графика, то в конце 1990-х растровая полноцветная графика почти пол- ностью вытеснила векторную. Трехмерная графика стала столь же распространенной, как двухмерная, поскольку появились и быстро совершенствуются видеоплаты с графическими ускори- 7 8 Оглавление телями и z-буфером. Параллельно с изменениями графической аппаратуры про- исходили глубокие метаморфозы в программном обеспечении. Вслед за широким распространением в 1970-е годы графических библиотек (в основном векторных, в большинстве своем фор- транных) в 1980-е годы потребовалось несколько этапов стандар- тизации графического обеспечения (Core System, PHIGS, GKS), чтобы к середине 1990-х прийти к Открытой Графической Биб- лиотеке (OpenGL). В настоящее время многие функции этой биб- лиотеки реализованы аппаратно. Все эти процессы не могли не сказаться на преподавании компьютерной графики в университетах. Однако, даже в США до конца 1970-х годов машинная графика оставалась необыч- ным предметом среди университетских курсов. В учебных пла- нах ACM 1978 г. машинная графика отсутствовала. В 1980-е го- ды и в первой половине 1990-х целью курса было изучение и про- граммирование базовых алгоритмов графики (рисование прямой и кривой, клиппирование, штриховка или растеризация много- угольника, однородные координаты и аффинные преобразова- ния, видовые преобразования) [1, 2]. Теперь, при наличии интер- фейса прикладного программирования (API) высокого уровня, когда элементарные функции имеются в библиотеке OpenGL и зачастую реализуются аппаратно, пришлось пересмотреть кон- цепцию курса. В самом деле, зачем учиться умножать столби- ком, если у каждого в руках калькулятор. Появилась возмож- ность включить в курс более сложные и более современные раз- делы компьютерной графики, такие как текстурирование, ани- мация. Именно в соответствии с этой общемировой тенденцией эволюционировал курс компьютерной графики на факультете ВМиК МГУ (с 1999 г. интернет-версию курса можно найти на сайте http://courses.graphicon.ru). Следуя принципу "учись, делая"(learning-by-doing), мы, кро- ме традиционных лекций, включаем в курс выполнение 5-6 неболь- Оглавление 9 ших проектов, каждый продолжительностью две недели. (При- меры таких заданий вы найдете в этой книге.) Настоящая книга призвана помочь студентам в выполнении этих проектов. В от- личие от других справочных публикаций по OpenGL, в книге говориться не только о том, что имеется в библиотеке, но и о том, как этими средствами эффективно пользоваться. Напри- мер, как визуализировать зеркальные объекты, как построить тени. Моделируя реальную рабочую среду, мы учим студентов са- мостоятельной работе. В этих условиях пособие по использова- нию открытой графической библиотеки играет важную роль. Авторы благодарны Е. Костиковой и К. Каштановой за по- мощь в подготовке текста и иллюстраций. Ю.М. Баяковский Апрель 2007 года Введение Все, что мы видим на экране компьютерного монитора, яв- ляется результатом работы алгоритмов синтеза изображений. Эти алгоритмы решают такие задачи, как визуализация тек- ста с использованием заданного набор шрифтов, отображение указателя курсора, рисование вспомогательных элементов гра- фического интерфейса, визуализацию изображений. Кроме это- го, алгоритмы синтеза решают задачи визуализации трехмерных данных, например, с целью создания интерактивной фотореали- стичной анимации, либо для наглядного представления резуль- татов каких-либо вычислений. Для облегчения выполнения программистами таких задач еще в 80-х годах 20-го века стали появляться программные ин- струментарии (библиотеки), содержащие в себе наборы базо- вых алгоритмов (таких, как визуализация простых геометриче- ских объектов), что позволило перейти на более высокий уро- вень абстракции при решении прикладных задач. В настоящее время программирование графических алгоритмов немыслимо без использования специальных программных инструментариев, также называемых прикладными программными интерфейсами (API Application Programming Interface). OpenGL является одним из самых популярных прикладных программных интерфейсов для разработки приложений в обла- сти двухмерной и трехмерной графики. 11 12 Оглавление Стандарт OpenGL (Open Graphics Library открытая гра- фическая библиотека) был разработан и утвержден в 1992 году ведущими фирмами в области разработки программного обес- печения как эффективный аппаратно-независимый интерфейс, пригодный для реализации на различных платформах. Осно- вой стандарта стала библиотека IRIS GL, разработанная фирмой Silicon Graphics Inc. Библиотека насчитывает около 120 различных команд, кото- рые программист использует для задания объектов и операций, необходимых для написания интерактивных графических при- ложений. На сегодняшний день графическая система OpenGL под- держивается большинством производителей аппаратных и про- граммных платформ. Эта система доступна тем, кто работает в среде Windows, пользователям компьютеров Apple. Свобод- но распространяемые коды системы Mesa (пакет API на базе OpenGL) можно компилировать в большинстве операционных систем, в том числе в Linux. Характерными особенностями OpenGL, которые обеспечили распространение и развитие этого графического стандарта, яв- ляются: € Стабильность. Дополнения и изменения в стандарте реа- лизуются таким образом, чтобы сохранить совместимость с разработанным ранее программным обеспечением. € Надежность и переносимость. Приложения, использую- щие OpenGL, гарантируют одинаковый визуальный ре- зультат вне зависимости от типа используемой операци- онной системы и организации отображения информации. Кроме того, эти приложения могут выполняться как на персональных компьютерах, так и на рабочих станциях и суперкомпьютерах. Оглавление 13 € Легкость применения. Стандарт OpenGL имеет продуман- ную структуру и интуитивно понятный интерфейс, что позволяет с меньшими затратами создавать эффективные приложения, содержащие меньше строк кода, чем с ис- пользованием других графических библиотек. Необходи- мые функции для обеспечения совместимости с различ- ным оборудованием реализованы на уровне библиотеки и значительно упрощают разработку приложений. Наличие хорошего базового пакета для работы с трехмерны- ми приложениями упрощает понимание студентами ключевых тем курса компьютерной графики моделирование трехмерных объектов, закрашивание, текстурирование, анимацию и т.д. Ши- рокие функциональные возможности OpenGL служат хорошим фундаментом для изложения теоретических и практических ас- пектов предмета. Книга состоит из трех частей и двух приложений. Первая часть посвящена непосредственно описанию работы с библиоте- кой, основным командам и переменным. Во второй части рас- сматриваются принципы реализации более сложных алгоритмов компьютерной графики с помощью средств OpenGL. В третьей части приводится описание настройки работы с OpenGL в раз- личных интегрированных средах программирования и создание приложений, применяющих OpenGL для синтеза изображений. В приложениях можно найти демонстрационные программы на OpenGL и примеры практических заданий для самоконтроля. В пособии рассматривается стандарт OpenGL 1.2. Часть I Основы OpenGL 15 Глава 1. Графический процесс и OpenGL Прежде чем перейти к описанию функций OpenGL, необхо- димо понять ее место в процессе формирования изображения на экране, определить область, задачи которой можно решать с по- мощью библиотеки. 1.1. Графический процесс Традиционной задачей компьютерной графики является син- тез изображений объектов реального мира (как существующих, так и воображаемых). Для того, чтобы сделать такой синтез воз- можным, на входе алгоритма необходимы следующие данные: Геометрические модели задают форму и внутреннюю струк- туру объекта, обычно в трехмерном евклидовом простран- стве. Примеры простых моделей: € сфера, заданная с помощью положения центра и ра- диуса; 17 18 Глава 1. Графический процесс и OPENGL € куб, заданный через положение центра и длины ребра. Анимация служит для задания модели движения, изменения формы или материала объекта с течением времени. На- пример, продольное перемещение объекта вдоль оси x со скоростью s м/c может быть задано с помощью формулы: x(t) = st Материалы и текстуры определяют, как поверхность объек- та взаимодействует со светом. Материалы необходимы для получения изображения объекта, с их помощью вычисля- ется количество отраженного света, попадающего в ѕглазї виртуального наблюдателя. Простейшая модель материа- ла цвет объекта. Освещение задает расположение и характеристики источников света, что в совокупности с материалом позволяет высчи- тать цвет каждой точки объекта, изображение которого требуется построить. Пример модели освещения: солнце, задаваемое направлением и мощностью излучения. Виртуальная камера определяет, как трехмерные данные бу- дут отображаться (проецироваться) на двухмерное изобра- жение. Заметим, что для задач, не требующих реалистичности по- лучаемого изображения (например, научная визуализация), ма- териалы могут сводиться к простейшим формам, например, к разным цветам объектов, а освещение отсутствовать. Далее в дело вступает алгоритм синтеза изображений, в опи- сываемом частном случае называемый процессом экранизации (rendering). Имея на входе набор моделей, алгоритм должен по- строить соответствующее изображение на экране монитора. Описанная схема графической обработки от получения гео- метрической модели объекта до синтеза изображения на экране называется графическим процессом. 1.2. Геометрические модели 19 Остановимся более подробно на том, какую помощь OpenGL оказывает в реализации графического процесса. Рис. 1.1. Графический процесс и место OpenGL в нем. 1.2. Геометрические модели В компьютерной графике используется большое количество разнообразных моделей для описания формы. Причиной этого является очевидная невозможность полностью оцифровать ре- альный объект. Следовательно, необходимо выбирать те особен- ности объекта, которые важны для конкретной задачи и задан- ного класса объектов. В частности, модели можно поделить на объемные и граничные. Объемные модели позволяют описать внутренность объекта, а граничные геометрические свойства поверхности. Пример объемной модели показан на рисунке 1.2. В настоящее время наибольшую популярность завоевали гра- ничные модели, получаемые с помощью локальной кусочно- линейной аппроксимации поверхности. Такая модель представ- ляет собой набор связанных через общие вершины многоугольни- ков (полигонов), поэтому эти модели еще называет полигональ- 20 Глава 1. Графический процесс и OPENGL Рис. 1.2. Объемная (воксельная) модель тора ными. Причина популярности полигональных моделей кроется в их чрезвычайной гибкости и простоте, что позволило поддер- жать операции с такими моделями в графической аппаратуре. Пример граничной модели приведен на рисунке 1.3. Основным типом геометрических моделей, поддерживаемым OpenGL, являются как раз граничные полигональные модели. Отметим, что при этом библиотека не содержит каких-либо средств поддержки хранения данных на внешних носителях. Также в библиотеке нет средств для обработки и редактиро- вания моделей единственной задачей OpenGL является реали- зация алгоритмов экранизации трехмерных моделей. Более подробно работа с моделями описана в главе 3. 1.3. Анимация Анимация в настоящее время в основном задается вручную (в пакетах компьютерного моделирования), либо с помощью устройств сканирования движения (motion capture), позволяю- щих оцифровать перемещение объектов (например человека) или их частей (движения рук, ног, туловища). OpenGL содержит аппарат линейных преобразований, кото- рый используется в том числе для задания простой анимации 1.4. Материалы 21 Рис. 1.3. Граничная полигональная модель (поворот, перенос, масштабирование). Более сложные техноло- гии моделирования изменения формы и положения объектов (на- пример, на основе кривых) могут быть реализованы ѕповерхї библиотеки. 1.4. Материалы Основными критериями выбора той или иной модели мате- риала для поверхности объекта являются требования по реали- стичности получаемого изображения и скорости работы алгорит- ма экранизации. Модель освещения применяется для каждого пикселя получаемого изображения, поэтому для задач, требую- щих интерактивного взаимодействия программы с пользовате- лем, обычно выбираются простые модели. OpenGL изначально разрабатывалась как библиотека для программирования интерактивных графических приложений, в 22 Глава 1. Графический процесс и OPENGL ней встроена одна из самых простых моделей материала мо- дель Фонга. Также OpenGL поддерживает наложение текстур. В совокупности это позволяет добиваться достаточно реалистич- ной передачи свойств ѕпростыхї материалов типа пластика, де- рева и т.п. Подробно вопрос программирования материалов в OpenGL рассматривается в главе 5. 1.5. Освещение Модель освещения неотделима от модели материала, поэто- му принципы ее выбора определяются теми же требованиями. В реальном мире мы сталкиваемся с крайне сложными для мо- делирования условиями освещения протяженными источника- ми света (небо, люминесцентные лампы), вторичным освещением (освещением от отражающих поверхностей) и т.п. Стандарт OpenGL поддерживает точечные и параллельные источники света, цвет (мощность) которых задается в цвето- вой системе RGB (Red-Green-Blue). Не поддерживаются протя- женные источники, спектральное задание мощности источников, вторичное освещение. Однако существуют алгоритмические при- емы, позволяющие моделировать и эти эффекты с помощью воз- можностей OpenGL. Кроме этого, всегда возможно использовать качественные алгоритмы для просчета освещения и передавать OpenGL уже вычисленные цвета точек, что позволяет задейство- вать аппаратные возможности для обработки геометрии. 1.6. Виртуальная камера Параметры виртуальной камеры определяют способ отобра- жения трехмерных объектов в их двухмерное изображение. Су- ществует достаточно большое количество разнообразных моде- лей камер, различающиеся свойствами проекции и учетом ха- 1.7. Алгоритм экранизации 23 рактеристик реальных оптических систем (фотокамер, челове- ческого глаза). В OpenGL поддерживается достаточно широкий класс мо- делей камер, описываемый линейным преобразованием в одно- родных координатах [15]. Этот класс ограничен моделированием камер с бесконечно малым размером диафрагмы (нет возможно- сти передачи глубины резкости) и линейными характеристиками проекции (нет возможности моделирования нелинейных искаже- ний). 1.7. Алгоритм экранизации За время развития компьютерной графики было создано мно- жество алгоритмов экранизации, обладающих различными ха- рактеристиками по степени реалистичности изображения и ско- рости работы. В настоящее время основными являются два во многом противоположных направления трассировка лучей и растеризация. Алгоритмы трассировки лучей основаны на прослеживании (трассировке) распространения световой энергии от источников света до попадания на сетчатку глаза виртуального наблюдателя (результирующее изображение). Трассировка лучей и смежные алгоритмы в основном используются для получения фотореали- стичных изображений. В силу алгоритмической сложности на данный момент эти алгоритмы не получили распространения в задачах интерактивного синтеза изображений, где в основном используются подходы на основе растеризации. Алгоритмы растеризации строят изображение с помощью преобразования геометрической модели таким способом, чтобы имитировать параметры используемой модели камеры. Т.е. для каждой точки (x, y, z) модели выполняется преобразование T (обычно линейное), такое, что (x s , y s ) = T (x, y, z) , где (x s , y s ) координаты спроецированной точки на экране. В случае поли- 24 Глава 1. Графический процесс и OPENGL гональной модели преобразование выполняется для каждой вер- шины полигона, после чего получаемая проекция переводится в растр на результирующей картинке. Освещение вычисляет- ся отдельно от преобразований, обычно с помощью достаточно простой модели. OpenGL основана на экранизации с помощью растеризации. Ориентированность на полигональные модели вкупе с использо- ванием линейной модели камеры позволяет описать весь алго- ритм экранизации в терминах алгебры матриц и векторов 4-го порядка в евклидовом пространстве. В свою очередь, это поз- волило перенести большую часть операций алгоритма на спе- циализированные графические процессоры (в настоящее время ставшие стандартом). Таким образом, алгоритм экранизации OpenGL ориентиро- ван на интерактивные приложения с достаточно ограниченной поддержкой моделей материалов и освещения. Однако, в силу простоты и гибкости стандарта библиотеки, с помощью ее ба- зовых функций возможно реализовать широкий спектр различ- ных моделей вплоть до физически-точных, оставаясь в рамках требований к интерактивным приложениям (во многом за счет широкой аппаратной поддержки OpenGL). Глава 2. Введение в OpenGL 2.1. Основные возможности Описывать возможности OpenGL мы будем через функции его библиотеки. Все функции можно разделить на пять катего- рий: € Функции описания примитивов определяют объекты ниж- него уровня иерархии (примитивы), которые способна отоб- ражать графическая подсистема. В OpenGL в качестве примитивов выступают точки, линии, многоугольники и т.д. € Функции описания источников света служат для описа- ния положения и параметров источников света, располо- женных в трехмерной сцене. € Функции задания атрибутов. С помощью задания атри- бутов программист определяет, как будут выглядеть на экране отображаемые объекты. Другими словами, если с помощью примитивов определяется, что появится на экране, то атрибуты определяют способ вывода на экран. 25 26 Глава 2. Введение в OPENGL В качестве атрибутов OpenGL позволяет задавать цвет, ха- рактеристики материала, текстуры, параметры освещения. € Функции визуализации позволяют задать положение на- блюдателя в виртуальном пространстве, параметры объек- тива камеры. Зная эти параметры, система сможет не толь- ко правильно построить изображение, но и отсечь объекты, оказавшиеся вне поля зрения. € Набор функций геометрических преобразований позволяет программисту выполнять различные преобразования объ- ектов поворот, перенос, масштабирование. При этом OpenGL может выполнять дополнительные опера- ции, такие как использование сплайнов для построения линий и поверхностей, удаление невидимых фрагментов изображений, работа с изображениями на уровне пикселей и т.д. 2.2. Интерфейс OpenGL OpenGL состоит из набора библиотек. Все базовые функ- ции хранятся в основной библиотеке, для обозначения которой в дальнейшем мы будем использовать аббревиатуру GL. Помимо основной, OpenGL включает в себя несколько дополнительных библиотек. Первая из них библиотека утилит GL(GLU GL Utility). Все функции этой библиотеки определены через базовые функ- ции GL. В состав GLU вошла реализация более сложных функ- ций, таких как набор популярных геометрических примитивов (куб, шар, цилиндр, диск), функции построения сплайнов, реа- лизация дополнительных операций над матрицами и т.п. OpenGL не включает в себя никаких специальных команд для работы с окнами или ввода информации от пользователя. Поэтому были созданы специальные переносимые библиотеки 2.2. Интерфейс OPENGL 27 Рис. 2.1. Организация библиотеки OpenGL для обеспечения часто используемых функций взаимодействия с пользователем и для отображения информации с помощью окон- ной подсистемы. Наиболее популярной является библиотека GLUT (GL Utility Toolkit). Формально GLUT не входит в OpenGL, но de facto включается почти во все его дистрибутивы и имеет реализа- ции для различных платформ. GLUT предоставляет только ми- нимально необходимый набор функций для создания OpenGL- приложения. Функционально аналогичная библиотека GLX ме- нее популярна. В дальнейшем в этой книге в качестве основной будет рассматриваться GLUT. Кроме того, функции, специфичные для конкретной оконной подсистемы, обычно входят в ее прикладной программный ин- терфейс. Так, функции, поддерживающие выполнение OpenGL, есть в составе Win32 API и X Window. На рисунке 2.1 схема- тически представлена организация системы библиотек в версии, работающей под управлением системы Windows. Аналогичная организация используется и в других версиях OpenGL. 28 Глава 2. Введение в OPENGL 2.3. Архитектура OpenGL Функции OpenGL реализованы в модели клиент-сервер. При- ложение выступает в роли клиента оно вырабатывает коман- ды, а сервер OpenGL интерпретирует и выполняет их. Сам сер- вер может находиться как на том же компьютере, на котором находится клиент (например, в виде динамически загружаемой библиотеки DLL), так и на другом (при этом может быть ис- пользован специальный протокол передачи данных между ма- шинами). GL обрабатывает и рисует в буфере кадра графические при- митивы с учетом некоторого числа выбранных режимов. Каж- дый примитив это точка, отрезок, многоугольник и т.д. Каж- дый режим может быть изменен независимо от других. Опреде- ление примитивов, выбор режимов и другие операции описыва- ются с помощью команд в форме вызовов функций прикладной библиотеки. Примитивы определяются набором из одной или более вер- шин (vertex). Вершина определяет точку, конец отрезка или угол многоугольника. С каждой вершиной ассоциируются некоторые данные (координаты, цвет, нормаль, текстурные координаты и т.д.), называемые атрибутами. В подавляющем большинстве слу- чаев каждая вершина обрабатывается независимо от других. С точки зрения архитектуры, графическая система OpenGL является конвейером, состоящим из нескольких последователь- ных этапов обработки графических данных. Команды OpenGL всегда обрабатываются в том порядке, в котором они поступают, хотя могут происходить задержки пе- ред тем, как проявится эффект от их выполнения. В большин- стве случаев OpenGL предоставляет непосредственный интер- фейс, т.е. определение объекта вызывает его визуализацию в бу- фере кадра. С точки зрения разработчиков, OpenGL это набор команд, 2.3. Архитектура OPENGL 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 ] ( type1 arg1 ,. . ., typeN argN ) Имя состоит из нескольких частей: 2.5. Пример приложения 31 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 GLoat (аналог oat) и так далее. Полный список типов и их описание можно посмотреть в файле gl.h; [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 l e f t , right , top , bottom ; l e f t = ( Width ? CubeSize ) / 2 ; r i g h t = l e f t + CubeSize ; bottom = ( Height ? CubeSize ) / 2 ; top = bottom + CubeSize ; gl Cle ar C o l o r ( 0 . 7 , 0 . 7 , 0 . 7 , 1 ) ; g l C l e a r (GL_COLOR_BUFFER_BIT) ; glColor3ub ( 2 5 5 , 0 , 0 ) ; glBegin (GL_QUADS) ; g l V e r t e x 2 f ( l e f t , bottom ) ; g l V e r t e x 2 f ( l e f t , top ) ; g l V e r t e x 2 f ( right , top ) ; g l V e r t e x 2 f ( right , bottom ) ; 2.5. Пример приложения 33 glEnd ( ) ; g l F i n i s h ( ) ; } // Функция вызывается при изменении размеров окна void Reshape ( GLint w, GLint h) { Width = w; Height = h ; /* устанавливаем размеры области отображения */ glViewport (0 , 0 , w, h ) ; /* ортографическая проекция */ glMatrixMode (GL_PROJECTION) ; glLo adI dentity ( ) ; glOrtho (0 , w, 0 , h , ?1.0 , 1 . 0 ) ; glMatrixMode (GL_MODELVIEW) ; glLo adI dentity ( ) ; } // Функция обрабатывает сообщения от клавиатуры void Keyboard ( unsigned char key , int x , int y ) { const char ESCAPE = ' \033 ' ; i f ( key == ESCAPE ) e x i t ( 0 ) ; } // Главный цикл приложения void main ( int argc , char * argv [ ] ) { g l u t I n i t (&argc , argv ) ; 34 Глава 2. Введение в OPENGL glutInitDisplayMode (GLUT_RGB) ; glutInitWindowSize ( Width , Height ) ; glutCreateWindow ( "Red square example" ) ; glutDisplayFunc ( Display ) ; glutReshapeFunc ( Reshape ) ; glutKeyboardFunc ( Keyboard ) ; glutMainLoop ( ) ; } Рис. 2.3. Результат работы программы 2.1. Несмотря на малый размер, это полностью завершенная про- грамма, которая должна компилироваться и работать на любой системе, поддерживающей OpenGL и GLUT. Библиотека GLUT поддерживает взаимодействие с пользова- телем с помощью так называемых функций c обратным вызовом (callback function). Если пользователь подвинул мышь, нажал на кнопку клавиатуры или изменил размеры окна, происходит со- бытие и вызывается соответствующая функция пользователя обработчик событий (функция с обратным вызовом). Рассмотрим более подробно функцию main данного примера. 2.5. Пример приложения 35 Она состоит из трех частей: инициализации окна, в котором бу- дет рисовать 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 описана в главе 10. 36 Глава 2. Введение в OPENGL Все вызовы команд OpenGL происходят в обработчиках со- бытий. Более подробно они будут рассмотрены в следующих гла- вах. Сейчас обратим внимание на функцию Display , в которой сосредоточен код, непосредственно отвечающий за рисование на экране. Следующая последовательность команд из функции Display() : g l C l e a r C o l o r (0 , 0 , 0 , 1 ) ; g l C l e a r (GL_COLOR_BUFFER_BIT) ; glColor3ub ( 2 5 5 , 0 , 0 ) ; glBegin (GL_QUADS) ; g l V e r t e x 2 f ( l e f t , bottom ) ; g l V e r t e x 2 f ( l e f t , top ) ; g l V e r t e x 2 f ( right , top ) ; g l V e r t e x 2 f ( right , bottom ) ; glEnd ( ) ; очищает окно и выводит на экран квадрат, задавая координаты четырех угловых вершин и цвет. В приложении Б приведен еще один пример несложной про- граммы, при нажатии кнопку мыши рисующей на экране разно- цветные случайные прямоугольники. 2.6. Контрольные вопросы |