Работа с простой графикой и OpenGL. Delphi (Lazarus)
Скачать 0.56 Mb.
|
Подключение и работа с OpenGL в Lazarus под Windows23. Апрель 2014 - 18:29 | admin Среда программирования: Delphi (Lazarus) OpenGL (Open Graphics Library — открытая графическая библиотека) — спецификация, определяющая независимый от языка программирования кросс-платформенный программный интерфейс для написания приложений, использующих двумерную и трёхмерную компьютерную графику. Включает более 250 функций для рисования сложных трёхмерных сцен из простых примитивов. Используется при создании компьютерных игр, САПР, виртуальной реальности, визуализации в научных исследованиях. На платформе Windows конкурирует с Direct3D. Основные возможности OpenGL Что предоставляет библиотека в распоряжение программиста? Основные возможности:
Дополнительные библиотеки Для OpenGL существуют так называемые вспомогательные библиотеки. Первая из этих библиотек называется GLU. Эта библиотека уже стала стандартом и поставляется вместе с главной библиотекой OpenGL. В состав этой библиотеки вошли более сложные функции, например для того чтобы определить цилиндр или диск потребуется всего одна команда. Также в библиотеку вошли функции для работы со сплайнами, реализованы дополнительные операции над матрицами и дополнительные виды проекций. Следующая библиотека, также широко используемая - это GLUT. Это также независимая от платформы библиотека. Она реализует не только дополнительные функции OpenGL, но и предоставляет функции для работы с окнами, клавиатурой и мышкой. Для того чтобы работать с OpenGL в конкретной операционной системе (например Windows или X Windows), надо провести некоторую предварительную настройку и эта предварительная настройка зависит от конкретной операционной системы. С библиотекой GLUT всё намного упрощается, буквально несколькими командами можно определить окно, в котором будет работать OpenGL, определить прерывание от клавиатуры или мышки и всё это не будет зависеть от операционной системы. Библиотека предоставляет также некоторые функции, с помощью которых можно определять некоторые сложные фигуры, такие как конусы, тетраэдры, и даже можно с помощью одной команды определить чайник! Есть ещё одна библиотека похожая на GLUT, называется она GLAUX. Это библиотека разработана фирмой Microsoft для операционной системы Windows. Она во многом схожа с библиотекой GLUT, но немного отстаёт от неё по своим возможностям. И ещё один недостаток заключается в том, что библиотека GLAUX предназначена только для Windows, в то время как GLUT поддерживает очень много операционных систем. Синтаксис команд type glCommand_name[1 2 3 4][b s i f d ub us ui][v] (type1 arg1,…,typeN argN) Таким образом, имя состоит из нескольких частей: Gl это имя библиотеки, в которой описана эта функция: для базовых функций OpenGL, функций из библиотек GLU, GLUT, GLAUX это gl, glu, glut, glaux соответственно Command_name - имя команды [1 2 3 4] – число аргументов команды [b s i f d ub us ui] – тип аргумента: b - GLbyte байт, s - GLshort короткое целое, i - GLint целое, f - GLfloat дробное, d - GLdouble дробное с двойной точностью, ub - GLubyte беззнаковый байт, us - GLushort беззнаковое короткое целое, ui - GLuint беззнаковое целое. Полный список типов и их описание можно посмотреть в файле gl.h. [v] – наличие этого символа показывает, что в качестве параметров функции используется указатель на массив значений. Рисование геометрических объектов Очистка окна. glClearColor (clampf r, clampf g, clampf b, clampf a) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) Вершины и примитивы Вершина является атомарным графическим примитивом OpenGL и определяет точку, конец отрезка, угол многоугольника и т.д. Все остальные примитивы формируются с помощью задания вершин, входящих в данный примитив. Например, отрезок определяется двумя вершинами, являющимися концами отрезка. С каждой вершиной ассоциируются ее атрибуты. В число основных атрибутов входят положение вершины в пространстве, цвет вершины и вектор нормали. Положение вершины в пространстве Положение вершины определяются заданием ее координат в двух-, трех-, или четырехмерном пространстве (однородные координаты). Это реализуется с помощью нескольких вариантов команды glVertex*: void glVertex[2 3 4][s i f d] (type coords) void glVertex[2 3 4][s i f d]v (type *coords) Каждая команда задает четыре координаты вершины: x, y, z, w. Команда glVertex2* получает значения x и y. Координата z в таком случае устанавливается по умолчанию равной 0, координата w – равной 1. Vertex3* получает координаты x, y, z и заносит в координату w значение 1. Vertex4* позволяет задать все четыре координаты. Для ассоциации с вершинами цветов, нормалей и текстурных координат используются текущие значения соответствующих данных, что отвечает организации OpenGL как конечного автомата. Эти значения могут быть изменены в любой момент с помощью вызова соответствующих команд. Цвет вершины Для задания текущего цвета вершины используются команды : void glColor[3 4][b s i f] (GLtype components) void glColor[3 4][b s i f]v (GLtype components) Первые три параметра задают R, G, B компоненты цвета, а последний параметр определяет коэффициент непрозрачности (так называемая альфа-компонента). Если в названии команды указан тип ‘f’ (float), то значения всех параметров должны принадлежать отрезку [0,1], при этом по умолчанию значение альфа-компоненты устанавливается равным 1.0, что соответствует полной непрозрачности. Тип ‘ub’ (unsigned byte) подразумевает, что значения должны лежать в отрезке [0,255]. Вершинам можно назначать различные цвета, и, если включен соответствующий режим, то будет проводиться линейная интерполяция цветов по поверхности примитива. Для управления режимом интерполяции используется команда void glShadeModel (GLenum mode) вызов которой с параметром GL_SMOOTH включает интерполяцию (установка по умолчанию), а с GL_FLAT – отключает. Нормаль Определить нормаль в вершине можно, используя команды void glNormal3[b s i f d] (type coords) void glNormal3[b s i f d]v (type coords) Для правильного расчета освещения необходимо, чтобы вектор нормали имел единичную длину. Командой glEnable(GL_NORMALIZE) можно включить специальный режим, при котором задаваемые нормали будут нормироваться автоматически. Режим автоматической нормализации должен быть включен, если приложение использует модельные преобразования растяжения/сжатия, так как в этом случае длина нормалей изменяется при умножении на модельно-видовую матрицу. Однако применение этого режима уменьшает скорость работы механизма визуализации OpenGL, так как нормализация векторов имеет заметную вычислительную сложность (взятие квадратного корня и т.п.). Поэтому лучше сразу задавать единичные нормали. Отметим, что команды void glEnable (GLenum mode) void glDisable (GLenum mode) производят включение и отключение того или иного режима работы конвейера OpenGL. Эти команды применяются достаточно часто, и их возможные параметры будут рассматриваться в каждом конкретном случае. Операторные скобки glBegin / glEnd Мы рассмотрели задание атрибутов одной вершины. Однако, чтобы задать атрибуты графического примитива, одних координат вершин недостаточно. Эти вершины надо объединить в одно целое, определив необходимые свойства. Для этого в OpenGL используются так называемые операторные скобки, являющиеся вызовами специальных команд OpenGL Определение примитива или последовательности примитивов происходит между вызовами команд void glBegin (GLenum mode); void glEnd (void); Параметр mode определяет тип примитива, который задается внутри и может принимать следующие значения: GL_POINTS каждая вершина задает координаты некоторой точки.
Например, чтобы нарисовать треугольник с разными цветами в вершинах, достаточно написать: glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); glVertex3f(0.0, 0.0, 0.0); glColor3ub(0,255,0); glVertex3f(1.0, 0.0, 0.0); glColor3fv(BlueCol); glVertex3f(1.0, 1.0, 0.0); glEnd(); Установка пакета получения контекста устройства в Lazarus Как и в любой среде программирования, для того чтобы начать работать с графикой, необходимо получить контекст устройства и связать его с контекстом воспроизведения библиотеки OpenGL. В Lazarus этот процесс осуществляется довольно просто, за счет использования встроенной библиотеки OpenGLContext с готовым компонентом TOpenGLControl. Однако компонент TOpenGLControl, по — умолчанию, не установлен в среде Lazarus, поэтому необходимо установить данный компонент. Выберите пункт меню "Пакет -> Установить/Удалить пакеты" (Package -> Install/Uninstall Packages), откроется окно установки новых пакетов в среду Lazarus. В окне установки новых пакетов, в списке неустановленных пакетов, необходимо найти пакет с именем lazopenglcontext 0.0.1, выбрать его и нажать кнопку "Установить выбранное" (Install selection). После этого необходимо нажать кнопку "Сохранить и перезапустить IDE" (Save and Rebuild IDE), для пересборки Lazarus уже с компонентом TOpenGLControl. В окне подтверждения установки нового пакета, нажмите кнопку "Продолжить" (Continue). Если все проделано верно, то в панели инструментов появится вкладка OpenGl с компонентом TOpenGLControl. Можно начинать работать с библиотекой. Простейшая программа на OpenGL в Lazarus Расположите на форме два компонента Panel1: TPanel Button1: TButton пропишите следующий код на события OnCreate и ButtonClick unit Unit1; {$mode objfpc}{$H+} interface // Подключениебиблиотек. Дляработы C OpenGL необходимы OpenGLContext, GL, GLU uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, OpenGLContext, GL, GLU; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Panel1: TPanel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { private declarations } public { public declarations } OpenGLControl1: TOpenGLControl; // Контекствоспроизведения OpenGL end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin // Создание контекста воспроизведения OpenGL и привязка его к панели на форме OpenGLControl1:=TOpenGLControl.Create(Self); with OpenGLControl1 do begin Name:='OpenGLControl1'; Align:=alClient; Parent:=Panel1; end; end; procedure TForm1.Button1Click(Sender: TObject); begin glClearColor (0, 0, 0, 0); // цветфона glClear (GL_COLOR_BUFFER_BIT); // очисткабуферацвета glMatrixMode(GL_MODELVIEW); // Выборвидовойматрицы glLoadIdentity(); // Установка в единичные значения glOrtho(0, 1, 0, 1, -1 ,1); // Установка проекции окна //glTranslatef(0.5,0.5,0); // Сдвиг //glRotatef(10, 0, 0, 0); // Вращение glBegin(GL_TRIANGLES); // Рисование треугольника glColor3f(1.0,0.0,0.0); // Красный glVertex3f(1,0,0 ); // Верх треугольника (Передняя) glColor3f(0.0,1,0.0); glVertex3f( 0,1,0); glColor3f(0,0,1); glVertex3f( 0,0,0); glEnd; OpenGLControl1.SwapBuffers; // Отрисовкаизбуффера end; end. |