CFA LogoCFA Logo Computer
Новости Статьи Магазин Драйвера Контакты
Новости
RSS канал новостей
В конце марта компания ASRock анонсировала фирменную линейку графических ускорителей Phantom Gaming. ...
Компания Huawei продолжает заниматься расширением фирменной линейки смартфонов Y Series. Очередное ...
Компания Antec в своем очередном пресс-релизе анонсировала поставки фирменной серии блоков питания ...
Компания Thermalright отчиталась о готовности нового высокопроизводительного процессорного кулера ...
Компания Biostar сообщает в официальном пресс-релизе о готовности флагманской материнской платы ...
Самое интересное
Программаторы 25 SPI FLASH Адаптеры Optibay HDD Caddy Драйвера nVidia GeForce Драйвера AMD Radeon HD Игры на DVD Сравнение видеокарт Сравнение процессоров

АРХИВ СТАТЕЙ ЖУРНАЛА «МОЙ КОМПЬЮТЕР» ЗА 2002 ГОД

OpenGL и Delphi

Руслан РИЗВАНОВ rizvanov_ruslan@mail.ru

Сейчас уже никого не удивляет разнообразие игр с трехмерной графикой. За относительно небольшие сроки программисты умудряются создать небольшой виртуальный мир. Однако лет 10-15 назад, когда индустрия трехмерных игр была не настолько развита, программистам приходилось ломать себе голову над сложными формулами, разрабатывая миры Wolf 3d, Rise Of the Triad, Doom. То же касалось и CAD-ситем для создания моделей механизмов и машин. Сегодня же для этих целей используются готовые программные средства, берущие на себя заботы о прорисовке графики. Наверное, нет человека, который бы не слышал о технологиях Direct3D и OpenGL, детищ двух крупных компьютерных компаний. Direct3D, библиотека, входящая в состав DirectX и содержащая в себе более сотни различных процедур и функций для расчета и прорисовки 3D-графики, является разработкой Microsoft. Основной конкурент Direct3D —OpenGL, разработка легендарного Silicon Graphics, технологии которого в состоянии сотворить самые невероятные кинематографические чудеса. Именно о библиотеке OpenGL и пойдет далее речь.

OpenGL появилась и сформировалась как стандарт трехмерной графики в 1992 г, однако разработка ее велась еще с 1982. Формированием этого стандарта занимались Microsoft, IBM сorporation, Sun Microsystems, Inc., Digital Equipment Corporation (DEC), Hewlett-Packard Corporation, Intel Corporation и др. Результат — OpenGL, стандартная библиотека для многих 32-разрядных операционных систем (Windows, Linux в том числе), в отличие от Direct3D, которая присуща только Windows. OpenGl содержит в себе более 100 процедур и функций для построения трехмерной графики. Они находятся в opengl32.dll (Windows > System) и в расширении glu32.dll.

OpenGl можно использовать с разными языками программирования, поддерживающими работу с DLL. Но во многих уже есть поддержка OpenGl, «ограждающая» программиста от непосредственной работы с функциями и процедурами из DLL. Одним из таких языков программирования является Object Pascal, использующийся в среде Delphi. Да, да! Именно Делфи. Этот факт еще раз доказывает то, что в Делфи можно создавать не только скучные базы данных, но и полноценные мультимедийные приложения (игры, демо-программки). Да и вообще, в Делфи столько разных возможностей! Но сегодня поговорим об использовании OpenGl.

Начиная с 3-й версии, в комплекте Делфи поставляется заголовочный файл с описаниями процедур и функций, содержащихся в opengl32.dll, а также файл помощи с описанием типов, процедур и функций (далее — команд). В 3-й версии хелп очень уж облегченный, вдобавок почти полностью «стянут» с Си, в 5-й версии уже наблюдаются улучшения. Для того чтобы использовать OpenGL в Делфи-проекте, нужно дописать к списку подключаемых модулей opengl. После этого по любой ее команде можно получить подсказку или помощь обычным для Делфи способом. Для использования OpenGL вовсе не обязательно иметь 3d-аксселератор (но не помешало бы) — при работе с простенькими сценами и для изучения основ вполне достаточно даже S3 Trio с 1 Мб. Сервер OpenGL перед началом работы определяет, на каком оборудовании его пользуют и в соответствии с этим подбирает оптимальные настройки. Для этого программист в своей программе должен сделать установку формата пикселя, которому соответствует тип TPixelFormatDescriptor. При установке формата пикселя можно задавать различные флаги, влияющие на вывод изображения. Например, если вы используете анимацию, то без установки флага PFD_DOUBLEBUFFER никак не обойтись. Он устанавливает режим двойной буферизации — изображение сначала рисуется в памяти (в буфере), а потом выводится на экран для устранения мерцания. Следует также отметить, что OpenGl является промежуточным звеном между программой и устройством вывода. Т. е. ему надо сообщать, куда будет производиться вывод. Для этого используется контекст устройства и контекст воспроизведения. Первому соответствует свойство canvas.handle формы и др. Для второго в OpenGl существует специальный тип HGLRC (Handle openGL Rendering Context) — ссылка на контекст воспроизведения. Теперь несколько слов о командах и типах, предоставляемых OpenGl. Мультиплатформенность этой библиотеки обусловлена наличием ее собственных типов данных. Начинаются они с префикса GL и приведены в заголовочном файле Делфи — opengl.pas. Многим соответствуют стандартные типы Делфи (например, GLfloat соответствует типу Single — числу с плавающей точкой). Команды OpenGl начинаются тоже с префикса GL, после которого следует обозначение действия команды. В окончании определяется количество требуемых аргументов и их тип. Например, glColor3f — команда OpenGl для установки цвета, использующая 3 аргумента — числа с плавающей точкой (f — от слова float). Если в окончании присутствует символ v (пример —3fv), это значит, что в качестве аргумента будет использоваться массив (окончание 3fv указывает, что аргумент — массив трех чисел с плавающей точкой). Практически все команды для рисования размещаются в специальных программных скобках glBegin и glEnd. Они не имеют ничего общего с паскалевским begin, end. У glBegin есть аргумент, которым является константа, определяющая рисуемый далее (до glEnd) графический примитив. Например, между glbegin и glEnd есть команды, задающие координаты вершин примитива. Если аргументом glBegin является, к примеру, константа gl_quads, то построится прямоугольник на задаваемых далее вершинах, если gl_points — просто точки с координатами вершин, и т. п. Рекомендуется использовать тип аргументов GlFloat, но можно работать и с другими. Если вы используете GlFloat, то обратите внимание на то, что вывод будет осуществляться в область от -1 до +1 по x и по y. Так (-1,-1) — координата верхнего левого угла области вывода, а (-0.99,-1) — точка где-то рядом с ним. При задании цвета 0 — минимальное значение его составляющей (rgb), а 1 — максимальное (вроде, как 255), 0.5 — среднее.

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

