четверг, 29 августа 2013 г.

Lazarus World. Используем компонент TOpenGLControl при работе с OpenGL


Для создания проекта используется Lazarus 1.0.8 и Fedora 19 Linux.

Компонент TOpenGLControl, по — умолчанию, не установлен в среде Lazarus, поэтому нам с вами предстоит установить данный компонент. Выберите пункт меню Package > Install / Uninstall Packages, откроется окно установки новых пакетов в среду Lazarus (Смотрите рисунок 1).

Рисунок 1. Установка нового пакета
  
В окне установки новых пакетов, в списке неустановленных пакетов, необходимо найти пакет с именем lazopenglcontext 0.0.1, выбрать его и нажать кнопку Install selection. После этого необходимо нажать кнопку Save and Rebuild IDE, для пересборки Lazarus уже с компонентом TOpenGLControl. В окне подтверждения установки нового пакета, нажмите кнопку Continue.
Теперь, если посмотреть на ленту компонентов, то вы увидите новую секцию OpenGL c TOpenGLControl компонентом на ней.

Теперь создадим новый проект. Для это выберите пункт меню File > New, в окне создания нового проекта выберите раздел Project >Application и нажмите кнопку Ok. Сохраните проект в каталог /home/[имя пользователя]/Projects/lazarus/ogl_p2 и присвойте имя проекту ogl_p2.lpi, а модулю формы ogl_p2_unit1.pas, для этого выберите пункт меню File > Save As.

В инспекторе объектов нам необходимо присвоить имя форме, в поле Name напишем имя формы ogl_form1. Дальше нам необходимо вытащить на форму компонент TOpenGLControl. Имя компонента будет OpenGLControl1. Теперь нам необходимо для нашей формы написать код обработчика события OnCreate, для этого в (Object Inspector) инспекторе объекта выберите нашу форму с именем ogl_form1 и перейдите с вкладки (Properties) Свойства на вкладку (Events) Событий, найдите в списке событий, событие OnCreate и выберите кнопку с тремя точками напротив. Ваш обработчик должен выглядеть как показано ниже:

procedure Togl_form1.FormCreate(Sender: TObject);
begin

Application.OnIdle := @IdleFunc;

end;

Давайте рассмотрим код обработчика события OnCreate формы с именем ogl_form1.Первой строчкой мы определим процедуру, которая вызывается когда в приложение ничего не происходит, данная функция называется IdleFunc:

Application.OnIdle := @IdleFunc;

В модуле формы ogl_p2_unit1.pas в секцию uses нам необходимо добавить OpenGL модуль с именем gl.

В глобальной секции переменных var в модуле формы ogl_p2_unit1.pas, после строчки:

var
ogl_form1: Togl_form1;

нам необходимо определить три переменные, две из которых нужно принять как должное, для того чтобы при изменение размеров окна OpenGL — анимация не изменяла скорость:

timer: single;
LastMsecs: integer;
и третья переменная, задает угол на который поворачивается объект каждый раз:

rrx: single;

Создадим обработчик формы для события изменения размеров формы. Для этого нам необходимо в (Object Inspector) инспекторе объектов перейти на вкладку событий формы и нажать на кнопку с тремя точками напротив события OnResize и в обработчике события написать следующий код:

procedure Togl_form1.FormResize(Sender: TObject);
begin
OpenGLControl1.SetBounds(0, 0, Width, Height);
end;

Строчкой OpenGLControl1.SetBounds(0, 0, Width, Height); мы устанавливаем границы компонента OpenGLControl1 при изменение размеров формы, т.е. компонент OpenGLControl1 будет растянут на всю форму.

Теперь взглянем на код процедуры, которая выполняется каждый раз когда в программе ничего не происходит:

procedure Togl_form1.IdleFunc(Sender: TObject; var Done: Boolean);
begin
OpenGLControl1.Invalidate;
end;

