Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

675

.pdf
Скачиваний:
1
Добавлен:
06.12.2022
Размер:
4.11 Mб
Скачать

681 С603

СИБИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ

Л.Ю. СОЛОВЬЕВ, О.В. СУББОТИНА-ЧУКАЛЬСКАЯ

ГЕОМЕТРИЧЕСКИЕ ПОСТРОЕНИЯ НА ПЛОСКОСТИ СРЕДСТВАМИ OpenGL

Методические указания

НОВОСИБИРСК 2008

УДК 681.518 С603

С о л о в ь е в Л.Ю.,Субб отина - Ч укальс кая О.В.Гео-

метрические построения на плоскости средствами OpenGL:

Метод. указ. — Новосибирск: Изд-во СГУПСа, 2008. — 38 с.

Содержат необходимый теоретический минимум для выполнения лабораторных работ по курсу «Компьютерная геометрия и графика», описание порядка выполнения лабораторных работ и варианты заданий к курсу.

Предназначены для студентов специальности ИСТ.

Рассмотрены ирекомендованы к печатиназаседаниикафедры «Общая информатика».

Ответственный редактор канд. техн. наук, доц. В.К. Косенюк

Р е ц е н з е н т декан факультета «Бизнес-информатика» д-р техн. наук

проф. В.И. Хабаров

Соловьев Л.Ю., Субботина-Чукальская О.В., 2008

Сибирский государственный университет

путей сообщения, 2008

ВВЕДЕНИЕ

Графическая система OpenGL — это прикладной аппаратнонезависимый программный интерфейс (API — Application Programming Interface) к графическому оборудованию. Она предназначена для создания интерактивных программ двумерной и трехмерной графики и анимации [1].

Основнойбиблиотекой(ядром) OpenGLявляется библиотека OPENGL32.DLL. Она включена в состав операционной системы Windows. Эта библиотека не содержит функций управления окнами и организации пользовательского ввода, а также функций описания сложных объектов. Собственные средства библиотеки OPENGL32 позволяют выполнять геометрические построения в пространстве только с помощью комбинации простейших примитивов — точек, прямых линий (отрезков) и плоскостей (треугольников, выпуклых четырехугольников и полигонов).

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

Существуют и другие библиотеки, расширяющие возможности OpenGL, но не входящие в стандарт OpenGL. Одной из таких библиотек является библиотека GLUT32.DLL. Она содержит собственный набор инструментовдля управления оконнойсистемой и пользовательским вводом, а также дополнительными функциями моделирования криволинейных объектов — каркасное (Wire) и сплошнотельное (Solid) представление цилиндра, сферы, конуса, тора и т.д.

Естественно, все библиотеки OpenGL ориентированы на применениевпроектах, создаваемыхнаязыкеС.Для ихприменения сдругимиязыкамипрограммирования необходимоиметь заголовочные файлы, которые, как правило, поставляются совместно с соответствующей средой разработки приложений.

3

В настоящих указаниях рассматривается реализация графической системы OpenGL в среде Delphi для Windows. Модули Delphi имеют заголовочный файл OPENGL.PAS, позволяющий подключать библиотеку OpenGL к проектам, написанным на языке Паскаль. Библиотеки утилит, не входящие в стандартную реализацию OpenGL (в частности библиотека GLUT32), не имеют подобных заголовочных файлов, поэтому их использование в других языковых средах затруднительно. Однако для среды Delphi вариант библиотеки GLUT32 можно найти в электронном приложении к учебнику [2].

Требования к выполнению лабораторных работ

Цель лабораторных работ: формирование практических навыковвразработке и проектированииграфических приложений.

Основная концепция, заложенная в методику курса, — это движение от создания простых двухмерных объектов, их преобразований, к более сложным проектам трехмерной графики.

Методические указания к лабораторным работам являются ориентиром в самостоятельной подготовке студентов по теме работы и содержат требования, рекомендации, контрольные вопросы и задания по теме работы.

Выполнение лабораторной работы включает следующие этапы.

1.Допуск к работе. На данном этапе преподаватель проверяет подготовленность студентов по теме работы, обсуждая методику создания проектов, задавая контрольные вопросы или контрольные упражнения.

2.Проектирование и реализация программы решения поставленной задачи (вариант выдается преподавателем после успешного выполнения п. 1):

— разработка и описание алгоритма поставленной задачи;

— написание программы в соответствии с требованиями к лабораторной работе;

— трансляция и отладка программы.

3.Защита лабораторной работы. К защите студент должен подготовить отчет по работе, продемонстрировать саму работу программы. Защита также включает в себя обсуждение алгоритма и программы, ответы на контрольные вопросы, решение контрольных примеров.

4

Отчет по лабораторной работе содержит следующие разделы:

1.Условие задачи.

2.Анализ задачи.

3.Алгоритм решения задачи.

4.Текст программы.

5.Инструкцию по работе с программой (если это необходимо).

6.Ответы на контрольные вопросы.

Анализ задачи необходим для того, чтобы:

определить, какие примитивы OpenGL необходимо использовать для решения поставленной задачи;

выбрать методику преобразования объектов;

выделить основные подзадачи, которые надо решить, чтобы достичь необходимых результатов.

На основании этого определяется подход к разработке алгоритма решения задачи (т.е. метод ее решения), который позволяет в самом общем виде сформулировать, что должно выполнять графическое приложение.

Как правило, в постановке задачи нет каких-либо ограничений выбораграфическихпримитивов,поэтомунеобходимоопределить, из каких объектов будет состоять графическое приложение и как они будут преобразованы. Кроме этого, необходимо учитывать и структуру интерфейса.При этом перед студентом ставится проблема наиболее оптимального решения поставленной задачи.

Алгоритм решения задачи — это не программа ее решения, а способ дать человеку (а не машине) представление о структуре алгоритма, о смысле его шагов и их логических взаимосвязей. Поэтому шаги алгоритма должны описываться в терминах тех объектов и отношений между ними, о которых идет речь в условиях задачи. Структура алгоритма станет более ясной, если

ееописывать внагляднойи достаточноформализованнойформе.

Инструкция по работе с программой должна отвечать

следующим требованиям.

1.Быть написанной ясным и доступным для понимания слабоквалифицированного пользователя языком.

2.Характеризовать работу приложения, описывая его назначение иминимальный набортехнических требований для его работы.

3.Содержать основные этапы работы с приложением.

4.Инструкция не должнабыть перегруженаспецифическими терминами.

5

Лабораторная работа № 1 НАЧАЛО РАБОТЫ. ПРИМИТИВЫ «ТОЧКА» И «ОТРЕЗОК»

Цель работы: ознакомиться с основами использования библиотек OpenGL и приемами простейших построений.

Теоретическая часть

Порядок работы. Начало

Для использования средств графической системы OpenGL в создаваемых приложениях Delphi сначала необходимо подключить соответствующие библиотеки. Библиотеки стандартной реализации OpenGL (OPENGL и GLU) подключаются единственным указанием OpenGL в разделе USES программного модуля. Все другие библиотеки (и в частности GLUT) требуется подключать отдельно. Следует отметить, что при разработке приложений на языке С достаточно подключения только библиотеки GLUT, стандартные библиотеки OpenGL при этом будут подключены автоматически.

Далее необходимо установить контекст устройства. Контекст устройства (DC — device context) — это поддерживаемая операционной системой структура данных, ассоциированная с физическим выходным устройством, например, дисплеем или принтером. Структура данных контекста устройства содержит набор графических объектов, подлежащих выводу, и их атрибутов (параметры области вывода, тип инструмента рисования (карандаш, кисть и т.д.), цвет этого инструмента и т.д.). Такая структураимеетопределенныйтип—HDC.Контекстустройства требуется определять при любом графическом выводе (например, при выводес помощью функций GDI Windows), а нетолько при использовании OpenGL. Контекст устройства всегда связан с окном вывода, и если таких окон несколько, то вывод выполняется в текущем окне.

В Delphi получение контекста устройства выполняется функцией Windows API GetDC() в момент создания формы (по событию OnCreate). В качестве аргумента функции, как правило, выбирается указатель Handle текущей формы (или окна, еслинеиспользуется Delphi).Кстати, еслиуказатьGetDC(0),то вывод будет осуществлен прямо на рабочий стол.

6

DC := GetDC (Handle);

где переменная DC имеет тип HDC.

Итак, назначение контекста устройства — связывать графический вывод с конкретной областью вывода на физическом устройстве вывода.

Следующим шагом является определение формата пикселя. Формат пикселя для Win32 — это структура данных TPixelFormatDescriptor, содержащая детальную информацию о состоянии растрового формата графической системы. Структура формата пикселя содержит такие поля, как тип пикселя (RGBA, или индекс цвета), тип буферизации (одинарная или двойная), глубина цветности, наличие буферов — глубины, трафарета и накопления, аппаратная или программная реализация графических процедур и т.д. По сути дела, формат пикселя содержит требования к конфигурации окна. Подробное описание формата пикселя можно найти в соответствующей литературе. Здесь приведем минимальное описание этой структуры. Рассмотрим примерпользовательскойфункцииSetDCPixelFormat, взятойиз учебника [2] (табл. 1).

Таблица 1

 

Код процедуры

Комментарии

procedure TfrmMain.SetDCPixelFormat;

 

var

 

 

nPixelFormat: Integer;

 

pfd: TPixelFormatDescriptor;

 

begin

 

 

FillChar (pfd, SizeOf(pfd), 0);

Функция заполнения полей структуры pfd.

 

 

В этой строчке поля структуры

 

 

очищаются (параметр 0)

With pfd do begin

Начало определения параметров

 

 

структуры pfd

nSize

:= SizeOf(pfd);

Определение размера структуры pfd

nVersion := 1;

Поле структуры «версия» (всегда 1)

dwFlags

:= PFD_DRAW_TO_WINDOW

Поле структуры «битовые флаги». Здесь

or

 

установлены флаги вывода в окно,

 

PFD_SUPPORT_OPENGL or

поддержки OpenGL и режима двойной

 

PFD_DOUBLEBUFFER;

буферизации

iPixelType:= PFD_TYPE_RGBA;

Флаг режима отображения цветов. В

 

 

данном случае цвет пикселя задается в

 

 

формате RGB с -компонентой (индексом

 

 

прозрачности). Альтернативой является

 

 

задание цвета индексом в палитре –

 

 

PFD_TYPE_COLORINDEX

7

 

Окончание табл. 1

 

 

Код процедуры

Комментарии

cColorBits:= 24;

В режиме RGBA определяет размер

 

буфера цвета (число битовых

 

плоскостей). Этот параметр должен быть

 

согласован с цветовыми установками

 

рабочего окна. Например, нельзя

 

применять 32-битный формат при 16-

 

битном окне, и наоборот

cDepthBits:= 32;

Размер буфера глубины (используется в

 

трехмерной графике)

iLayerType:= PFD_MAIN_PLANE;

Установка главного слоя рисования (по

 

данным [3, 4] – параметр игнорируется

 

как устаревший)

End;

Завершение определения параметров

 

структуры pfd

nPixelFormat := ChoosePixelFormat (DC,

Функция запроса системе о возможности

@pfd);

применения выбранных параметров

 

формата пикселя. Возвращается

 

целочисленный индекс наиболее

 

подходящего формата

SetPixelFormat (DC, nPixelFormat, @pfd);

Назначение допущенных системой

 

параметров формата пикселя

end;

 

Помимо указанных, существует еще большое количество параметров формата пикселя, информацию по которым можно получить, например, из справки Microsoft или в примерах учебника [2] и в пособиях [3, 4].

Далеко не все запрашиваемые параметры могут быть реализованы при конкретных настройках на конкретном рабочем месте. Однако по умолчанию установки формата пикселя могут быть далеко не оптимальными (например, может оказаться не установленным режим двойной буферизации). Поэтому с помощью описаннойпроцедуры следуетявноуказатьжелаемыепараметры формата пикселя и с помощью функции ChoosePixelFormat запросить операционную систему о возможности их реализации. В результате будет возвращена структура возможных значений запрошенных параметров, которую и надо установить функцией

SetPixelFormat.

Режим двойной буферизации связан с особенностью вывода изображения на экран. Существуют понятия «переднего» (рабочего) и «заднего» (фонового) буферов кадра. Содержимое

8

«переднего» буфера кадра непосредственно отображается на дисплее. Очевидно, что непосредственная трансляция изображения на экран в процессе его создания не является лучшим решением. Поэтому в большинстве случаев параметром PFD_DOUBLEBUFFER устанавливается режим двойной буферизации, прикоторомизображениесначалаполностьюформируется в «заднем» буфере кадра, а затем с помощью функции SwapBuffers(DC) переносится в «передний» буфер, т.е. собственно выводится на экран.

Завершает этап основныхподготовительных работ установление контекста воспроизведения (визуализации, рендеринга — Rendering Context). Понятие контекста воспроизведения относится кOpenGL и имеет в целом то же назначение, что и контекст устройства. Введено этопонятиедля обеспечения переносимости создаваемых приложений. Таким образом, OpenGL взаимодействует с физическим устройством через контекст устройства и контекст воспроизведения. Структура контекста воспроизведения имеет тип HGLRC.

Создание контекста воспроизведения выполняется функцией hrc := wglCreateContext (DC);

где DC — контекст устройства, а переменная hrc имеет тип

HGLRC.

Таким образом, полный текст модуль создания формы (окна) в Delphi может выглядеть так:

procedure TfrmGL.FormCreate(Sender: TObject); begin

dc := GetDC (Handle); SetDCPixelFormat(DC);

hrc := wglCreateContext(DC); end;

Забегая вперед отметим, что созданные контексты по окончании работы с ними должны быть удалены!

Порядок работы. Продолжение

Таккакконтекствоспроизведения (визуализации), такжекак и контекст устройства, работает с текущим окном, то следующим

9

действием является установление текущего контекста (например, по событиям формы OnCreate или OnPaint) командой wglMakeCurrent (DC, hrc);

В принципе, указывая в качестве аргумента функций wglCreateContextиwglMakeCurrentпараметрDC=Canvas.Handle

(свойство формы Delphi, обладающее такой же структурой, что иконтекстустройства), можнонаписатьпрограммуи безиспользования контекста устройства. Однако результат вывода в этом случае нельзя будет гарантировать.

Установивтекущийконтекствоспроизведения, можноприступать к собственно созданию изображения. Рассмотрим часть модуля перерисовки окна:

procedure TfrmGL.FormPaint(Sender: TObject); begin

glViewPort (0, 0, ClientWidth, ClientHeight); glClearColor (0.5, 0.5, 0.75, 1.0); glClear(GL_COLOR_BUFFER_BIT);

end;

Здесь использованы функции OpenGL — определения обла-

стивывода вокноglViewPort(0, 0, ClientWidth, ClientHeight), назначения цвета фона glClearColor (0.5, 0.5, 0.75, 1.0) и

заполнение этим цветом буфера цвета: glClear(GL_COLOR_BUFFER_BIT).

Функция вывода в окно glViewPort (x, y, W, H), кроме назначения области вывода, выполняет также одну из операций конвейера преобразований OpenGL — преобразование координат модели в физические координаты окна области вывода. В настоящем примере область вывода занимает всю клиентскую часть формы. Аргументы функции glViewPort () имеют соб-

ственный тип данных OpenGL: x, y GLint; W, H GLsizei

(целые данные типа long).

Аргументы функции glClearColor (R, G, B, A) определяют цвет фона в формате RGBA, где R, G, B — величины составляющих цвета (красный, зеленый и синий соответственно); A — величина -компоненты, используемой в процессе смешения цветов для управления прозрачностью (имеет значение только

1 0

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]