Подключение библиотеки OpenGL в Delphi

Автор: Пользователь скрыл имя, 02 Ноября 2012 в 14:22, курсовая работа

Краткое описание

Эта работа посвящена компьютерной графике, а именно тому, как использовать OpenGL в Delphi. OpenGL - это стандартная библиотека для всех 32-разрядных операционных систем, в том числе и для операционной системы Windows. OpenGL - не отдельная программа, а часть операционной системы

Оглавление

ВВЕДЕНИЕ__________________________________________________2стр.
1. Раздел 1 “Windows-приложения“_____________________5стр.
1.1. Событие, сообщение, ссылка ___________________________5стр.
1.2. Перехват сообщений_________________________________10стр.
2. Раздел 2 “Подключение OpenGL”_____________________17стр.
2.1. Минимальная программа OpenGL_____________________17стр.
2.2. Вывод на компоненты Delphi средствами OpenGL _______27стр.
Вывод_____________________________________________________41стр.
Список литературы ____________________________________42стр.

Файлы: 1 файл

Копия Курсовая 1.doc

— 318.50 Кб (Скачать)

 

 

Типы OpenGL

Библиотека OpenGL является переносимой по отношению к платформам, операционным системам и средам программирования. Для обеспечения этой независимости в ней, в частности, определены собственные типы. Их префикс - "GL", например, GLint. В каждой среде программирования в заголовочных файлах эти типы переопределяются согласно собственным типам среды. Разберем, как это делается в Delphi. Заголовочный файл Delphi opengl. pas начинается с определения знакомого нам типа HGLRC:

Type

HGLRC = THandle;

Далее следует описание всех остальных типов OpenGL, например, наиболее "ходовой" тип GLfloat соответствует  типу Single:

GLfloat = Single;

Поначалу многие испытывают затруднение, когда приходится использовать "неродные" для Delphi типы. По мере накопления опыта эта неловкость быстро проходит, и я рекомендую использовать с самого начала знакомства именно типы библиотеки OpenGL, даже если вы наизусть знаете их родные. Для Delphi аналоги. Наверняка вам рано или поздно придется разбираться в чужих программах или переносить свои программы в другую среду программирования или даже в другую операционную систему. В атмосфере бес прерывной смены технологий, в которой мы находимся все последние годы нельзя быть уверенным в том, что какая-либо операционная система (и/или среда программирования) на долгие годы станет надежным средством во площения наших идей Вряд ли кто-то может поручиться, что его любимая операционная система проживет еще хотя бы десяток лет и не выйдет внезапно из моды, сменившись другой, о которой вы и не слышали пару месяцев назад. Однако вернемся к типам OpenGL. He все из них удается точно перевести. Например, GLclampf - вещественное число в пределах от нуля до единицы - в Delphi определен просто как single. Поэтому обычно в программах устанавливают "ручную" проверку на вхождение величины такого типа в требуемый диапазон.

Будьте внимательны с целыми числами помимо типа GLint имеется тип GLUin - целое без знака, соответствующее типу Cardinal.

В ряду типов OpenGL особо надо сказать о типе

GLboolean = BYTEBOOL,

Соответственно, определены две константы

GL_FALSE = 0, GL_TRDE = 1,

Константы эти имеют  непосредственное отношение к типу GLboolean, однако их значения, как вы понимаете, не соответствуют типу BYTEBOOL. Из-за ошибки в описании типа (или определении констант) не удастся использовать стандартный для OpenGL код, поэтому вместо констант GL_FALSE и GL_TRUE будем использовать False и True, соответственно Конечно, можно самому скорректировать описание типа, например, так

GLboolean = 0 1,

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

 

TGLArrayf4 = array [0 ..3] of GLFloat,

TGLArrayf3 = array [0..2] of GLFloat,

TGLArrayf4 = array [0..3] of GLint,

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

PGLfloat = ^GLFloat,

Такого типа нет в  стандартном наборе типов OpenGL библиотека изначально создавалась на языке  С, синтаксис которого хорошо приспособлен к использованию указателей, поэтому во введении особого типа для них просто не было необходимости Вообще, должен сказать, что OpenGL наиболее приспособлен для программирования на С, поэтому некоторые моменты будут вызывать некоторые неудобства при использовании Delphi (уже упоминавшаяся система справок лишь одно звено в этой цепи) Тем не менее, это не помешает нам успешно освоить программировании на Delphi c использованием этой библиотеки система Delphi имеет, конечно, слабые места. Чересчур большой размер откомпилированных модулей - не самое значительное из них Для графических приложений крайне важна скорость работы, и здесь пальма первенства тоже не за Delphi Если приложение интенсивно использует массивы и указатели, операции с памятью и проводит много вычислительных операций, то падение скорости при использовании Delphi вместо C/C++ оказывается значительным. По некоторым тестам, лучшие компиляторы C++ создают код, работающий в два раза быстрее. Однако это не должно отпугнуть вас от дальнейшего изучения использования OpenGL в проектах Delphi, поскольку здесь как раз тот случай, когда скорость работы самого приложения не так уж и важна Основную долю работы берет на себя сервер OpenGL, a приложению достается роль транслятора команд серверу, поэтому нет особых потерь производительности, если вместо языка C++ мы используем Pascal и Delphi конечно, для сокращения потерь производительности желательно использовать приемы объектно-ориентированного программирования, хотя я бы не сказал, что эти приемы во всех случаях приведут к заметному на глаз ускорению работы приложения Delphi имеет свои неоспоримые достоинства - прежде всего это несравнимая ни с каким другим средством скорость разработки и компиляции именно поэтому, а также из-за "скрытого обаяния" Delphi (вы понимаете, о чем я говорю) мы и выбрали эту замечательную систему в качестве основы для изучения OpenGL

Тип Tcolor и цвет в OpenGL

Разберем еще одну версию нашей первой программы, использующей OpenGL. Здесь на форму помещена кнопка, при нажатии которой появляется стандартный диалог Windows выбора цвета. После выбора окно окрашивается в выбранный цвет, для чего используются команды OpenGL. Поскольку такой прием мы активно будем применять в будущем, разберем подробно, как это делается.

Цвет, возвращаемый диалогом, хранится в свойстве color компонента класса TColorDialog. Согласно справке, значение $00FFFFFF этого свойства соответствует  белому цвету, $00FF0000 - синему, $0000FF00 - зеленому, $000000FF - красному. To-есть для выделения красной составляющей цвета необходимо вырезать первый слева байт, второй байт даст долю зеленого, третий - синего. Максимальное значение байта - 255, минимальное - ноль. Цвета же OpenGL располагаются в интервале от нуля до единицы. В нашем примере я ввел пользовательскую процедуру, определяющую тройку составляющих цветов для OpenGL по заданному аргументу типа TColor:

 

procedure TfrmGL. ColorToGL (с: TColor; var R, G, В: GLFloat);

begin

R: = {c mod $100) / 255;

G: = ((c div $100) mod $100) / 255;

В: = (с div $10000) / 255; end;

Из аргумента вырезаются нужные байты и масштабируются в  интервал [0; 1]

Замечание 
          Те же действия можно сделать и другим, более "продвинутым" способом:

R =(cand$FF)/255;

G. = ((c and $FFOO) shr 8) / 255,

В: = ((c and $FFOOOO) shr 16) / 255

Эта процедура используется в обработчике нажатия кнопки:

If ColorDialogl. Execute then begin

ColorToGL (ColorDialogl. Color, R, G, В);

Refresh;

end;

В примере для простоты окно перекрашивается обычным для Delphi способом - через вызов метода Refresh формы.

 

 Подробнее о заголовочном файле opengl. Pas

Вместе с Delphi версии три  и выше поставляется заголовочный файл, позволяющий подключать библиотеку OpenGL к проектам Delphi. Этот файл содержит только прототипы используемых функций и процедур, сами функции и процедуры размещены в соответствующих файлах DLL. Например, в секции interface заголовочного файла содержится следующее forward-описание использованной нами во всех предыдущих примерах процедуры:

procedure glClearColor (red, green, blue, alpha: GLclampf); stdcall;

В секции implementation модуля собственно описание процедуры выглядит так: procedure glClearColor; external opengl32;

Служебное слово stdcall, указанное  для всех процедур и функций в  этом модуле, означает стандартный вызов функции или процедуры и определяет некоторые правила обмена данными между приложением и библиотекой: как передаются параметры (через регистры или стек), в каком порядке перечисляются параметры и кто, приложение или библиотека, очищает области после их использования. Служебное слово external указывается для функций, подключаемых из библиотек. После него следует указание имени подключаемой библиотеки. Здесь opengl32 - константа, определяемая, как я отмечал раньше, в другом модуле - в windows. pas:

opengl32 = 'opengl32. dll1;

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

pas:

const

glu32 = 'glu32. dll';

Содержательная часть  модуля opengl, соответствующая его  инициализации, содержит единственную строку:

Set8087CW($133F);

В справке по этой процедуре  можно прочитать, что она служит для включения/выключения исключений при проведении операций с плавающей  точкой. Здесь же отмечается, что  для OpenGL рекомендуется эти исключения отключать. Разброс описаний констант и некоторых функций и процедур по разным модулям объясняется тем, напомню, что информация, относящаяся к реализации OpenGL под Windows, помещена в заголовочный файл windows pas. Это логично и объяснимо, но в некоторых случаях может вызвать дополнительные проблемы, например, при использовании альтернативных заголовочных файлов или библиотек. Далее мы встретимся с ситуациями, когда выяснится, что в стандартном модуле, поставляемом с Delphi, не окажется прототипов многих полезных команд. Там же попробуем найти объяснение этому факту. Альтернативные заголовочные файлы, разработанные некоторыми сторонними организациями или энтузиастами, оказываются более полными в этой части и поэтому полезны в некоторых ситуациях, но из-за того, что модуль windows pas уже содержит описание некоторых процедур, связанных с OpenGL, могут возникнуть накладки. Следующая возможная ситуация - использование других, нежели производства фирмы Microsoft, библиотек, например, версии OpenGL фирмы SGI, которую отличают более высокие скоростные характеристики по некоторым показателям. Правда, эту версию OpenGL имеет смысл использовать только на компьютерах, не оснащенных акселератором, поскольку она не может самостоятельно использовать драйверы ICD и MCD, а переадресует все вызовы в Microsoft OpenGL, чем сводятся на нет все ее достоинства. В свое время SGI обещала в следующей версии устранить этот недостаток, однако планы этой корпорации по поддержке операционной системы Windows и сотрудничеству с Miciosoft, по-видимому, изменились, так что эта работа, возможно, не будет завершена. Если вам потребуется модифицировать заголовочные файлы для подключения другой библиотеки, то придется учитывать несколько нюансов, связанных с версиями используемой Delphi. Здесь я смогу только обозначить эти тонкости. Хотя я и нашел решение проблемы подключения других версий OpenGL, но не имею возможности поделиться им - файл windows pas даже в сжатом виде имеет очень большой размер, поэтому на одной дискете модифицированные версии этого файла не разместить (для всех версий Delphi). Первое, с чего надо начать, - это изменить значения констант opengl32 и glu32 в заголовочных файлах и установить имена соответствующих файлов библиотек. Если вас не страшит то, что модифицируются стандартные модули Delphi, можете сразу компилировать проекты Если же вы модифицируете копии стандартных модулей, то придется учитывать, что почти каждый из стандартных модулей Delphi в списке uses подключает модуль windows, и, возможно, придется переставлять порядок модулей в списке uses. Обязательно посмотрите с помощью утилит быстрого просмотра или tdump заголовочную информацию откомпилированного приложения для того, что-бы убедиться, что оно использует только те библиотеки, которые подразумевались. При наличии нескольких библиотек невозможна ситуация, когда функции берутся вперемешку из разных библиотек. Если используется только одна определенная библиотека, но контекст воспроизведения оказывается невозможным получить, попробуйте явным образом заполнять формат пикселя, указывая требуемые значения для каждого поля - это может помочь.

 

 

 

 

 

                                                         Вывод

Несмотря на небольшой  объем, эту работу, я думаю, вполне можно считать полным руководством по использованию библиотеки OpenGL. В  частности, для режима RGBA не оставлено без внимания ни одной команды. Поэтому я уверен, что даже опытные программисты, работающие с OpenGL, найдут здесь для себя много полезного. Однако главный замысел курсовой работы состоял все же в том, чтобы предоставить начинающему пользователю информацию по OpenGL достаточную для того, чтобы легко и быстро научиться применять эту библиотеку в Delphi. Мне трудно судить о том, удался ли мой замысел, поэтому я очень заинтересован в том, чтобы узнать мнение студентов и преподавателей по поводу моей курсовой работы. После того как работа была написана, у меня родилась идея написать ее продолжение. Оно может касаться использования DirectX в Delphi или содержать расширенный набор примеров по созданию визуальных эффектов с помощью OpenGL. Либо это может быть подробное руководство по всем темам использования графики в Delphi.

 

 

 

 

 

 

 

 

                                       Список литературы

1. Тихомиров Ю. В.  Программирование трехмерной графики  в Visual C++. - СПб.: BHV - Санкт-Петербург, 1998. - 256 c.: ил.

2. Майкл Янг. Программирование  графики в Windows 95: Векторная графика  на языке С++/Пер. с англ. - M.: Восточная книжная компания, 1997. - 368 c.: ил.

3. Шикин А. В., Боресков  А. В. Компьютерная графика.  Динамика, реалистические изображения. - M.: ДИАЛОГ-МИФИ, 1998. - 288 с.

 




Информация о работе Подключение библиотеки OpenGL в Delphi