Если приложение ничего не делает, то область вывода OpenGL графики компонента OpenGLControl1 объявляется не действительной, тем самым заставляет перерисовать область вывода графики компонента OpenGLControl1, т.е. вызывается процедура — обработчик события OnPaint компонента OpenGLControl1.

В классе формы нам понадобится объявить процедуру IdleFunc.

Рассмотрим обработчик события OnPaint компонента OpenGLControl1. Для начала нужно создать данную процедуру — обработчик. В инспекторе объектов выберите компонент OpenGLControl1 и перейдите на вкладку событий. Найдите событие OnPaint и нажмите на кнопку с тремя кнопками напротив.

procedure Togl_form1.OpenGLControl1Paint(Sender: TObject);
var
CurTime: TDateTime;
MSecs: integer;
begin

CurTime:=Now;

MSecs:=round(CurTime*86400*1000) mod 1000;

if MSecs<0 then MSecs:=1000+MSecs;
timer:=msecs-LastMsecs;

if timer<0 then timer:=1000+timer;
LastMsecs:=MSecs;

glClearColor(0.0, 0.0, 0.0, 0.0);

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glLoadIdentity ();
glFrustum (-1, 1, -1, 1, 4.5, 10);
glTranslatef(0.0, 0.0, -5.0);

rrx:=rrx-0.6*(timer/10);
glRotatef(rrx,0.0,1.0,0.0);

glBegin(GL_QUADS);

glColor3f( 1.0, 1.0, 0.0);

glVertex3f(-0.5, 0.5, 0.0);
glVertex3f( 0.5, 0.5, 0.0);
glVertex3f( 0.5,-0.5, 0.0);
glVertex3f(-0.5,-0.5, 0.0);

glEnd();

OpenGLControl1.SwapBuffers;
end;

1) Объявляем локальные переменные, которые будут использоваться в процедуре, секция var:
var
CurTime: TDateTime;
MSecs: integer;

2) Расчет времени используемое для вращение OpenGL объекта:

CurTime:=Now;

MSecs:=round(CurTime*86400*1000) mod 1000;

if MSecs<0 then MSecs:=1000+MSecs;
timer:=msecs-LastMsecs;

if timer<0 then timer:=1000+timer;
LastMsecs:=MSecs;

3) Инициализация сцены и настройка обзора сцены:

glClearColor(0.0, 0.0, 0.0, 0.0);

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glLoadIdentity ();
glFrustum (-1, 1, -1, 1, 4.5, 10);
glTranslatef(0.0, 0.0, -5.0);

4) Вращаем объект на значение rrx с учетом времени.

rrx:=rrx-0.6*(timer/10);
glRotatef(rrx,0.0,1.0,0.0);

5) Формируем квадрат желтого цвета:

glBegin(GL_QUADS);

glColor3f( 1.0, 1.0, 0.0);

glVertex3f(-0.5, 0.5, 0.0);
glVertex3f( 0.5, 0.5, 0.0);
glVertex3f( 0.5,-0.5, 0.0);
glVertex3f(-0.5,-0.5, 0.0);

glEnd();

6) Отображаем содержимое буфера на экран:

OpenGLControl1.SwapBuffers;

И последнее, что нам осталось сделать, это написать обработчик события OnResize для компонента OpenGLControl1, в котором мы будем подгонять размер OpenGL сцены под размер компонента OpenGLControl1. Опять выбираем, в инспекторе объектов, компонент OpenGLControl1, переходим на вкладку события и находим событие OnResize. Нажимаем кнопку с тремя точками напротив этого события. Код обработчика показан ниже:

procedure Togl_form1.OpenGLControl1Resize(Sender: TObject);
begin
glViewport (0, 0, OpenGLControl1.Width, OpenGLControl1.Height);
end;

Теперь взглянем на снимок нашего приложения в действие (Смотрите рисунок 2).

 
Рисунок 2. Результат работы программы

Код программы:
unit ogl_p2_unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, OpenGLContext, Forms, Controls
  Graphics, Dialogs, gl;

