КГ_10глава (Компьютерная графика)
Описание файла
Файл "КГ_10глава" внутри архива находится в папке "Компьютерная графика". Документ из архива "Компьютерная графика", который расположен в категории "". Всё это находится в предмете "инженерная графика" из 4 семестр, которые можно найти в файловом архиве РТУ МИРЭА. Не смотря на прямую связь этого архива с РТУ МИРЭА, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "компьютерная графика" в общих файлах.
Онлайн просмотр документа "КГ_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: