NeHe Tutorials Народный учебник по OpenGL
Часть 1

Цель данной статьи – максимально помочь Вам в настройке среды C++Builder 6 и подготовке дополнительных библиотек для работы с графической системой OpenGL.

 

Первоначальные сведения.

 

Первым делом следует убедиться, что в системной переменной PATH указана папка WindowsRoot\System32, где WindowsRoot – папка, в которой установлена Windows (у меня установлена Windows 2000). Для этого в режиме командной строки (Пуск/Стандартные/Командная строка) выполняем команду path. В WindowsRoot\system32 должны лежать файлы OpenGL32.dll (библиотека OpenGL 1.1 от MS) и GLU32.dll (библиотека GL Utilities, тоже от MS). Обычно два эти условия выполнены.

 

Далее. В среде BCB есть файл $(BCB)\lib\Import32.lib, который содержит ссылки «на все нужное», в том числе и на dll-библиотеки, упомянутые выше. При компиляции проекта из IDE или с помощью компилятора с линковкой (bcc32 -v -Tpe test.cpp) эта библиотека подключается автоматически. Если линкуем извне ilink32.exe, надо подключить эту библиотеку явно.

 

В файлах-заголовках (где требуется поддержка OpenGL) вставляются 2 строки

 

#include <gl\gl.h>

#include <gl\glu.h>

 

Таким образом, если в путях проекта прописаны include-директория $(BCB)\include, lib-директория $(BCB)\lib и файлы gl.h, glu.h, import32.lib на своих местах и не поломанные (это так по умолчанию), то вообще ничего больше делать не надо.

 

Есть еще одна маленькая деталь, связанная с обработкой математических ошибок сопроцессора. Если ваша программа неожиданно «вылетает» при вычислениях с плавающей точкой в библиотеках MS, то рекомендуется перед рисованием каждого кадра (в Win9x) вставлять пару команд

 

_clear87();

_control87(MCW_EM, MCW_EM);  /* определена в float.h BCB*/)

 

или одну вторую команду (Win2k, WinXP) в секции инициализации.

 

Эти редкие «вылетания» происходят при возбуждении исключений от сопроцессора. MS игнорирует эти исключения, Borland – нет. Команда _control87 с указанными флагами приводит к игнорированию этих исключений и в BCB.

 

Более подробно см. статью J.R. Thomas’а http://dn.codegear.com/article/10528 (так же смотри в архиве в конце статьи). Там приводится пример минимальной программы с подробным разбором. Более развитую версию этого примера см. в примере от Borland ($(BCB)\Examples\OpenGL\Drawing\). Еще пример на русском http://www.compdoc.ru/prog/builder/opengl/ .


GLAUX и GLUT.

 

Теперь о библиотеках GLAUX и GLUT, использование которых часто вызывает множество вопросов.

 

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

 

НЕ РЕКОМЕНДУЕТСЯ использовать их в продвинутых приложениях, т.к. сообщалось, что первая содержит утечки памяти, а вторая имеет ограничения и не работает в полном объеме с VCL. Их распространение объясняется наличием большого количества примеров с их использованием в руководствах и учебниках.

 

Если у вас нет заголовочного файла glaux.h загляните в архив в конце статьи. Затем поместите его в $(BCB)\include\gl.

 

GLAUX.lib от MS – статическая библиотека (т.е. не имеет соответствующую dll) и не будет линковаться с C++Builder. Чтобы все же слинковать, нужно иметь ее тексты  http://www.gate.net/~rpraver/  и откомпилировать под C++Builder’ом, внеся некоторые исправления (так же смотри в архиве в конце статьи). Развернув архив, замените содержимое M.bat на что-то вроде bcc32 -v -Tpe test.cpp .\glaux.lib. После выполните команду make –makefile (или make –fmakefile) из командной строки (окна DOS), находясь в каталоге развернутого архива. Вы получите сообщение о 10 ошибках, которые исправляются в файле glaux.c изменением void ИмяФункции на void APIENTRY ИмяФункции в нужных 5 местах. Запускайте CLEAN.bat перед каждым запуском make. Когда make выполнится без ошибок, хотя и с предупреждениями, у вас будет Borland-совместимая библиотека glaux.lib. Запустите M.bat для создания тестирующего приложения. Запустите его на исполнение. Если все сделано правильно и приложение запустилось, поиграйте клавишами-стрелками. И, наконец, скопируйте glaux.lib в $(BCB)\lib. Разумеется, в опциях проекта, использующего GLAUX, в Library path должна быть указана папка $(BCB)\lib или можно добавить glaux.lib в проект явно. Для практики, попробуйте откомпилировать урок 9 для BCB с сайта NeHe http://nehe.gamedev.net.

 

Для GLAUX имеются замены (для работы с изображениями):

 

1. На NeHe для скачивания есть замена GLAUX для загрузки изображений (Misc), там же, кстати, есть порт для всех уроков в C++Builder 6, по которым можно, работая в BCB, изучать OpenGL на чистом Win API.

2. см. http://www.sourceforge.net/  (http://sourceforge.net/project/showfiles.php?group_id=128326 )

3. http://members.cox.net/scottheiman/bmglib.htm

4. см. пример $(BCB)\Examples\OpenGL\Drawing\GlSkel.cpp (SetupTextures), в котором показано, как загружать .bmp-файлы с помощью компонента TBitmap (и даже задавать прозрачный цвет).

 

Кому очень нужен GLUT:

 