type

  { Togl_form1 }

  Togl_form1 = class(TForm)
    OpenGLControl1: TOpenGLControl;
    procedure FormCreate(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure OpenGLControl1Paint(Sender: TObject);
    procedure OpenGLControl1Resize(Sender: TObject);
    procedure IdleFunc(Sender: TObject; var Done: Boolean);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  ogl_form1: Togl_form1;
  timer: single;
  LastMsecs: integer;
  rrx: single;

implementation

{$R *.lfm}

{ Togl_form1 }

procedure Togl_form1.OpenGLControl1Paint(Sender: TObject);
var
  CurTime: TDateTime;
  MSecs: integer;
begin

  CurTime:=Now;

  MSecs:=round(CurTime*86400*1000) mod 1000;

  if MSecs<0 then MSecs:=1000+MSecs;
        timer:=msecs-LastMsecs;

  if timer<0 then timer:=1000+timer;
        LastMsecs:=MSecs;

  glClearColor(0.0, 0.0, 0.0, 0.0);

  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

  glLoadIdentity ();
  glFrustum (-1, 1, -1, 1, 4.5, 10);
  glTranslatef(0.0, 0.0, -5.0);

  rrx:=rrx-0.6*(timer/10);

  glRotatef(rrx,0.0,1.0,0.0);

  glBegin(GL_QUADS);

  glColor3f( 1.0, 1.0, 0.0);

  glVertex3f(-0.5, 0.5, 0.0);
  glVertex3f( 0.5, 0.5, 0.0);
  glVertex3f( 0.5,-0.5, 0.0);
  glVertex3f(-0.5,-0.5, 0.0);

  glEnd();

  OpenGLControl1.SwapBuffers;
end;

procedure Togl_form1.OpenGLControl1Resize(Sender: TObject);
begin
 glViewport (0, 0, OpenGLControl1.Width, OpenGLControl1.Height);
end;

procedure Togl_form1.FormCreate(Sender: TObject);
begin
    Application.OnIdle := @IdleFunc;
end;

procedure Togl_form1.FormResize(Sender: TObject);
begin
     OpenGLControl1.SetBounds(0, 0, Width, Height);
end;

procedure Togl_form1.IdleFunc(Sender: TObject; var Done: Boolean);
begin
    OpenGLControl1.Invalidate;
end;

end.


syntax highlighted by Code2HTML, v. 0.9.1

воскресенье, 4 августа 2013 г.

Lazarus World. Создание окна при помощи библиотеки GLUT. Куб на OpenGL


Внимание! Данный пример основан на следующих статьях и примерах из сети Интернет:

1) Статья с сайта LinuxFocus.org — Программирование GLUT: окна и анимация, автор Miguel Angel Sepulveda.
2) Пример куба с сайта с примерами по OpenGL.
3) И статья в wiki на сайте freepascal.org - OpenGL Tutorial

Ну и конечно же, для создания проекта использовалась среда Lazarus 1.0.8 и дистрибутив Fedora 19 Linux.


В данном посте, на примере, показывается использование OpenGL в Lazarus.

Для начала нам необходимо инициализировать OpenGL. Создадим новый проект Lazarus. Выбираем пункт меню File > New, откроется окно выбора нового шаблона. Нам нужен шаблон, который находится в разделе Project > Program и нажимаем кнопку Ok, чтобы подтвердить выбор (Смотрите рисунок 1).

Рисунок 1. Окно выбора нового шаблона проекта


Сохраним проект под именем ogl_p1.lpr. Выбираем пункт меню File > Save As и сохраняем в домашнюю директорию пользователя, в каталог по следующему пути ~/Projects/lazarus/ogl_p1/, где ~ (знак тильда) это домашний каталог пользователя.

Теперь в редакторе исходного кода убираем весь код кроме следующего:

program ogl_p1;

begin

end.

Добавим в наш исходный код секцию uses, в которой мы перечислим модули необходимые нам для работы с OpenGL. Первый модуль который мы должны добавить называется gl, это основной модуль OpenGL. Второй модуль называется glut, этот модуль позволяет создавать OpenGL окно. Таким образом, у нас вышла строчка:

uses gl, glut;

Ниже секции uses, определим переменные, константы и процедуры необходимые нам для создания проекта.

Секция var:

var
Cmd: array of PChar;
CmdCount: Integer;
ScreenWidth, ScreenHeight: Integer;

Здесь можно видеть переменную Cmd для хранения имен параметров командной строки, переменную CmdCount для хранения количества параметров командной строки, и две переменные ScreenWidth, ScreenHeight для хранения размеров экрана по ширине и высоте, соответственно.

Секция const:

const
AppWidth = 400;
AppHeight = 400;
Константы AppWidth и AppHeight содержат размер окна OpenGL.

Процедура DrawGLScene:

Данная процедура будет вызвана при рисование сцены в окне OpenGL. В данной процедуре мы очистим цветовой буфер и буфер глубины. Далее мы создаем шесть четырехсторонних полигона, каждый полигон состоит из четырех вершин. И после того как сцена нарисована мы переключаем буфер для её отображения.

procedure DrawGLScene; cdecl;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glBegin(GL_QUADS);
glNormal3f( 0.0, 0.0, 1.0);
glVertex3f( 0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5);
glVertex3f(-0.5,-0.5, 0.5); glVertex3f( 0.5,-0.5, 0.5);

glNormal3f( 0.0, 0.0,-1.0);
glVertex3f(-0.5,-0.5,-0.5); glVertex3f(-0.5, 0.5,-0.5);
glVertex3f( 0.5, 0.5,-0.5); glVertex3f( 0.5,-0.5,-0.5);

glNormal3f( 0.0, 1.0, 0.0);
glVertex3f( 0.5, 0.5, 0.5); glVertex3f( 0.5, 0.5,-0.5);
glVertex3f(-0.5, 0.5,-0.5); glVertex3f(-0.5, 0.5, 0.5);

glNormal3f( 0.0,-1.0, 0.0);
glVertex3f(-0.5,-0.5,-0.5); glVertex3f( 0.5,-0.5,-0.5);
glVertex3f( 0.5,-0.5, 0.5); glVertex3f(-0.5,-0.5, 0.5);

glNormal3f( 1.0, 0.0, 0.0);
glVertex3f( 0.5, 0.5, 0.5); glVertex3f( 0.5,-0.5, 0.5);
glVertex3f( 0.5,-0.5,-0.5); glVertex3f( 0.5, 0.5,-0.5);

glNormal3f(-1.0, 0.0, 0.0);
glVertex3f(-0.5,-0.5,-0.5); glVertex3f(-0.5,-0.5, 0.5);
glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5,-0.5);
glEnd();

glutSwapBuffers;
end;

Процедура ReSizeGLScene:

Данная процедура вызывается каждый раз когда изменяются размеры окна. В данной процедуре мы перестраиваем сцену под измененный размер окна.

procedure ReSizeGLScene(Width, Height: Integer); cdecl;
begin
glViewport(0, 0, Width, Height);
end;

Процедура GLKeyboard:

Вызывается каждый раз при нажатие на любую клавишу клавиатуры. В данном случае проверяется нажата ли клавиша Esc, код которой 27, если нажата, то программа завершает свою работу.

procedure GLKeyboard(Key: Byte; X, Y: Longint); cdecl;
begin
if Key = 27 then
Halt(0);
end;

Процедура InitializeGL:
В данном проекте используется для начальной инициализации сцены OpenGL. В данном случае здесь устанавливается точка обзора сцены, подключается световой источник.

procedure InitializeGL;
begin
glMatrixMode(GL_PROJECTION);
glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0);

glMatrixMode(GL_MODELVIEW);
glTranslatef(0.0, 0.0, -2.0);

glRotatef(30.0, 1.0, 0.0, 0.0);
glRotatef(30.0, 0.0, 1.0, 0.0);

glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
end;

Теперь перейдем к описанию кода внутри главных операторных скобок.

Сначала мы присвоим переменной CmdCount значение 1, оно говорит о том что программа будет иметь один параметр командной строки. Далее мы устанавливаем длину массива Cmd на хранения одной строки SetLength(Cmd, CmdCount), это строка является параметром, который содержит имя программы. Заносим в массив Cmd единственный параметр имя программы Cmd[CmdCount-1] := Pchar(ParamStr(CmdCount-1)):

CmdCount := 1;
SetLength(Cmd, CmdCount);
Cmd[CmdCount-1] := PChar(ParamStr(CmdCount-1));

Проведем инициализацию GLUT.

glutInit(@CmdCount, @Cmd);

Выбор режима, двойной буфер, RGB палитра и буфер глубины

glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH);

Задаем размер окна OpenGL и позицию окна на экране.
glutInitWindowSize(AppWidth, AppHeight);

ScreenWidth := glutGet(GLUT_SCREEN_WIDTH);
ScreenHeight := glutGet(GLUT_SCREEN_HEIGHT);

glutInitWindowPosition((ScreenWidth - AppWidth) div 2,
(ScreenHeight - AppHeight) div 2);

Создаем окно с заголовком ogl_p1:

glutCreateWindow('ogl_p1');

Инициализация сцены:

InitializeGL;

Регистрация вызываемых процедур:
glutDisplayFunc(@DrawGLScene);
glutReshapeFunc(@ReSizeGLScene);
glutKeyboardFunc(@GLKeyboard);

Запуск механизма обработки событий:
glutMainLoop;

На рисунке 2 показан результат работы программы.

Рисунок 2. Результат запуска приложения


Ниже показан весь код проекта:

program ogl_p1;

uses gl, glut;

var
  Cmd: array of PChar;
  CmdCount: Integer;
  ScreenWidth, ScreenHeight: Integer;

const
  AppWidth = 400;
  AppHeight = 400;

procedure DrawGLScene; cdecl;
begin
     glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

     glBegin(GL_QUADS);
     glNormal3f( 0.0, 0.0, 1.0);
     glVertex3f( 0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5);
     glVertex3f(-0.5,-0.5, 0.5); glVertex3f( 0.5,-0.5, 0.5);

     glNormal3f( 0.0, 0.0,-1.0);
     glVertex3f(-0.5,-0.5,-0.5); glVertex3f(-0.5, 0.5,-0.5);
     glVertex3f( 0.5, 0.5,-0.5); glVertex3f( 0.5,-0.5,-0.5);

     glNormal3f( 0.0, 1.0, 0.0);
     glVertex3f( 0.5, 0.5, 0.5); glVertex3f( 0.5, 0.5,-0.5);
     glVertex3f(-0.5, 0.5,-0.5); glVertex3f(-0.5, 0.5, 0.5);

     glNormal3f( 0.0,-1.0, 0.0);
     glVertex3f(-0.5,-0.5,-0.5); glVertex3f( 0.5,-0.5,-0.5);
     glVertex3f( 0.5,-0.5, 0.5); glVertex3f(-0.5,-0.5, 0.5);

     glNormal3f( 1.0, 0.0, 0.0);
     glVertex3f( 0.5, 0.5, 0.5); glVertex3f( 0.5,-0.5, 0.5);
     glVertex3f( 0.5,-0.5,-0.5); glVertex3f( 0.5, 0.5,-0.5);

     glNormal3f(-1.0, 0.0, 0.0);
     glVertex3f(-0.5,-0.5,-0.5); glVertex3f(-0.5,-0.5, 0.5);
     glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5,-0.5);
     glEnd();

     glutSwapBuffers;
end;

procedure ReSizeGLScene(Width, Height: Integer); cdecl;
begin
  glViewport(0, 0, Width, Height);
end;

procedure GLKeyboard(Key: Byte; X, Y: Longint); cdecl;
begin
  if Key = 27 then
    Halt(0);
end;

procedure InitializeGL;
begin
  glMatrixMode(GL_PROJECTION);
  glFrustum(-0.5, 0.5, -0.5, 0.5, 1.0, 3.0);

  glMatrixMode(GL_MODELVIEW);
  glTranslatef(0.0, 0.0, -2.0);

  glRotatef(30.0, 1.0, 0.0, 0.0);
  glRotatef(30.0, 0.0, 1.0, 0.0);

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
end;

begin

CmdCount := 1;
SetLength(Cmd, CmdCount);
Cmd[CmdCount-1] := PChar(ParamStr(CmdCount-1));

glutInit(@CmdCount, @Cmd); 
glutInitDisplayMode(GLUT_DOUBLE or GLUT_RGB or GLUT_DEPTH); 
 
glutInitWindowSize(AppWidth, AppHeight);

ScreenWidth := glutGet(GLUT_SCREEN_WIDTH);
ScreenHeight := glutGet(GLUT_SCREEN_HEIGHT);

glutInitWindowPosition((ScreenWidth - AppWidth) div 2,
   (ScreenHeight - AppHeight) div 2);

glutCreateWindow('ogl_p1');

InitializeGL;

glutDisplayFunc(@DrawGLScene);
glutReshapeFunc(@ReSizeGLScene);
glutKeyboardFunc(@GLKeyboard);

glutMainLoop;

end.



syntax highlighted by Code2HTML, v. 0.9.1

пятница, 2 августа 2013 г.

Lazarus World. Инициализация ZenGL


