на главную >>

Delphi и OpenGL

OpenGL - это стандартная библиотека для всех 32-х разрядных операционных систем, то есть для использования данной бииблиотеки в свои программах не нужно устанавливать дополнительного программного обеспечения.

Краткий словарь OpenGL.     Пример с комментариями

Краткий обзор команд OpenGL.

(Автор: Косоруков Святослав )
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 - освобождает память от текстурных списков.


Пример использования OpenGL, использование Quadric-объектов бибиотеки glu.

...
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 - параметры частоты разбиения.
на главную >>

использованы материалы книги "OpenGL. Графика в проектах Delphi"(М.Краснов)

Рейтинг@Mail.ru