Використання OpenGL в проектах Delphi for. NET, Різне, Програмування, статті

Автор: Віталій Артемов, Королівство Delphi


Введення


Зайнявся розробкою майбутнього програми, програміст часто стикається з дилемою: чи використовувати в своєму додатку компоненти стороннього розробника або створювати власні? Відповідь на це питання неоднозначний, все залежить від конкретної ситуації. Однак неправильно стверджувати, що застосування вже готових рішень завжди краще роботи “з нуля”.


Серйозне програмне забезпечення відрізняється детально продуманим інтерфейсом, як для користувача (UI), так і на рівні програмного коду. Особливо гостро подібне питання виникає при організації графічного користувальницького інтерфейсу (GUI), коли необхідно використовувати високопродуктивні засоби візуалізації та графіки.


Якісна графіка значно покращує зовнішній вигляд і статус програми, однак її застосування вимагає від програміста особливих знань і навичок. Компоненти сторонніх розробників, на жаль, нерідко виявляються не тільки марними, але також серйозно перешкоджають виконанню роботи через необхідність освоєння і розуміння фундаментальних принципів і алгоритмів, на яких вони засновані, що в рамках комерційного проекту взагалі загрожує фатальними наслідками і неприпустимо в принципі. В цілому, рекомендувати використання професійних графічних компонентів можна лише в тому випадку, якщо програміст має достатню кваліфікацію і грунтовно володіє питаннями, розглянутими при їх створенні.


Коли мова заходить про написання нескладного додатки, в тому числі і початківцями програмістами, зовсім не обов’язково застосовувати об’ємні і громіздкі компоненти, багато з яких, навіть будучи безкоштовними, вимагають дотримання якихось особливих умов, наприклад, повідомлення про авторство коду, що, погодьтеся, не завжди доречно.


Протягом багатьох років OpenGL де-факто вважається одним із стандартів в галузі комп’ютерної графіки. Велике число додатків, що заслужили довіру користувачів по всьому світу, реалізують висновок графічної інформації саме цим програмним інструментом. Бібліотека OpenGL замислювалася і створювалася досить простий у застосуванні і одночасно ефективною, тому поряд з більш пізніми продуктами з тієї ж області вона продовжує застосовуватися в новому програмному забезпеченні.


Існує безліч компонентів для розробки додатків на основі OpenGL самих різних рівнів складності. Проте слід констатувати факт, що більшість з них написано з використанням таких мов програмування, як C, C #, Java, Visual Basic, Python. Компоненти на основі OpenGL з реалізацією під Delphi нечисленні, особливо в контексті оновленого пакету Delphi for. NET версій 8, 9, 2005, 2006, 2007, 2009 (далі – Delphi. NET).


Дана стаття націлена, в першу чергу, на початківців програмістів, що використовують Delphi. NET, які бажають застосовувати у своїх проектах графіком OpenGL. На жаль, дане питання дуже стисло висвітлюється в друкованих виданнях, не кращі справи і з мережею Інтернет. Питання програмістів із застосування OpenGL в новому середовищі розробки Delphi після її переходу на. NET Framework, які задавалися на різних форумах мережі, як правило, переадресовувалися відповідачами на сайти третіх сторін. Тому метою цієї роботи є опис основ застосування графічної бібліотеки OpenGL в проектах Delphi . NET. Розглянуто повністю працездатні демонстраційні програми Win32 з мінімальним обсягом вихідного коду.


Тип створюваного додатка