Внимание! Используется Lazarus 1.0.8 под управлением Fedora 19 Linux.
В первую очередь нам необходимо скачать, и установить библиотеку ZenGL. Скачать библиотеку можно с официального сайта в разделе Download (http://zengl.org/download.html). На момент написания статьи доступна версия 0.3.11. Нам необходимо скачать файл zengl-src-[номер версии].7z. Распакуйте данный архив в удобное для вас место на жестком диске. Например, у меня это каталог /home/[имя пользователя]/lazarus/zengl/zengl-src-0.3.11. Давайте посмотрим на содержимое каталога zengl-src-0.3.11. Из всех каталогов, которые нас интересуют, это каталог extra – содержит дополнительные модули, headers – содержит заголовочные модули, lib – содержит объектные файлы различных библиотек, src – исходные файлы библиотеки ZenGL, которые мы будем подключать к нашему проекту.

Переходим к подключению библиотеки ZenGL к нашему проекту в среде Lazarus. В среде Lazarus создадим новый проект. Для этого выберем пункт меню File(Файл) -> New(Создать), откроется диалог создание нового проекта. В диалоге создания нового проекта выберите раздел Project(Проект) > Program(Программа) и нажмите кнопку Ok.

Сохраните проект, например в каталоге /home/[имя пользователя]/Projects/lazarus/zengl_p1. Для этого выберите пункт меню File(Файл) > Save As(Сохранить как). Присвойте проекту имя zengl_p1.lpi. Далее в свойствах проекта, пункт меню Project(Проект) > Project Options(Параметры проекта), выберите раздел Compiler Options(Параметры компилятора) > Paths(Пути). В поле Other unit files (-Fu)(Другие модули (-Fu)) нужно указать следующие пути до модулей ZenGL:

/home/[имя пользователя]/lazarus/zengl/zengl-src-0.3.11/headers/
/home/[имя пользователя]/lazarus/zengl/zengl-src-0.3.11/extra/
/home/[имя пользователя]/lazarus/zengl/zengl-src-0.3.11/src/
/home/[имя пользователя]/lazarus/zengl/zengl-src-0.3.11/lib/zlib/$(TargetCPU)-$(TargetOS)/
/home/[имя пользователя]/lazarus/zengl/zengl-src-0.3.11/lib/zip/$(TargetCPU)-$(TargetOS)/
/home/[имя пользователя]/lazarus/zengl/zengl-src-0.3.11/lib/theora/$(TargetCPU)-$(TargetOS)/
/home/[имя пользователя]/lazarus/zengl/zengl-src-0.3.11/lib/msvcrt/$(TargetCPU)/
/home/[имя пользователя]/lazarus/zengl/zengl-src-0.3.11/lib/jpeg/$(TargetCPU)-$(TargetOS)/
/home/[имя пользователя]/lazarus/zengl/zengl-src-0.3.11/lib/ogg/$(TargetCPU)-$(TargetOS)/
Рисунок 1. Подключение модулей
В поле Include files (-Fi)(Включаемые файлы (-Fi)) нужно указать следующие пути:
/home/[имя пользователя]/lazarus/zengl/zengl-src-0.3.11/headers/
Рисунок 2. Подключение заголовочных модулей
 
Теперь перейдем к написанию кода. В только что созданном новом проекте будет присутствовать начальный код, который надо очистить и оставить только следующий код:

program zengl_p1;
begin
end.
В коде, после названия программы, напишем секцию uses со следующими подключаемыми модулями:
uses zgl_main, zgl_screen, zgl_window, zgl_timers, zgl_utils;
Ниже секции uses напишем пять процедур – заглушек:
В данной процедуре пишется код, который выполнится после создания окна и создания контекста OpenGL
procedure Init;
begin
end;
Процедура, в которой выполняется прорисовка экрана на каждой итерации главного цикла
procedure Draw;
begin
end;
Процедура, которая выполняется каждый раз перед перерисовкой экрана на каждой итерации главного цикла.
procedure Update( dt: Double );
begin
end;
Процедура, которая выполняется каждый раз через установленный интервал времени. В данном случае, каждую секунду в заголовке окна будет меняться значение FPS.
procedure Timer;
begin
 wnd_SetCaption( '01 - Initialization[ FPS: ' + u_IntToStr( zgl_Get( RENDER_FPS ) ) + ' ]' );
end;
Процедура, которая выполняется перед очисткой ресурсов, уничтожения окна и контекста OpenGL
procedure Quit;
begin
end;
Внутри главных операторных скобок необходимо написать следующий код:
Установка процедуры таймера с именем Timer с интервалом 1000 миллисекунд
timer_Add( @Timer, 1000 );
Регистрация процедуры Init
zgl_Reg( SYS_LOAD, @Init );
Регистрация процедуры Draw
zgl_Reg( SYS_DRAW, @Draw );
Регистрация процедуры Update
zgl_Reg( SYS_UPDATE, @Update );
Регистрация процедуры Quit
zgl_Reg( SYS_EXIT, @Quit );
Первоначальное значение заголовка окна
wnd_SetCaption( '01 - Initialization' );
Отобразим курсор
wnd_ShowCursor( TRUE );
Установим опции окна
scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );
Инициализация библиотеки ZenGL
zgl_Init();
Ниже показан результат работы программы.
  Рисунок 3. Результат работы программы

Код полностью:
program zengl_p1;

uses   zgl_main, zgl_screen, zgl_window, zgl_timers, zgl_utils;

procedure Init;
begin

end;

procedure Draw;
begin

end;

procedure Update( dt: Double );
begin

end;

procedure Timer;
begin
     wnd_SetCaption( '01 - Initialization[ FPS: '
+ u_IntToStr( zgl_Get( RENDER_FPS ) ) + ' ]' );
end;

procedure Quit;
begin

end;

begin
  timer_Add( @Timer, 1000 );

  zgl_Reg( SYS_LOAD, @Init );
  zgl_Reg( SYS_DRAW, @Draw );
  zgl_Reg( SYS_UPDATE, @Update );
  zgl_Reg( SYS_EXIT, @Quit );
  wnd_SetCaption( '01 - Initialization' );
  wnd_ShowCursor( TRUE );
  scr_SetOptions( 800, 600, REFRESH_MAXIMUM, FALSE, FALSE );
  zgl_Init();
end.



syntax highlighted by Code2HTML, v. 0.9.1