OpenGL в Delphi

       

Минимальная программа OpenGL


Рассмотрев основные вопросы функционирования приложения и его взаимодействия с операционной системой, мы можем перейти к изучению собственно OpenGL. Заглянем в подкаталог Ex20, содержащий проект минимальной программы, использующей OpenGL B программе с помощью команд OpenGL окно формы окрашивается в голубоватый цвет Во-первых, обратите внимание на то, что список uses дополнен модулем OpenGL - это программист должен сделать сам Раздел private описания класса формы содержит строку

hrc: HGLRC; // ссылка на контекст воспроизведения

Смысл этой величины мы рассмотрели в предыдущем разделе. Обработчик события OnCreate формы содержит следующие строки:

SetDCPixelFormat(Canvas. Handle); //задаем формат пиксела
hrc: = wglCreateContext(Canvas. Handle); // создаем контекст воспроизведения

Первая строка - обращение к описанной в этом же модуле пользовательской процедуре, задающей формат пиксела

procedure SetDCPixelFormat (hdc: HDC);
var
pfd: TPixelFormatDescriptor;
nPixelFormat: Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
nPixelFormat: = ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;

По поводу формата пиксела мы подробнее поговорим в следующем разделе Во второй строке обработчика OnCreate, как ясно из комментария, задается величина типа HGLRC, т. e. создается контекст воспроизведения. Аргументом функции wglCreateContext является ссылка на контекст устройства, на который будет осуществляться вывод Сейчас устройством вывода служит окно формы Для получения этого контекста OpenGL необходима величина типа HDC Здесь, как и во многих других примерах, мы используем факт, что canvas. Handle и есть ссылка на контекст устройства, связанная с окном формы.
Поскольку это первая функция, имеющая непосредственно отношение к OpenGL, то я немного отвлекусь на некоторые общие пояснения Как уже говорилось, только начиная с пятой версии Delphi поставляется с системой помощи, удовлетворительно настроенной с точки зрения получения справок по командам OpenGL и функциям API, в предыдущих версиях ее вроде как и нет Однако на самом деле такая помощь доступна и в ранних версиях, и самый простой способ ее получения - контекстная подсказка По командам OpenGL справки мы будем получать точно так же, как и по функциям API, т. e если вам необходима более подробная информация, например, о функции wglcreateContext, то установите курсор на строку с этой функцией и нажмите клавишу <F1>.
Функция wgicreateContext физически размещается в файле opengl32 dll, а прототип ее находится в файле windows. pas В этот файл также помещены прототипы всех функций и процедур, имеющих отношение к реализации OpenGL под Windows, a прототипы собственно команд OpenGL расположены в файле opengl pas функции и процедуры, имеющие отношение только к Windows-версии OpenGL, обычно имеют приставку wgl, как, например, wglcreateContext, но могут и не иметь такой приставки, как, например, SwapBuffers. Собственно команды OpenGL имеют приставки gl или glu в зависимости от размещения в библиотеках opengl32. dll и glu32. dll, соответственно. Итак, контекст воспроизведения создан, и теперь можно осуществлять вывод командами OpenGL. Обработка события onpaint выглядит следующим образом:

wglMakeCurrent (Canvas. Handle, hrc); // установить контекст
glClearColor (0. 5, 0. 5, 0. 75, 1. 0); // цвет фона
glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета
wglMakeCurrent (0, 0); // освободить контекст

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

Замечание
Согласно справке, для освобождения контекста воспроизведения оба параметра должны быть установлены в NULL, но хотя компилятор и пропустит такие значения, во время выполнения получим ошибку "Invalid variant type conversion", так что будем всегда для освобождения контекста задавать эти значения нулевыми Обработка события onDestroy формы состоит из одной строки:

wglDeleteContext (hrc);

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

Замечание
Очень важно запомнить, что процедуры и функции, имена которых начинаются на gl или glu, т e команды OpenGL, имеют какой-либо результат только при установленном контексте воспроизведения

Вернемся к команде glclearcolor, определяющей цвет фона. У нее четыре аргумента, вещественные числа, первые три из которых задают долю красного, зеленого и синего в результирующем цвете. О четвертом аргументе мы поговорим в четвертой главе, здесь я его значение задал равным единице. Можете варьировать это значение произвольно, в данном примере это никак не скажется, так что пока можете просто не обращать внимания на этот аргумент. Согласно справке, все четыре аргумента функции glclearColor имеют тип GLclampf, соответствующий вещественным числам в пределах от нуля до единицы. О типах OpenGL подробнее поговорим ниже
Теперь обратитесь к проекту из подкаталога Ex21, представляющему собой еще один вариант минимальной программы Delphi, использующей OpenGL, но без VCL. Надеюсь, читатель, вы уже можете ориентироваться в таких программах. Отличие от предыдущего примера состоит в том, что приходится самому описывать все те действия, которые при обычном подходе выполняет за нас Delphi, т. e. в данном случае "вручную" создавать ссылку на контекст устройства, устанавливать, освобождать и удалять ее.
Если вы используете Delphi версии три или четыре, вы, возможно, столкнетесь с одной небольшой проблемой. Если запускать проекты, использующие OpenGL, под управлением среды Delphi, программа может случайным образом аварийно завершаться. Оборот "случайным образом" здесь я употребил постольку, поскольку один и тот же проект может привести к аварийному завершению, а может и работать вполне успешно.
Я сталкивался с этой проблемой на компьютерах с различной конфигурацией и с различными версиями операционной системы, и, по-видимому, она связана с некорректным взаимодействием среды Delphi c драйверами. Если подобная проблема возникла и у вас, я рекомендую просто не запускать под управлением среды проекты, использующие OpenGL, a запускать собственно откомпилированные модули. В пятой версии Delphi такая ситуация не возникала, так что, по-видимому, этот недостаток разработчиками выявлен и устранен.



Содержание раздела