OpenGL и Delphi на практике
Любая теория хороша, если она может быть реализована на Delphi
:-). Поэтому предлагаю не откладывая в долгий ящик
написать первую программу на OpenGL - а потом, окрылившись успехом,
вернуться к теории и как следует проштудировать все книги и сайты по
сабжу, чтобы уж стать настоящими монстрами трехмерного
моделирования.
Для начала придется проделать подготовительную работу:
- настроить формат пикселей с учетом отображаемой информации;
- создать контекст OpenGL и подготовить сам движок OpenGL к
работе.
Формат пикселей удобно вынести в отдельную процедуру, которую мы
оформим следующим образом: procedure SetDCPixelFormat (dc: HDC);
var pfd: TPixelFormatDescriptor;
nPixelFormat: Integer;
begin
FillChar (pfd, SizeOf (pfd),0);
with pfd do
begin
nSize:= sizeof (pfd);
nVersion:= 1;
dwFlags:= PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
iPixelType:= PFD_TYPE_RGBA;
cColorBits:= 16;
cDepthBits:= 64;
iLayerType:= PFD_MAIN_PLANE;
end;
nPixelFormat:=ChoosePixelFormat (DC,@pfd);
SetPixelFormat (DC, nPixelFormat,@pfd);
end;
Здесь при заполнении структуры
TPixelFormatDescriptor мы задаем параметры будущего графического
отображения, в том числе количество цветовых бит, а также тип
пикселей (iPixelType). Мы также задаем флаги, которые, как видно из
названия, указывают, что наша программа будет поддерживать OpenGL, а
также что мы будем рисовать в окне и использовать двойную
буферизацию (параметр, необходимый для воспроизведения движущихся
объектов).
Далее посредством вызова ChoosePixelFormat система
выбирает подходящий формат пикселя - и мы присваиваем его (через
SetPixelFormat) нашему окну.
Теперь нужно инициализировать контекст самого
OpenGL посредством функций, содержащихся в модуле Windows, и
произвести дополнительную настройку движка: procedure TForm1.FormCreate (Sender: TObject);
begin
H:=Handle;
DC:=GetDC (H);
SetDCPixelFormat (DC);
RC:=wglCreateContext (DC);
wglMakeCurrent (DC, RC);
glClearColor (0.6,0.6,0.6,1.0);
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum (-1,1,-1,1,2,20);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity;
glTranslatef (0.0,-1.0,-6.0);
BeginPaint;
end;
Как видим, сначала мы задали для нашей графики
необходимый формат пикселей. Теперь при помощи функции
wglCreateContext создаем OpenGL-контекст, а впоследствии делаем его
текущим контекстом. Далее, используя уже универсальные функции**, произведем настройку "мира",
который будем создавать. Для этого через glClearColor очистим
контекст и заполним ее 60-процентным черным цветом. Далее выберем
матрицу проекций, которая определяет, как будут проецироваться
трехмерные объекты на плоскость экрана (в оконные координаты) и
через glLoadIdentity установим единичную матрицу и зададим границы
плана в "мировых координатах" при помощи вызова glFrustum. После
чего загрузим модельно видовую матрицу и произведем ее смещение
(glTranslatef).
Что будем рисовать
Конечно, можно было нарисовать простую пирамиду или
же куб. Но мы сделаем большее - нарисуем "признание в любви"** (рис. 1). Специально для этого
методом "научного перебора" была разработана модель, описывающая
соответствующую кривую:
Остается только перевести ее с языка математики на
нормальный человеческий.
Прорисовка сцены
Подготовку сцены начнем с подключения разных
дополнительных функций, без которых дальнейшая работа невозможна.
Эти функции прописаны в методе BeginPaint, а также в методе
FormResize (чтобы при изменении размера формы соответственно менялся
размер объекта). Для этого используем функцию glEnable с
соответствующими параметрами.
Далее в FormPaint используем подготовленные заранее
методы DrawFace и DrawElement (см. листинг ниже) для отрисовки
упомянутого объекта. А для придания ему еще большей "жары"
используем возможности OpenGL по освещению сцены.
Итог
С точки зрения сложности освоения OpenGL сопоставим
с другими подобными библиотеками. Так что с одной стороны нет
разницы, в чем разбираться и что изучать. Но с точки зрения
разумного подхода любой проект трехмерной графики должен как минимум
поддерживать OpenGL в качестве одной из опций. Ведь серьезные вещи
считаются и визуализируются, как правило, под
Unix/IRIX/Linux/FreeBSD, и в то же время было бы неправильно
игнорировать пользователей Windows. Так что OpenGL как раз и
является тем универсальным языком и общим знаменателем, позволяющим
вашим приложениям свободно мигрировать с одной платформы на
другую. Листинг программы.
Автор: Валерий Васильевич Фаронов
Источник: www.comizdat.com
|