Підтримка нової технології. NET Framework більшістю сучасних мов програмування, в тому числі Delphi, змусила нас переглянути підходи до програмування. Можливо, автор висловить тут суб’єктивну точку зору, але бібліотека VCL, активно пропагується корпорацією Borland аж до 8 ї версії Delphi, не зовсім виправдала себе. Компоненти цієї бібліотеки, незважаючи на всі зусилля творців, не стали стандартом розробки додатків, причому код VCL, на думку багатьох кваліфікованих експертів, містить деякі неточності. Безумовно, поряд з цим потужна розгортається система. NET Framework несе в собі незрівнянно більший потенціал гнучкості, ефективності та налагодженості коду. Напевно, саме завдяки цьому компанії, що підтримують настільки розрізнені раніше об’єктно-орієнтовані мови, прийняли ідеологію Microsoft зі створення єдиного системного мови IL, попередню компіляцію в який можна здійснювати з будь-якого пакета розробки. Як неодноразово говорилося представниками Borland, бібліотека VCL. NET була реалізована в нових версіях Delphi як зручний засіб для перекладу проектів зі старих версій на проекти. NET.


Швидше за все, такий перехід, одночасно з освоєнням нового середовища розробки, займе у програмістів деякий час.


Базова структура бібліотеки OpenGL


Розглянемо структуру OpenGL.


Бібліотека фізично розміщується у файлі opengl32.dll, який поставляється разом з операційною системою Microsoft Windows і знаходиться в системній папці C :/ WINDOWS/SYSTEM32/opengl32.dll. У цьому файлі описані основні типи, процедури і функції OpenGL, з якими буде необхідно працювати з додатком. Крім цього, в комплекті поставляється компонент OpenGL Utility, розміщений у файлі C :/ WINDOWS/SYSTEM32/glu32.dll. Це набір утиліт (функцій) для виконання типових завдань OpenGL, також використовується в прикладній програмі. Програмісту рекомендується переглянути вміст системної папки C :/ WINDOWS/SYSTEM32 і переконатися в наявності цих двох файлів.


В деяких джерелах по OpenGL можна знайти посилання на бібліотеку GLUT [3, 5], що представляє собою набір інструментів, для роботи, наприклад, з вікнами, як основними елементами інтерфейсу для виведення графіки. Однак цей компонент не є стандартним, і його отримання можливо через мережу Інтернет.


У файлах opengl32.dll і glu32.dll описані функції для обміну інформацією між вашим додатком (клієнтом) і системою OpenGL (сервером). Додаток формує набір відповідних команд, повідомляючи системі OpenGL, яку графічну інформацію необхідно побудувати і яким способом, а OpenGL через операційну систему взаємодіє з апаратними засобами комп’ютера і робить висновок сформованої графічної інформації.


Гнучкість бібліотеки полягає в тому, що в ній немає прив’язки до платформи комп’ютера, немає також і описи конкретних графічних пристроїв або їх моделей. Бібліотека містить лише набір командних інструментів, які програміст безпосередньо використовує в своїй програмі, і виступає своєрідним “посередником” між додатком, операційною системою і кінцевим пристроєм відображення графіки.


Для коректного взаємодії з графічним пристроєм серверу OpenGL потрібна інформація, щонайменше, про два об’єкти – посилання на контекст пристрою і форматі пікселя.


Контекст пристрою, Device Context, є структурою, яка містить дані про графічних режимах і атрибутах конкретної системи. Ця структура стандартизована, що дозволяє через неї встановити необхідну для роботи OpenGL посилання на контекст відтворення, Rendering Context, яка вказує на засоби для відтворення графічної інформації.


Посиланням на контекст пристрою є величина типу HDC (Handle Device Context), а посиланням на контекст відтворення – HGLRC (Handle OpenGL Rendering Context).


Написання наступного параграфа обумовлено однією важливою причиною. Перехід на Delphi. NET дозволив програмістам створювати додатки Windows Forms, проте зникла можливість підключення модулів з попередніх версій Delphi, наприклад, модуля Windows.pas. Тому блоки коду, необхідні для організації роботи нашого додатки, нам доведеться реалізовувати заново, максимально використовуючи угоди середовища Delphi. NET.


OpenGL в проектах ранніх версій Delphi


Всі основні функції динамічної бібліотеки opengl.dll імпортуються в відповідному заголовному файлі OpenGL.pas, розташованому за замовчуванням в папці C :/ Program Files/Borland/Delphi6/Source/Rtl/Win/OpenGL.pas, якщо ви використовуєте Delphi 6.