Здесь во флагах pfd устанавливаются PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER — это сообщает серверу OpenGL, что система, на которой он будет работать, поддерживает работу с ним, и что будет использоваться двойная буферизация. Далее ChoosePixelFormat подбирает формат пикселя, а SetPixelFormat устанавливает этот формат. В качестве аргумента в процедуру передается ссылка на контекст устройства. Далее в обработчиках событий OnCreate и OnDestroy формы напишите следующее:

В первом случае при создании формы получаем (GetDC) контекст устройства (в данном случае формы), устанавливаем формат пиксела, с помощью wglCreateContext создаем контекст воспроизведения и делаем его основным (можно использовать несколько контекстов). Переменная hrc имеет тип HGLRC, а DC — HDC. Рекомендуется определять их в разделе private. Затем определяем цвет фона и устанавливаем матрицу преобразования координат для построения объемного изображения. glTranslatef сдвигает в глубину рисуемый далее объект.

Теперь создайте на форме кнопку — для запуска анимации. А в ее обработчике события OnCLick наберите такой текст:

glEnable позволяет включать разные опции. В данном случае — использование источников света.

Далее этой же командой включаем источник света GL_LIGHT0. Их может быть несколько, но в данном случае ограничимся одним. glEnable (GL_DEPTH_TEST) — включает режим проверки глубины изображения. Позднее попробуйте ее убрать — сразу поймете, что к чему.

Поместите на форму таймер, установите его интервал в 100 и enable=false, а обработчик соответствующего события приведите к таком виду:

На каждый тик таймера будет происходить поворот (команда glRotatef) на угол 1 (первый аргумент).

Затем SwapBuffers(DC) картинку из памяти отобразит на форме. Для перерисовки формы лучше использовать функцию API InvalidateRect — это быстрее, чем repaint. Теперь осталось последнее — задать, что же будет вырисовываться. В обработчике события формы Onpaint каждый раз рисуется одна и та же картинка, но так как по таймеру происходит поворот координатных осей, создается эффект анимации и вращения именно объекта. В OpenGl есть также возможность изменять точку наблюдателя —glLookAt.

GlClear — очищает буфер. Далее, задавая координаты вершин (glVertex), строим стороны куба. glNormal задает так называемый вектор нормали, требующийся для корректного изменения цвета объекта при освещении. Теперь все готово — можете запускать и любоваться сим творением :-).

Данная статья лишь знакомит с некоторыми основами OpenGL, но не рассматривает многочисленных нюансов и возможностей этой замечательной библиотеки, т. к. для это потребовалось бы несколько десятков наших еженедельников, целиком посвященных ей. Да и зачем превращать замечательный журнал в узкоспециализированное учебное пособие — ведь информации по OpenGL достаточно и в Интернете и на книжных рынках. Могу посоветовать книгу М. Краснова «OpenGL: графика в проектах Delphi», 2000 г. издательство bhv. Также есть очень интересный материал на сайте delphigfx.narod.ru. Вообще, со слов специалистов, OpenGL более легок в изучении, чем Direct3D, а по мощности и возможностям не уступает. Причина, по которой многие все-таки используют именно Direct3D, в основном состоит в том, что к последнему в придачу прилагаются еще и библиотеки для работы со звуком, музыкой, сеткой, вводом/выводом. Но вы же видели, что создают парни из Id Software? На мой взгляд (без лишних слов), OpenGL — rulez! Так что изучайте. Пригодится не только для создания игр, но и для серьезных вещей, вроде моделирования различных механизмов, самолетов, космических кораблей…

Рекомендуем ещё прочитать:






Данную страницу никто не комментировал. Вы можете стать первым.

Ваше имя:
Ваша почта:

RSS
Комментарий:
Введите символы или вычислите пример: *
captcha
Обновить





Хостинг на серверах в Украине, США и Германии. © sector.biz.ua 2006-2015 design by Vadim Popov