Можна вважати істотним недоліком обмеження для полігонів (gl_polygon): можливість виводу тільки опуклих фігур. Функція Polygon GDI API Windows у цьому плані набагато досконаліша - вона рисує й неопуклі полігони.
Розмір точок можна задати викликом glPointsize (), товщину ліній - glLineWidth () Для завдання стилю ліній використовуються функції glLineStipple, glEnable і glDisable, наприклад,
причому аргументами функції glLineStipple () є кількість повторів пікселів і шаблон пунктиру.
Стиль заповнення фігур може бути заданий растровим зразком 32*32 біт.
Зверніть увагу, ми вже кілька разів використовували функції glEnable () і glDisable (). Це багатоцільові функції. Вони призначені керувати багатьма різноманітними режимами відображення.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL;
type
TfrmGL = class (TForm)
procedure FormCreate (Sender: TObject);
procedure FormPaint (Sender: TObject);
procedure FormDestroy (Sender: TObject);
procedure FormKeyPress (Sender: TObject; var Key: Char);
private
hrc: HGLRC;
end;
var
frmGL: TfrmGL;
Vert: array [1. .6,1. .10] of GLfloat; // оголосили масив з папаметрами 10-ти точок
mx,my: byte; // коефіцієнти збільшення/зменшення
implementation
{$R *. DFM}
procedure TfrmGL. FormPaint (Sender: TObject);
var
i: byte;
begin
wglMakeCurrent (Canvas. Handle, hrc); // Встановили контекст відображення
glViewPort (0, 0, ClientWidth, ClientHeight); // встановили область відображення
glClearColor (0.5, 0.5, 0.5, 1.0); // задали колір фону
glClear (GL_COLOR_BUFFER_BIT); // Очистили буфер кольору
glEnable (GL_POINT_SMOOTH); // активізувати зглажування точок
glScalef (my/mx, - my/mx, 1.0); // виконуємо маштабування
for i: = 1 to 10 do
begin
glPointSize (vert [4, i]); // задали розмір точки
glColor3f (vert [1, i], vert [2, i], vert [3, i]); // задали колір для примітитів
glBegin (GL_POINTS); // розпочинаємо побудову
glVertex2f (vert [5, i],vert [6, i]); // будуємо точку
glEnd; // закінчуємо побудову
end;
glScalef (mx/my, - mx/my, 1.0); // повертаємо систему в початкове положення
SwapBuffers (Canvas. Handle); // вміст буферу виводимо на екран
wglMakeCurrent (0, 0); // вивілбняємо контекст відображення
end;
{Формат пикселя}
procedure SetDCPixelFormat (hdc: HDC);
var
pfd: TPixelFormatDescriptor; // структура формату пікселя
nPixelFormat: Integer; // номер формату пікселя
begin
FillChar (pfd, SizeOf (pfd), 0); // онулили формат пікселя
pfd. dwFlags: = PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; // встановили флаги
nPixelFormat: = ChoosePixelFormat (hdc, @pfd); // активізували формат пікселя для нашого контексту відображення
SetPixelFormat (hdc, nPixelFormat, @pfd); // встіновили формат вікселя
end;
{Создание формы}
procedure TfrmGL. FormCreate (Sender: TObject);
var
i: byte; // кількість точок на екрані
begin
SetDCPixelFormat (Canvas. Handle); // встановили формат пікселя
hrc: = wglCreateContext (Canvas. Handle); // створили контекст вдображення
randomize; // активізувати генератор випадкових змінних
for i: = 1 to 10 do
begin
vert [1, i]: =Random (10) /10; // R встановити коефіцієнти кольору
vert [2, i]: =Random (10) /10; // G
vert [3, i]: =Random (10) /10; // B
vert [4, i]: =random (30); // pointSize
vert [5, i]: = (random (10) - random (10)) /10; // X
vert [6, i]: = (random (10) - random (10)) /10; // Y
end;
mx: =10; my: =10;
end;
11. Для попереднього практичного завдання даного варіанту забезпечити операцію маштабування використовуючи клавіши “+” та “-“
Далі згідно варіанту необхідно, щоб довільна кількість точок наближалась за допомогою натиску на клавішу і таким же чином точки віддалялися тобто виконувалося маштабування. Для більшої зручності ми виберемо клавіші на клавіатурі “+” та “-", що само собою вже підрозуміває наближення та віддалення. Для вже існуючого листингу вище вказаного допишемо такий алгоритм дій:
procedure TfrmGL. FormDestroy (Sender: TObject);
begin
wglDeleteContext (hrc); // знищили контекст відображення
end;
procedure TfrmGL. FormKeyPress (Sender: TObject; var Key: Char);
begin
if key = '-' then mx: =mx+1;
if key = '+' then mx: =mx-1;
FormPaint (Sender);
end;
end.
Після написання цих команд програма буде виконувати маштабування довільної кількості точок на формі, які вказані на рис.1 та рис.2:
(рис.1)
На рис.1 показане вже згенерована програма яка виконує масштабування віддалення при натиску на клавішу “-", на рис.2 ви бачите наближення довільних точок при натиску на клавішу “+”
(рис.2)
1. Блінова Т.О., Порєв В.М. Комп’ютерна графіка / За ред. В.М. Горєва. - К.: Видавництво “Юніор”, 2004. - 456с., іл.
2. С.В. Глушаков, Г.А. Крабе Компьютерная графика, Харьков 2002
3. OpenGl, технология, ставшая символом. Учебник в примерах. Конспект лекцій.