Найчастіше приклади для Delphi, рекомендовані багатьма авторами по OpenGL, починаються наступним кодом:










unit SomeUnit;
uses SysUtils, Classes, Windows, OpenGL;
interface
implementation
end.


У цих прикладах пропонується використовувати стандартні модулі Delphi, а також модуль OpenGL.pas. Ми ж підемо іншим шляхом, і підготуємо власний заголовний файл з імпортуванням необхідних функцій безпосередньо з OpenGL. Автор цієї статті все ж рекомендує переглянути файл OpenGL.pas, з метою ознайомлення зі структурою бібліотеки в звичайному текстовому форматі.


Створимо новий проект Windows-програми з ім’ям MyApplicationOpenGL. Модуль головної форми назвемо UnitMainForm.pas, саму головну форму – FormGL (рис. 1).


Рис. 1. Модуль головної форми програми

Доповнимо проект новим модулем GLImports.pas, в якому будуть розміщені всі імпортовані з OpenGL функції і типи даних.


Бібліотека OpenGL оперує власними типами даних, точні аналоги яких не завжди знаходяться в інструментарії тієї мови, яка використовує програміст. Тому важливо поставити в чітку відповідність типам OpenGL типи використовуваної мови, в нашому випадку, Delphi.


Повний перелік типів даних OpenGL наведено в [1]. Для використання деяких з них в нашій програмі доповнимо модуль GLImports.pas секцією type:










unit GLImports;
interface
type
/ / Стандартні порядкові типи:
BOOL = System.LongBool;
DWORD = System.LongWord;
/ / Посилання на контекст пристрою:
HDC = type System.LongWord;
/ / Посилання на контекст відтворення:
HGLRC = type System.LongWord;
/ / Типи OpenGL в інтерпретації Delphi:
GLenum = System.Cardinal;
GLbyte = System.Shortint;
GLfloat = System.Single;
GLint = System.Integer;
GLsizei = System.Integer;
/ / Формат пікселя:
PPixelFormatDescriptor = ^TPixelFormatDescriptor;
TPixelFormatDescriptor = packed record
nSize: Word;
nVersion: Word;
dwFlags: DWORD;
iPixelType: Byte;
cColorBits: Byte;
cRedBits: Byte;
cRedShift: Byte;
cGreenBits: Byte;
cGreenShift: Byte;
cBlueBits: Byte;
cBlueShift: Byte;
cAlphaBits: Byte;
cAlphaShift: Byte;
cAccumBits: Byte;
cAccumRedBits: Byte;
cAccumGreenBits: Byte;
cAccumBlueBits: Byte;
cAccumAlphaBits: Byte;
cDepthBits: Byte;
cStencilBits: Byte;
cAuxBuffers: Byte;
iLayerType: Byte;
bReserved: Byte;
dwLayerMask: DWORD;
dwVisibleMask: DWORD;
dwDamageMask: DWORD;
end;
implementation
end.


Зверніть увагу, що імена деяких типів, фізично є прототипами стандартних типів Delphi, починаються з префікса GL.


Типи HDC і HGLRC, по суті, є аналогами стандартного типу THandle з модуля System.pas. Цей модуль автоматично підключається до проекту Delphi, і його явне оголошення необов’язково. Однак далі ми будемо використовувати технологію. NET Framework, згідно з якою рекомендовано явно вказувати простору імен (модулі), в тому числі системні.


У даному прикладі код частково запозичений з стандартного модуля Windows.pas. Нагадаємо, що графічна бібліотека OpenGL є платформонезалежних, тобто може відтворюватися на операційних системах, відмінних від Windows. Якщо детально переглянути заголовки Windows.pas, часто використовуваний в проектах Delphi, то можна виявити, що в ньому також містяться процедури і функції, пов’язані з OpenGL, але реалізуються в системі Windows (на це вказує префікс w_):











