OpenGL - это стандартная библиотека для всех 32-х разрядных операционных систем, то есть для использования данной бииблиотеки в свои программах не нужно устанавливать дополнительного программного обеспечения.
InvalidateRect(Handle, nil, False) - команда перерисовки экрана.
glViewPort(x1, y1, x2, y2) - задает область вывода.
glEnable() - вкл. использование,
параметрами могут быть:
GL_LIGHTING - разрешает использование источника света.
GL_LIGHT0 - включает источник света под номером "0".
GL_DEPTH_TEST - вкл. тест глубины.
GL_COLOR_MATERIAL - разрешает использовать цвета при включенном источнике света.
GL_AUTO_NORMAL - авто-расчет нормалей.
GL_NORMALIZE - обеспечивает корректный вывод авто-нормалей при масштабировании.
GL_BLEND - включает режим смешения цветов.
GL_CULL_FACE - вкл. отсечение не видимых сторон полигонов.
GL_SCISSOR_TEST - разрешает вырезку.
GL_FOG - включение режима тумана.
GL_STENCIL_TEST - включает режим буфера трафарета.
GL_POLYGON_STIPPLE - включает режим штриховки.
GL_TEXTURE_1D - вкл. режим одномерной текстуры
GL_TEXTURE_2D - вкл. режим двумерной текстуры.
GL_TEXTURE_GEN_S - включает координату "s".
GL_TEXTURE_GEN_T - включает координату "t".
GL_CLIP_PLAN0 - включает плоскость отсечения номер "0".
glDisabled ()- выкл. использование (параметры как у glEnable).
glBegin(), glEnd - командные скобки, межу ними расположены процедуры рисования.
GL_POINTS - рисует отдельные точки.
GL_LINES - задает примитив отрезок.
GL_LINE_STRIP - перечисляемые вершины соединяются одна за другой.
GL_LINE_LOOP - перечисляемые вершины соединяются одна за другой,
а последняя с первой.
GL_TRIANGLES - вершины берутся тройками по которым строится отдельный треугольник.
GL_TRIANGLE_STRIP - связанная группа треугольников, первые три вершины образуют
первый треугольник, вершины со 2-ой по 4-ую - второй треугольник, с 3 по 5 - третий…
GL_TRIANGLE_FAN - связанная группа треугольников с общей, первой вершиной.
GL_QUADS - задает приметив- четырехугольник, перечисляемые вершины
берутся по четыре.
GL_QUAD_STRIP - состоит из связанных четырех угольников.
glVertex - задает вершину.
glColor - задает цвет.
glScissor - функция вырезки, определяет прямоугольник в окне приложения,
т.е. область вырезания.
glShadeModel - задает правило тонирования.
glPolygonMode - задает режим воспроизведения для всех типов многоугольников.
glLineWidth(w) - задает ширину линии.
glLineStipple - задает пунктирные линии контура.
glRectf - версия команды glRect, используется для рисования прямоугольника на плоскости.
glBitMap - предназначена для вывода битовых массивов.
glPixelZoom - служит для масштабирования выводимых массивов пикселей.
glPixelStorei - задаёт выравнивание пикселей, также позволяет прокручивать изображение..
glCopyPixels - позволяет копировать часть экрана в текущей позиции, задаваемой glRasterPos.
glPixelTransfer - позволяет задать режимы вывода пикселей, в частности цветовые фильтры.
glReadPixels - позволяет считывать содержимое всего экрана или его части.
glScalef - служит для изменения масштаба, с тремя аргументами, которые являются
масштабными множителями по осям.
glRotatef - используется для поворота, с четырьмя аргументами: угол поворота(в градусах)
и вектор поворота(три вещественных числа).
glTranslatef - осуществляет перенос точки зрения (системы координат), имеет три аргумента
- величины переноса по каждой из осей.
glMatrixMode() - устанавливает текущую матрицу, параметры:
GL_MODELVIEV, GL_PROJECTION.
glPushMatrix, glPopMatrix - команды позволяют запомнить и восстановить текущую матрицу.
glLoadIdentity - возвращает исходную матрицу.
glFrustum(a, b, c, d, e, f) - задает параметры вида, первые два аргумента(a и b) задают
координаты плоскостей отсечения слева и справа, "c" и "d" - определяют координаты
отсечения плоскостей снизу и сверху, "e" и "f" - задают расстояние до ближней, и до
дальней плоскости отсечения, последние параметры должны быть положительны.
glOrtho - задает параметры вида, значения аргументов те же что и для glFrustum, но
проекция будет ортографической, параллельной.
gluOrtho2D - имеет четыре аргумента, смысл которых, такой же как и у glOrtho, по своему
действию она эквивалентна вызову glOrtho с указанием значения расстояния до ближайшей
плоскости отсечения равным -1, и расстоянием до дальней плоскости отсечения равным 1.
gluPerspective(grad, // угол видимости в направлении оси Y
ClientWidth / ClientHeight, // угол видимости в направлении оси X - через аспект
a, // расстояние от наблюдателя до ближней плоскости отсечения
b); // расстояние от наблюдателя до дальней плоскости отсечения
glTexParameter - задает параметры текстуры.
glBindTextures - позволяет связывать текстуры, что-то вроде дисплейных списков.
glGenTExtures - генерирует имена текстур.
glDeleteTextures - освобождает память от текстурных списков.
...
private
DC : HDC; //контекст устройства
hrc: HGLRC; //контекст воспроизведения
ry : GLfloat;
tx : GLfloat;
quadObj : GLUquadricObj;
end;
var
frmGL: TfrmGL;
mode : (POINT, LINE, FILL, SILHOUETTE) = FILL;
gluobj : (SPHERE, CONE, CYLINDER, DISK) = SPHERE;
orientation : (OUTSIDE, INSIDE) = OUTSIDE;
normals : (NONE, FLAT, SMOOTH) = SMOOTH;
implementation
{$R *.DFM}
uses OpenGL;
procedure TfrmGL.FormPaint(Sender: TObject);
begin
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // очистка буфера цвета
glPushMatrix;
glRotatef (ry, 0.0, 1.0, 0.0);
glTranslatef (tx, 0.0, 0.0);
case mode of //режим воспроизведения
POINT : gluQuadricDrawStyle (quadObj, GLU_POINT); // режим воспроизведения объекта "quadObj",
LINE : gluQuadricDrawStyle (quadObj, GLU_LINE); // это аналог glPolygonMode
FILL : gluQuadricDrawStyle (quadObj, GLU_FILL);
SILHOUETTE : gluQuadricDrawStyle (quadObj, GLU_SILHOUETTE {только граничный контур} );
end;
case orientation of
INSIDE : gluQuadricOrientation* (quadObj, GLU_INSIDE); // внутрь
OUTSIDE : gluQuadricOrientation (quadObj, GLU_OUTSIDE); // наружу
end;
case normals of
NONE : gluQuadricNormals* (quadObj, GLU_NONE); // не строить
FLAT : gluQuadricNormals (quadObj, GLU_FLAT); // для сегмента
SMOOTH : gluQuadricNormals (quadObj, GLU_SMOOTH); // для каждой вершины
end;
case gluobj of
SPHERE : gluSphere* (quadObj, 1.5, 10, 10); // сфера
CONE : gluCylinder*(quadObj, 0.0, 1.0, 1.5, 10, 10); // конус
CYLINDER : gluCylinder (quadObj, 1.0, 1.0, 1.5, 10, 10); // цилиндр
DISK : gluDisk (quadObj, 0.0, 1.5, 10, 5);//строит диск
2,3-параметры внутренний и внешний радиусы
end;
glPopMatrix;
SwapBuffers(DC);
end;
procedure TfrmGL.SetDCPixelFormat;
var
nPixelFormat: Integer;
pfd: TPixelFormatDescriptor;
begin
FillChar(pfd, SizeOf(pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat(DC, @pfd);
SetPixelFormat(DC, nPixelFormat, @pfd);
end;
procedure TfrmGL.FormCreate(Sender: TObject);
begin
DC := GetDC (Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glLineWidth (1.5);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
glEnable (GL_COLOR_MATERIAL); // использ. при вкл. источнике света для учета цвета примитивов
glColor3f (1.0, 0.0, 0.0);
quadObj := gluNewQuadric; //команда создаёт quadric-объект, обязательная команда
ry := 0.0;
tx := 0.0;
end;
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
gluDeleteQuadric (quadObj); //удаление объекта, выполняется до освобождения конт. воспроизведения
wglMakeCurrent(0, 0);
wglDeleteContext(hrc); // удаление контекста воспроизведения
ReleaseDC (Handle, DC);
DeleteDC (DC);
end;
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
If Key = VK_ESCAPE then Close;
If Key = VK_LEFT then begin
ry := ry + 2.0;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_RIGHT then begin
ry := ry - 2.0;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_UP then begin
tx := tx - 0.1;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_DOWN then begin
tx := tx + 0.1;
InvalidateRect(Handle, nil, False);
end;
If Key = 49 then begin
Inc (mode);
If mode > High (mode) then mode := Low (mode);
InvalidateRect(Handle, nil, False);
end;
If Key = 50 then begin
Inc (gluobj);
If gluobj > High (gluobj) then gluobj := Low (gluobj);
InvalidateRect(Handle, nil, False);
end;
If Key = 51 then begin
If orientation = INSIDE
then orientation := OUTSIDE
else orientation := INSIDE;
InvalidateRect(Handle, nil, False);
end;
If Key = 52 then begin
Inc (normals);
If normals > High (normals) then normals := Low (normals);
InvalidateRect(Handle, nil, False);
end;
end;
procedure TfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode (GL_PROJECTION); // команда устанавливает текущую матрицу
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 2, 9);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity;
// этот фрагмент нужен для придания трёхмерности
glTranslatef(0.0, 0.0, -5.0); // перенос объекта - ось Z
glRotatef(30.0, 1.0, 0.0, 0.0); // поворот объекта - ось X
glRotatef(70.0, 0.0, 1.0, 0.0); // поворот объекта - ось Y
InvalidateRect(Handle, nil, False);
end;
*gluQuardicOrientation - задает направление нормали к поверхности объекта, внутрь или наружу.
*gluQuadricNormals - определяет, строятся ли нормали для каждой вершины, для всего сегмента либо
вообще не строятся.
*gluCylinder - предназначена для построения цилиндров и конусов, параметры команды: имя объекта,
радиусы основания и верхней части и два числа, задающие частоту разбиения.
*gluSphere(quadricObjName, R, a, b) - строит сферу радиуса R, a,b - параметры частоты разбиения.