КГ_10глава (Компьютерная графика)

2017-07-12СтудИзба

Описание файла

Файл "КГ_10глава" внутри архива находится в папке "Компьютерная графика". Документ из архива "Компьютерная графика", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 4 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "компьютерная графика" в общих файлах.

Онлайн просмотр документа "КГ_10глава"

Текст из документа "КГ_10глава"

ГЛАВА 10

Графическая библиотека OpenGL

Библиотека OpenGL (Open Graphic Library), разработанная фирмой Silicon Graphics, стала индустриальным стандартом. Интерфейс OpenGL поддержи­вается многими операционными системами для разнообразных аппаратных платформ — от персональных компьютеров до сверхмощных суперкомпью­теров. Важным аспектом является также поддержка интерфейса OpenGL производителями аппаратных графических акселераторов. Поэтому OpenGL позволяет достаточно просто создавать быстродействующие графические программы и часто используется разработчиками компьютерных игр, напри-" мер, Quake. Библиотека OpenGL поддерживается в операционной системе Windows, начиная с Windows 95 версии OSR 2, — были добавлены соответ­ствующие модули DLL, а также включены несколько функций и структур данных в API Win32.

Интерфейс OpenGL реализован в виде набора функций, которые можно ис­пользовать в прикладных программах. Известно также расширение для OpenGL — библиотека классов Open Inventor.

Разработка графических программ OpenGL для среды Windows подобна про­граммированию графики GDI функций API, которое мы рассмотрели в гла­вах 5—8. Однако есть особенности, некоторые из которых мы изучим. Для получения более подробных сведений можно порекомендовать литературные источники— прежде всего, это документация Windows SDK [61]. В значи­тельной мере этот источник был использован в книге [25].

Быстродействие графических программ, использующих OpenGL, существен­но зависит от видеоадаптера. Аппаратная реализация всех базовых функций OpenGL — залог высокого быстродействия. В настоящее время многие ви­деоадаптеры содержат специальный графический процессор (один или не­сколько) для поддержки функции графики. Кроме того, что видеоадаптер должен аппаратно выполнять все базовые функции OpenGL (такие как пре­образования координат, расчеты освещения, наложение текстур, отсечение,

вывод полигонов), для достижения высокого быстродействия должен быть установлен специальный драйвер. Драйверы типа ICD (Installable Client Driver) обеспечивают интерфейс, способствующий эффективному использо­ванию аппаратных возможностей видеоадаптера. Другой тип драйвера— MCD — устанавливается обычно тогда, когда не все функции поддержаны аппаратно, и в этом случае они выполняются программно центральным про­цессором, что существенно медленнее.

Рассмотрим создание программ OpenGL на языке С, C++ в среде Windows. В главе 6 при рассмотрении графики GDI мы определили ключевой мо­мент — это создание контекста графического устройства (device context)., Графика OpenGL в этом плане похожа— необходимо сначала создать кон­текст, который здесь назван контекстом отображения (rendering context), и направить текущий вывод графики на него. Потом следует закрыть этот контекст, освободить память.

Будем программировать в стиле программ studEx предыдущих глав данной книги. Этот стиль заключается в непосредственном вызове функций API Windows без каких-либо посредников типа MFC (или иных подобных биб­лиотек). Во-первых, это уменьшает выполняемый код (поскольку каждому посреднику нужно платить — вот только здесь за что?), а во-вторых, позво­лит нам более детально ознакомиться с OpenGL как таковой. Дадим общую схему программы OpenGL.

1. Создание окна программы. Здесь необходимо обязательно установить стиль окна ws_clipchildren и ws_clipsiblings . Это осуществляется зада­нием значений аргументов функции createwindow.

2. После создания окна можно открывать контекст отображения. Рекомен­дуется открытие этого контекста делать во время обработки сообщения

WM_CREATE.

3. Чтобы создать контекст отображения, сначала необходимо открыть кон­текст окна (hdc), например, функцией GetDC.

4. Для выяснения характеристик контекста отображения устанавливаем со­ответствующие значения полей структуры pixelformatdescriptor и вызы­ваем функцию choosePixeiFormat. Эта функция возвращает номер пиксел-ного формата, который можно использовать. Если это номер 0, то созда­ние нужного контекста отображения невозможно.

5. Вызовом функции setPixelFormat задаем соответствующий пикселный формат в контексте hdc

6. На основе контекста hdc создаем контекст отображения hgirc вызовом функции wglCreateContext. Для переадресации текущего вывода графики

OpenGL В hglrc Необходимо Вызывать функцию wglMakeCurrent.

7. В ходе работы программы выводим графические объекты в текущий кон­текст отображения. Графический вывод можно осуществлять во время об­работки сообщения wm_paint или других сообщений. Для этого использу­ются функции для работы с графическими примитивами OpenGL.

8. Перед закрытием окна программы необходимо закрыть все открытые кон­тексты отображения. Также следует закрыть все контексты графического устройства. Это можно сделать в ходе обработки сообщения wmdestroy ВЫЗОВОМ функций ReleaseDG И wglDeleteContext.