На http://www.xmission.com/~nate/opengl.html находится самая последняя версия GLUT 3.6.7, первоначально написанная ее создателем Mark’ом Kilgard’ом (так же смотри в архиве в конце статьи). Берем из bin-архива glut32.dll и далее используем команду implib.exe glut32.lib glut32.dll. Следует положить glut32.dll в WindowsRoot\system32, glut.h в $(BCB)\include\gl и glut32.lib в $(BCB)\lib. Разумеется, в опциях проекта, использующего GLUT, в Library path должна быть указана папка $(BCB)\lib, а в Include path – папка $(BCB)\include. Дополнительная информация на http://www.opengl.org/. Как работать с GLUT, можно узнать по оригинальной документации  http://www.opengl.org/documentation/specs/glut/spec3/spec3.html или, для желающих, PDF http://www.biometricscatalog.org/DocumentMgr/ViewDocument.aspx?pk=b774e420-3bc8-4e42-aaff-b6e12d2427a0, и из книги И. Тарасова http://opengl.org.ru (так же смотри в архиве в конце статьи). Там же много примеров, но  под VC. Хорошим упражнением для «строителей» будет переписать их под BCB.

 

Для практики рекомендуется создать несколько типов проекта, используя файлы примеров из скачанного пакета glut-3.7.6-src.zip (папка examples). Возьмем, например, файл triangle.c. В BCB создадим консольное приложение –File/New/Other и на закладке New выберем Console Wizard. Установим галочку Specify project source и выберем указанный файл (не забудьте, что его расширение .c). Все готово! Мы создали проект консольного приложения на чистом С. Обратите внимание, что при использовании GLUT нет нужды писать директивы.

 

#include <gl\gl.h>

#include <gl\glu.h>

 

Необходима только строка

 

#include <gl\glut.h>

 

Чуть сложнее создать проект приложения на C++. Используя Console Wizard, следует снять указанную галочку и установить переключатель в C++. Сохраните полученный проект. Теперь вставьте весь текст, кроме функции main, из triangle.с в Unit1.cpp сразу после #pragma hrdstop, а содержимое функции main в Unit1.cpp замените содержимым функции main из файла triangle.с. Попробуйте скомпилировать проект. Не получилось? Не беда. Добавьте в свойства проекта Project Options\Directories/Conditionals\Conditional defines через «;» GLUT_BUILDING_LIB.

Если у вас появятся ошибки – сообщения о неразрешенных ссылках – добавьте в свойства проекта Library path - $(BCB)\lib\Psdk. Там находятся Borland-совместимые библиотеки Opengl32.lib и Glu32.lib (иногда они требуются!). Теперь у вас есть приложение на C++ (можете использовать классы и даже ограниченно VCL)!

 

Еще раз повторю. Лучше не пользоваться GLAUX и GLUT (кроме как для обучения), а работать только средствами BCB. Разберитесь в 2-х примерах $(BCB)\Examples\OpenGL.

 

           

 

 

Почитайте C++Builder 5. Руководство разработчика. Том 2 - Более сложные методы работы в C++Builder 5 http://www.mini-soft.ru/book/build_2.php , установите и поработайте с компонентами Allan’а Petersen’а и Daniel’я Plakosh’а:

http://www.allanpetersen.com/ - наиболее продвинутый из бесплатных.

http://www.cobweb.net/~dplakosh/- предшественник предыдущего (BCB5) (могуч русский язык!).

(так же смотри в архиве в конце статьи).

 

Приведенной информации достаточно, чтобы начать самостоятельно применять Borland C++Builder для разработки проектов под OpenGL. Одно «но» - не был рассмотрен полноэкранный режим. Но о нем – в следующий раз.

 

Немного философии.

 

Использовать исключительно C++Builder можно по разным причинам:

 

Хочу и все. Привык.

Действительно, продукт грандиозный. Оторваться трудно. Но задумывался он, в первую очередь, для быстрой разработки интерфейса и работы с базами данных. Чтобы решать на нем другие нестандартные задачи, изучить его придется гораздо глубже, чем это обычно делается. Но старания окупаются. Могу порекомендовать книги Charlie Calvert’а.

Не хочу изучать все эти WM_SYSCOMMAND…

Сам грешу этим, тем более что C++Builder изящно маскирует все эти сложности. Но без хорошего знания Win API в программировании под Windows далеко не продвинуться…

Нет Visual Studio.

Можно скачать бесплатный VS Express Edition. А, кстати, C++Builder откуда?

Но самое главное, люблю RAD и завернутые в изящную обертку события.

Да, в этом Borland обогнала MS лет на 10. И только с появлением .NET MS подтянулась. Но здесь придется изучать новую среду, возникнут сопутствующие проблемы… Круг замкнулся.

 

В последнем случае я бы рекомендовал тщательно разобраться в устройстве упомянутых выше компонентов типа OpenGLPanel и внимательно ознакомиться с пакетом GLScene  http://glscene.sourceforge.net/wikka/HomePage, параллельно продолжая изучать OpenGL (хотя с GLScene это и не обязательно). Есть и на русском http://www.glscene.ru/ .

 

C GLScene маленькая трудность. 714 релиз под Delphi и придется потрудиться, настраивая TortouseCVS для скачивания из CVS ветки GLScene для C++Builder (см. FAQ) и изучая саму Сцену. Но вообще перспективно, даже обещается кроссплатформенность! Да, Сцена тормозит. Но этот вопрос очень тонкий. И, потом, первый стабильный релиз появился всего полгода назад, хотя разработка ведется почти 5 лет. В ближайшее время ожидается новый релиз.

 

Архивы к статье: GLAUX (0.2Mb), GLUT (0.4Mb), Компоненты (2.6Mb), Замены GLAUX (2.4Mb).

 

Основной источник: http://members.cox.net/scottheiman/opengl.htm

 

© Виктор Пономарев

PMG  11 мая 2007 (c)  Виктор Пономарев