function wglCreateContext(DC: HDC): HGLRC;
function wglDeleteContext(p1: HGLRC): BOOL;
function wglMakeCurrent(DC: HDC; p2: HGLRC): BOOL;


Характерно, що програмісти з Borland внесли ці та інші функції в файл Windows.pas, а не в файл OpenGL.pas. Це пояснюється їх применимостью тільки в рамках операційної системи Windows, а їх призначення детально описано в [4]: ​​функції wglCreateContext і wglDeleteContext відповідно створюють і видаляють контекст відтворення OpenGL, а функція wglMakeCurrent встановлює поточний контекст.


Як уже зазначалося, система OpenGL зосереджена в файлах двох динамічно підключаються бібліотек opengl32.dll і glu32.dll, на які посилається додаток стандартним угодою про виклик stdcall. Якщо ви виявите в коді професійно написаних модулів директиви компілятора {$ EXTERNALSYM <ім'я функції>}, то це слід розуміти як організацію взаємодії з C + + Builder, яку ми розглядати не будемо.


Наша мінімальна програма OpenGL буде відтворювати на поверхні форми діагональну лінію червоного кольору. Для цього знадобиться ще кілька функцій і констант, безпосередньо відповідають за промальовування лінії, які детально описані в [1, 4, 5]:











procedure glBegin(mode: GLenum);
procedure glColor(red, green, blue: GLbyte);
procedure glEnd;
procedure glVertex2f(x, y: GLfloat);
procedure glViewport(x,y: GLint; width, height: GLsizei);


Операційна система здійснює низькорівневі графічні операції над елементами управління за допомогою власної графічної бібліотеки GDI, розташованої у файлі gdi32.dll. Щоб організувати взаємодію додатки з OpenGL, крім іншого необхідно коректно встановити так званий “формат пікселя”. Для цього в наш модуль GLImports.pas раніше був введений тип TPixelFormatDescriptor і відповідний йому покажчик PPixelFormatDescriptor. Тепер знадобляться дві функції, опис яких знаходиться все в тому ж модулі Windows.pas і доступно в довідковій системі Delphi, починаючи з версії 5:











function ChoosePixelFormat(DC: HDC; p2: PPixelFormatDescriptor): Integer;
function SetPixelFormat(DC: HDC; PixelFormat: Integer; FormatDef: PPixelFormatDescriptor): BOOL;


Остаточно модуль GLImports.pas буде мати вигляд:










unit GLImports;
interface
type
/ / Стандартні порядкові типи:
BOOL = System.LongBool;
DWORD = System.LongWord;
/ / Посилання на контекст пристрою:
HDC = type System.LongWord;
/ / Посилання на контекст відтворення:
HGLRC = type System.LongWord;
/ / Типи OpenGL в інтерпретації Delphi:
GLenum = System.Cardinal;
GLbyte = System.Shortint;
GLfloat = System.Single;
GLint = System.Integer;
GLsizei = System.Integer;
/ / Формат пікселя:
PPixelFormatDescriptor = ^TPixelFormatDescriptor;
TPixelFormatDescriptor = packed record
nSize: Word;
nVersion: Word;
dwFlags: DWORD;
iPixelType: Byte;
cColorBits: Byte;
cRedBits: Byte;
cRedShift: Byte;
cGreenBits: Byte;
cGreenShift: Byte;
cBlueBits: Byte;
cBlueShift: Byte;
cAlphaBits: Byte;
cAlphaShift: Byte;
cAccumBits: Byte;
cAccumRedBits: Byte;
cAccumGreenBits: Byte;
cAccumBlueBits: Byte;
cAccumAlphaBits: Byte;
cDepthBits: Byte;
cStencilBits: Byte;
cAuxBuffers: Byte;
iLayerType: Byte;
bReserved: Byte;
dwLayerMask: DWORD;
dwVisibleMask: DWORD;
dwDamageMask: DWORD;
end;
{ OpenGL }
function wglCreateContext(DC: HDC): HGLRC; stdcall;
function wglDeleteContext(p1: HGLRC): BOOL; stdcall;
function wglMakeCurrent(DC: HDC; p2: HGLRC): BOOL; stdcall;
procedure glBegin(mode: GLenum); stdcall;
procedure glColor(red, green, blue: GLbyte); stdcall;
procedure glEnd; stdcall;
procedure glVertex2f(x, y: GLfloat); stdcall;
procedure glViewport(x, y: GLint; width, height: GLsizei); stdcall;
{ GDI }
function ChoosePixelFormat(DC: HDC; p2: PPixelFormatDescriptor): Integer; stdcall;
function SetPixelFormat(DC: HDC; PixelFormat: Integer; FormatDef: PPixelFormatDescriptor): BOOL; stdcall;
const
GL_LINES = $0001;
gdi32 = “gdi32.dll”;
opengl32 = “opengl32.dll”;
implementation
{ OpenGL }
function wglCreateContext; external opengl32 name “wglCreateContext”;
function wglDeleteContext; external opengl32 name “wglDeleteContext”;
function wglMakeCurrent; external opengl32 name “wglMakeCurrent”;
procedure glBegin; external opengl32;
procedure glColor(red, green, blue: GLbyte); external opengl32 name “glColor3b”;
procedure glEnd; external opengl32;
procedure glVertex2f; external opengl32;
procedure glViewport; external opengl32;
{ GDI }
function ChoosePixelFormat; external gdi32 name “ChoosePixelFormat”;
function SetPixelFormat; external gdi32 name “SetPixelFormat”;
end.


Повернемося в модуль головної форми програми UnitMainForm.pas. При створенні форми викликається метод диспетчеризації події, за замовчуванням іменований FormCreate, який ми будемо використовувати для установки формату пікселя і настройки контексту відтворення (використовується методика [4]). Метод диспетчеризації події промальовування форми (за замовчуванням FormPaint) будемо використовувати для відтворення червоною діагональною лінії. Нарешті, в методі диспетчеризації видалення форми (за замовчуванням FormDestroy) звільнимо зайнятий контекст відтворення. Остаточний код модуля наведений нижче.










unit UnitMainForm;
interface
uses
Forms, GLImports;
type
TFormGL = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
rc: HGLRC;
end;
var
FormGL: TFormGL;
implementation
{$R *.dfm}
procedure TFormGL.FormCreate(Sender: TObject);
var
dc: HDC;
pfd: TPixelFormatDescriptor;
p2: PPixelFormatDescriptor;
PixelFormat: Integer;
begin / / Встановити формат пікселя:
dc := Canvas.Handle;
FillChar(pfd, SizeOf(pfd), 0);
p2 := @pfd;
PixelFormat := ChoosePixelFormat(dc, p2);
SetPixelFormat(dc, PixelFormat, p2); / / Встановити контекст відтворення OpenGL:
rc := wglCreateContext(Canvas.Handle);
end;
procedure TFormGL.FormPaint(Sender: TObject);
begin / / Установка поточного контексту відтворення:
wglMakeCurrent(Canvas.Handle, rc); / / Установка області промальовування:
glViewport(0, 0, Self.ClientWidth, Self.ClientHeight);
glColor(127, 0, 0);
glBegin(GL_LINES);
glVertex2f(-1, -1);
glVertex2f(+1, +1);
glEnd; / / Обнуління поточного контексту відтворення:
wglMakeCurrent(0, 0);
end;
procedure TFormGL.FormDestroy(Sender: TObject);
begin
wglDeleteContext(rc);
end;
end.


Зверніть увагу, що з інтерфейсної частини модуля UnitMainForm.pas видалені практично всі посилання на модулі (секція uses), створені IDE Delphi по замовчуванню. Ця дія носить рекомендаційний характер, підкреслюючи важливість абстрагування від коду стандартних модулів Delphi.


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



Рис. 2. Проект Delphi 6 з використанням OpenGL без модулів Windows.pas і OpenGL.pas

OpenGL в проектах Delphi. NET


Уважно вивчаючи матеріали численних форумів в мережі Інтернет з моменту виходу Delphi 8 до теперішнього часу, автор зробив висновок, що погляди як початківців програмістів, так і експертів щодо Delphi for. NET значно помінялися і прийняли більш “стриману” форму. До речі, більшість програмістів, що використовують інші мови (не Delphi), перехід на платформу. NET сприйняли як істотне поліпшення в області програмування.


Так чи інакше, а перехід на платформу. NET Framework був неминучий. На щастя, останні версії середовища Delphi for. NET відрізняються від “піонерської” Delphi 8 в кращу сторону. Це пов’язано, очевидно, з придбанням колишнього підрозділу корпорації Borland CodeGear сторонньої компанією Embarcadero Technologies, що займається тепер курирування все, що пов’язано з Delphi. Результати не змусили себе чекати – середа RAD 2009 по перших тестів виявилася досить стабільною і надійною, хоча і трохи ресурсномісткою.


Розглянемо створення найпростішого додатка з використанням OpenGL в проекті RAD Studio 2009. Так як нам знадобиться простір імен System.Windows.Forms та інші збірки. NET Framework, вкажемо тип нашого нової програми як VCL Forms Application – Delphi for. NET (рис. 3).



Рис. 3. Новий проект Delphi for. NET

Головна форма програми створюється як VCL-об’єкт, але керований середовищем. NET Framework, як і екземпляри будь-яких об’єктів-спадкоємців класу System.Object. Зокрема, примірники класу System.Windows.Forms.Form, фізично є звичайними Windows-формами, не потребують батьку явно, і можуть створюватися конструктором Create без будь-яких параметрів. Цю особливість ми застосуємо для створення ще одного вікна, на якому безпосередньо буде здійснюватися отрисовка елементів OpenGL.


У даному проекті ми не станемо звертатися до бібліотек OpenGL безпосередньо. Замість цього будемо використовувати одну з відомих безкоштовних бібліотек, що реалізують функції OpenGL в середовищі. NET Framework, наприклад, бібліотеку Open ToolKit [7].


Після збереження проекту Project1.dpr на жорсткому диску підключимо Open ToolKit, використовуючи стандартну методику Add Reference, вказавши на жорсткому диску місце розташування файлу OpenTK.dll. За замовчуванням, якщо збірка не зареєстрована в Global Assembly Cache (GAC), вона копіюється в папку програми, що в більшості випадків прийнятно (рис. 4).




Рис. 4. Підключення збірки до проекту


Секцію uses модуля головної форми Unit1.pas доповнимо кількома просторами імен:










uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,
{ .NET Windows Forms }
System.Windows.Forms,
{ .NET Open ToolKit }
OpenTK,
OpenTK.Graphics;


Прибираючи з коду коментарі, вставлені середовищем IDE за замовчуванням, додамо далі в секцію глобальних змінних два об’єкти – форму для виведення графіки NetForm і для користувача елемент управління MyGLControl:










var
Form1: TForm1;
NetForm: System.Windows.Forms.Form;
MyGLControl: OpenTK.GLControl;


Секція implementation модуля буде містити лише два методи диспетчеризації подій – створення форми FormCreate і її закриття FormClose. Цей код носить тільки демонстраційний характер і не може розглядатися навіть як рекомендаційний по ряду причин (методи відносяться до головної формі Form1, а не до форми NetForm, яка містить полотно OpenGL, форма NetForm не реагує на зміну розмірів і переміщення, відсутня окремий метод відтворення графічних примітивів для GLControl і т. п.).


Остаточний код модуля наведений нижче.










unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,
{ .NET Windows Forms }
System.Windows.Forms,
{ .NET Open ToolKit }
OpenTK,
OpenTK.Graphics;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
var
Form1: TForm1;
NetForm: System.Windows.Forms.Form;
MyGLControl: OpenTK.GLControl;
implementation
{$R *.nfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
NetForm := System.Windows.Forms.Form.Create;
NetForm.Show;
{ create OpenGL Control }
MyGLControl := OpenTK.GLControl.Create;
MyGLControl.Parent := NetForm;
MyGLControl.Dock := DockStyle.Fill;
MyGLControl.MakeCurrent;
{ draw }
OpenTK.Graphics.GL.Viewport(0, 0, MyGLControl.Width, MyGLControl.Height);
OpenTK.Graphics.GL.DrawBuffer(DrawBufferMode.Back);
OpenTK.Graphics.GL.Clear(OpenTK.Graphics.ClearBufferMask.ColorBufferBit);
OpenTK.Graphics.GL.Color3([1.0, 0.0, 0.0]);
OpenTK.Graphics.GL.Begin(OpenTK.Graphics.BeginMode.Lines);
OpenTK.Graphics.GL.Vertex2([-1.0, -1.0]);
OpenTK.Graphics.GL.Vertex2([1.0, 1.0]);
OpenTK.Graphics.GL.End;
MyGLControl.SwapBuffers;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{ destroy current OpenGL Context }
MyGLControl.DestroyContext;
end;
end.


Форма NetForm створюється після головної форми програми Form1. Потім створюється для користувача елемент управління MyGLControl, який прикріплюється до форми NetForm і займає всю її поверхню. Цей елемент є екземпляром спеціалізованого класу OpenTK.GLControl, тому всі необхідні процедури по ініціалізації контексту відтворення вже виконані його творцями всередині самого класу. Кінцевому користувачеві, тобто в даному випадку нам, залишається встановити створений контекст поточним (метод MyGLControl.MakeCurrent), встановити область виведення графіки (метод OpenTK.Graphics.GL.Viewport), і, власне, виконати малювання червоною діагональною лінії на чорному тлі елемента, використовуючи схему буферизации (методи DrawBuffer, SwapBuffers). Результат виконання програми наведено на рис. 5.



Рис. 5. Застосування OpenGL в проекті Delphi for. NET (Open ToolKit)

Повторюся, що дана форма NetForm абсолютно позбавлена ​​”поняття ввічливості” при діалозі з користувачем. Для організації грамотної роботи елементів управління, що використовують OpenGL, слід обов’язково реалізовувати їх методи по перемальовуванні, зміни розмірів і т. д.


На закінчення хотілося б навести деяку інформацію, яку автор вважає вельми корисною, особливо для початківців програмістів. В останньому прикладі ми використовували бібліотеку Open ToolKit, але існують також і інші хороші інструменти для роботи з OpenGL. Ось основні з них:



Успіху і успіхів в програмуванні!


Використана література



  1. Segal M., Akeley K. The OpenGL® Graphics System: A Specification (Version 2.1 – July 30, 2006). Copyright © 1992-2006 Silicon Graphics, Inc.
  2. Chin N., Frazier C., Ho P. The OpenGL® Graphics System Utility Library (Version 1.3). Copyright © 1992-2006 Silicon Graphics, Inc.
  3. Kilgard M. J. The OpenGL® Utility Toolkit (GLUT) Programming Interface. API Version 3. Copyright © 1992-2006 Silicon Graphics, Inc. Copyright © 1994, 1995, 1996. Mark J. Kilgard. All rights reserved.
  4. Краснов М. В. OpenGL. Графіка в проектах Delphi. -СПб.: БХВ-Петербург, 2004. -352 С.
  5. Бейкер Х. Д. Комп’ютерна графіка й стандарт OpenGL, 3-е видання. -М.: Издат. дім “Вільямс”, 2005. -1168 С.
  6. Пачеко К. Delphi for. NET. Керівництво розробника. -М.: Видавничий дім “Вільямс”, 2005. -960 С.
  7. Open ToolKit web-page

До статті додаються файли:

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*