Чтобы использовать библиотеку OpenGL, в среде разработки программ на С и C++ необходимо подключить соответствующие файлы заголовков. Напри­мер, в среде Borland C++ 5.02 для этого достаточно включить в текст про­граммы строки:

10.1. Пример программы OpenGL

Текст программы здесь представлен в виде двух файлов — winOpGL.cpp и studexso. срр. В этой программе использованы те же файлы ресурсов (studex.rc) и общего описания (studex.def), что и во всех предыдущих при­мерах программ.

Файл WinOpGL. срр:

Текст этой программы составлен их двух частей— winOpGL.cpp и studexso.срр. В файле WinOpGL.cpp сосредоточены функции, необходимые! для создания окна, оконные функции, функции инициализации графики. Этот^ файл будет использован и в следующих примерах программ OpenGL. Файл studexso. срр содержит текст, описывающий графическое отображение кон­кретных объектов (функция DrawMyExampieOpenGL). Как вы, наверное, уже за-

метили, все это подобно использованию в главах 5—8 наших собственных

файлов wiranain.cpp, winmainl.cpp И studexXX. cpp.

Запустите программу, затем выберите меню "Графика". На экране в окне программы появляется картинка, показанная на рис. 10.1.

Рис. 10.1. Первый пример OpenGL — двумерная графика

Изображение в окне программы studexso создается из нескольких графиче­ских примитивов. В данном случае рисовались точки, линии и полигоны. Вывод каждого такого примитива в OpenGL оформлен парой функций glBegin И glEnd:

Аргументом функции glBegin является код типа объекта.

Координаты вершины объекта задаются функцией givertexxx. Эта функция имеет много разновидностей (суффиксов хх). Отличия обусловлены типом и количеством аргументов givertex. Количество аргументов соответствует числу измерений систем координат. Тип координат-аргументов может быть целым или вещественным (с плавающей точкой) в нескольких разновидно­стях. Например:

задает двумерные вещественные координаты, а

задает также вещественные, но трехмерные координаты вершины.

Перечисление всех вершин объекта в программе завершает вызов функции glEnd. Это означает запись примитива в очередь графического вывода. В за-

висимости от аргумента функции giBegin(mode) список вершин может трак<; товаться OpenGL по-разному (табл. 10.1).

Таблица 10.1

Можно считать существенным недостатком ограничение для полигонов (glpolygon) возможностью вывода только выпуклых фигур. Функция API Windows Polygon в этом плане намного совершеннее — она рисует и невы­пуклые полигоны. В OpenGL для рисования произвольных полигонов преду­смотрена триангуляция.

Размер точек можно задать вызовом gipointsizeo, толщину линий — giLineWidth (). Для задания стиля линий используются функции glLineStipple, glEnable И glDisable, например:

glLineStipple(3, 0x08ff);

glEnable(GL_LINE_STIPPLE);

.... //здесь используется этот стиль линий

glDisable(GL_LINE_STIPPLE);

причем аргументами функции glLineStipple о являются количество повто­ров пикселов и шаблон пунктира.

Стиль заполнения фигур может быть задан растровым образцом в массиве 32x32 бит.

ения

Обратите внимание, мы уже несколько раз использовали функции glEnabie () иgiDisable (). Это многоцелевые функции. Они предназначены для управле­ния многими разнообразными режимами отображения.

10.2. Координаты и матрицы

В OpenGL используются три типа матриц— видовая матрица, матрица про­екции и матрица текстуры. Все они имеют размер 4x4 и определяют преобра­зования координат так, как описано в главе 2 этой книги.

Для задания 16 элементов матрицы можно использовать функции

которые копируют элементы массива т[ ] в текущую матрицу. Для некоторых часто используемых преобразований предусмотрены функ­ции, которые автоматически заполняют значения коэффициентов. Функция giLoadidentityO устанавливает единичную матрицу текущего преобразо­вания:

Следующие функции заполняют матрицы значениями коэффициентов, соот­ветствующими таким преобразованиям:

Для того чтобы матрица определенного типа стала текущей, следует вы­звать функцию glMatrixMode(mode), где значение mode = GL_MODELVIEW,

glprojection или gljtexture. Видовая матрица определяет преобразования мировых координат в координаты проецирования (видовые координаты). Матрица проекции отвечает за преобразование видовых координат проекции в экранные координаты. Матрица текстуры предназначена для наложения проективных текстур.

Для задания проекций отображения предусмотрены несколько функций. Ак­сонометрическая проекция (здесь называется ортографической) задается функциями giQrtho( ) или giuOrtho2D о. Центральная проекция устанавли­вается ВЫЗОВОМ функции gluPerspective ().

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

glViewport().

10.3. Пример трехмерной графики

Рассмотрим пример ЗБ-программы OpenGL. Файл studexsi.cpp:

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5259
Авторов
на СтудИзбе
420
Средний доход
с одного платного файла
Обучение Подробнее