OpenGL и C++ Builder

Цель данной статьи – максимально помочь Вам в настройке среды 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’а:

/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)  Виктор Пономарев

Поделиться ссылкой:

32 комментария

Оставить комментарий
  1. Good day very cool site!! Man .. Beautiful .. Amazing .. Angie Weston Langston

  2. It is not my first time to pay a quick visit this site, i am browsing this site dailly and take good data from here every day. Arielle Boot Tiernan

  3. Somebody necessarily lend a hand to make severely posts I might state. This is the first time I frequented your website page and up to now? I surprised with the research you made to create this particular post amazing. Fantastic job! Janaya Muhammad Omar

  4. I have been exploring for a bit for any high quality articles or weblog posts on this kind of house . Exploring in Yahoo I eventually stumbled upon this site. Studying this info So i am happy to convey that I have an incredibly good uncanny feeling I found out exactly what I needed. I such a lot no doubt will make certain to do not fail to remember this website and give it a look regularly. Reeva Jeffrey Felizio

  5. You have a quality site, I congratulate you on this Dottie Gaspard Mor

  6. Thanks for the marvelous posting! I truly enjoyed reading it, you may be a great author. I will ensure that I bookmark your blog and will eventually come back down the road. I want to encourage that you continue your great posts, have a nice afternoon!| Brynna Izaak Ameline

  7. There is definately a lot to find out about this topic. I really like all the points you made. Reena Haydon Laresa Jojo Hamnet Bradan

  8. Great message. I discover something more challenging on various blogs everyday. It will constantly be boosting to check out content from other writers and also exercise a little something from their store. I?d like to make use of some with the content on my blog whether you don?t mind. Natually I?ll provide you a link on your web blog. Many thanks for sharing. Benedikta Cole Bobbette

  9. The finest sites and blogs and forums centered on literature and learning? edffaacfkeegfafe Blakelee Jesse Combs

  10. Way cool! Some very valid points! I appreciate you writing this article and the rest of the site is also very good. Marcia Rafaello Katerine Roselia Had Joete

  11. Pretty! This has been a really wonderful article. Thanks for supplying this info. Colette Ricki Stacie

  12. I was able to find good info from your blog posts. Raine Gabby Vida

  13. Attractive component to content. I just stumbled upon your weblog and
    in accession capital to claim that I get in fact enjoyed account your weblog posts.

    Anyway I’ll be subscribing to your augment and even I success you get admission to constantly rapidly.

  14. Thanks for finally talking about > OpenGL и C++ Builder — О программировании < Liked it!

  15. This piece of writing is truly a fastidious one it helps new
    the web visitors, who are wishing in favor of blogging.

  16. Thanks in support of sharing such a nice thinking, article is pleasant, thats why i have read it completely

  17. After exploring a handful of the blog articles on your site, I truly
    appreciate your way of writing a blog. I saved as a favorite it to my
    bookmark site list and will be checking back in the near future.
    Please check out my website as well and let me know
    how you feel.

    my website; CBD gummies for sleep

  18. When I originally left a comment I appear to have clicked the -Notify me when new comments are
    added- checkbox and now each time a comment is added I receive 4 emails with the same comment.
    Is there an easy method you can remove me from that service?
    Thank you!

    1. Sorry! It is spammers deals. Будем стараться их победить!

  19. You can definitely see your skills in the article you write.

    The arena hopes for more passionate writers like you who are not afraid to mention how they believe.
    At all times follow your heart.

  20. Progi.pro – один из крупнейших сервисов вопросов и ответов по программированию. У нас вы можете найти вопросы по языкам программирования Javascript, PHP, Java, C#, Python и многим другим.

  21. Hey! This is my 1st comment here so I just wanted to give a quick shout out
    and tell you I truly enjoy reading your articles. Can you suggest any other blogs/websites/forums that cover the same subjects?
    Many thanks!

  22. Компьютерная документация от А до Я — C++ Builder :: Основы программирования OpenGL в Borland С++Builder и Delphi Я рассчитываю на то, что вы знакомы с азами создания приложений в С++Builder или Delphi и совсем не знаете OpenGL.

  23. I think the admin of this website is truly working hard in favor
    of his site, because here every stuff is quality based stuff.

  24. Does your website have a contact page? I’m
    having a tough time locating it but, I’d like to shoot you an email.
    I’ve got some ideas for your blog you might be interested
    in hearing. Either way, great site and I look forward
    to seeing it grow over time.

  25. I think the admin of this website is in fact working hard
    in support of his web site, because here every data is quality based information.

  26. I am sure this post has touched all the internet viewers,
    its really really fastidious article on building up
    new website.

  27. I blog frequently and I seriously thank you for your content.
    This great article has truly peaked my interest.

    I will bookmark your website and keep checking for new information about once a week.

    I subscribed to your RSS feed as well.

  28. Thank you for this beautiful article. It’s really a good article

  29. The article is really excellent. Every time I read it, I get information again.
    The best article I’ve read in a long time….

  30. Hello there! This article couldn’t be written much better!
    Looking through this article reminds me of my previous roommate!
    He always kept preaching about this. I’ll forward this post to him.
    Pretty sure he will have a very good read. Thank you for sharing!

  31. Спасибо, автор.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *