1. Предисловие:
Delphi поддерживает OpenGl по умолчанию. Вы можете использовать модуль Uses OpenGL для ссылки на него, а затем использовать функции OpenGL. OpenGl является кроссплатформенным, и Windows уже давно поддерживает и интегрирует его в систему. Opengl32.dll существует в system32 и не требует дополнительной установки. Хотя в самой Windows есть d3d, его возможности ограничены, а страниц с соответствующими учебными материалами относительно мало.
Обычно OpenGL поддерживает только следующие основные геометрические фигуры: точки, линии и многоугольники . Никакие поверхности или графика более высокого уровня (например, сферы) не могут быть нарисованы в качестве основных графических элементов. Но их можно прекрасно смоделировать с помощью полигонов. Взгляните беглым взглядом на современные 3D-игры, и вы увидите, что они почти полностью построены из треугольников. Поэтому мы не связаны этим ограничением.
2. Инициализация
Перед использованием OpenGL вам необходимо установить некоторые связанные параметры. Общий процесс таков:
«Установить соответствующий формат пикселей» (ChoosePixelFormat, SetPixelFormat)
«Создайте новый контекст рендеринга OpenGL» (wglCreateContext)
«Установить параметры, связанные с OpenGL», «Рисование» (glBegin, glEnd)
«Удалить контекст рендеринга OpenGL» (wglDeleteContext)
процедура TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; PixelFormat: Integer;begin С pfd do start nSize := sizeof(TPIXELFORMATDESCRIPTOR); // размер nVersion := 1; // версия dwFlags := PFD_SUPPORT_OPENGL или PFD_DRAW_TO_WINDOW или PFD_DOUBLEBUFFER // поддержка двойной буферизации iPixelType := PFD_TYPE_RGBA; // тип цвета cColorBits := 24; // предпочтительная глубина цвета cRedBits := 0; cRedShift := 0 // биты цвета (игнорируются) cGreenBits := 0; := 0; cBlueBits: = 0; cBlueShift: = 0; cAlphaBits := 0; cAlphaShift := 0; // нет альфа-буфера cAccumBits := 0; // нет буфера накопления, cAccumGreenBits := 0; // накапливаемые биты (игнорируются) cAccumBlueBits := 0; = 0 cDepthBits := 16 // буфер глубины cStencilBits :=; 0; // нет буфера трафарета cAuxBuffers := 0; // нет вспомогательных буферов iLayerType := PFD_MAIN_PLANE; // основной слой bReserved := 0; dwVisibleMask := 0; = GetDC (Дескриптор); Формат пикселей: = ChoosePixelFormat(FDC, @pfd); если PixelFormat = 0, то Exit; если нет SetPixelFormat(FDC, PixelFormat, @pfd), то Exit; FHRC := wglCreateContext(FDC); wglMakeCurrent(FDC, FHRC); параметру черного цвета соответствует RGBA glClearColor(0, 0, 0, 0); //Устанавливаем ортогональную проекцию матрицы преобразования проекции glMatrixMode(GL_PROJECTION); //Сбрасываем текущую указанную матрицу на единичную матрицу glLoadIdentity; //Указываем OpenGL для рисования в этой области glViewPort(0, 0, ClientWidth, ClientHeight); // Установить диапазон мировой системы координат gluOrtho2D(0, ClientWidth, ClientHeight, 0 //); Переключите объект преобразования матрицы на преобразование представления модели glMatrixMode(GL_MODELVIEW) //Сбрасываем текущую указанную матрицу в единичную матрицу glLoadIdentity;end;
3. Рисование
Базовыми примитивами OpenGL являются точки, линии, многоугольники и т. д. Каждый раз, когда вы рисуете, вам нужно использовать glBegin() и glEnd(). Например, следующая процедура функции рисования Draw;
процедура TForm1.Draw;begin // Очистка буфера glClear(GL_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT); // Очистка буфера glColor3ub(0, 255, 0); glBegin(GL_TRIANGLES); // Указание OpenGL нарисовать треугольники glVertex2f(200, 300) ; //Передаем координаты трех вершин треугольника в OpenGL glVertex2f(400, 300); glVertex2f(300, 150); //Завершаем рисование примитивов. SwapBuffers(FDC); //Заменяем содержимое двойного буфера, который скопирует только что нарисованную графику на экран. конец;
4. Наконец, не забудьте отпустить . Весь код выглядит следующим образом:
модуль Unit1; интерфейсы используют Windows, сообщения, SysUtils, варианты, классы, графику, элементы управления, формы, диалоги, OpenGL; тип TForm1 = класс (TForm) процедура FormCreate (отправитель: TObject процедура FormDestroy (отправитель: TObject процедура FormPaint (); Отправитель: TObject); процедура FormResize (Отправитель: TObject); частный {Частные объявления} FDC: HDC; FHRC:HGLRC; glColor3ub (0, 255, 0); glBegin(GL_TRIANGLES);//Сообщаем OpenGL, что треугольник будет нарисован glVertex2f(200, 300); //Переносим три координаты вершин треугольника в OpenGL glVertex2f(400, 300); glVertex2f(300, 150); glEnd; //Завершаем рисование юаней. SwapBuffers(FDC); //Заменяем содержимое двойного буфера, который скопирует только что нарисованную графику на экран. end;procedure TForm1.FormCreate(Sender: TObject);var pfd:TPIXELFORMATDESCRIPTOR; PixelFormat: Integer;begin С pfd do Begin nSize := sizeof(TPIXELFORMATDESCRIPTOR); // размер nVersion := 1; // версия dwFlags := PFD_SUPPORT_OPENGL или PFD_DRAW_TO_WINDOW или PFD_DOUBLEBUFFER; // поддержка двойной буферизации iPixelType := PFD_TYPE_RGBA; // тип цвета cColorBits := 24; // предпочтительная глубина цвета cRedBits := 0; cRedShift := 0; // биты цвета (игнорируются) cGreenBits := 0; ; cGreenShift: = 0; cBlueBits: = 0; cBlueShift := 0; cAlphaBits := 0; // нет альфа-буфера cAccumBits := 0; cAccumRedBits := 0; // нет буфера накопления, cAccumGreenBits := 0; // накапливаемые биты (игнорируются) = 0; cAccumAlphaBits:= 0; cDepthBits:= 16; cStencilBits := 0; // нет трафаретного буфера cAuxBuffers := 0; // нет вспомогательных буферов iLayerType := PFD_MAIN_PLANE; // основной слой bReserved := 0; dwVisibleMask := 0; ; FDC := GetDC(дескриптор формата пикселей); := ChoosePixelFormat(FDC, @pfd); если PixelFormat = 0, то Exit; если нет SetPixelFormat(FDC, PixelFormat, @pfd), то Exit; FHRC := wglCreateContext(FDC); wglMakeCurrent(FDC, FHRC); Цвет черный, параметр RGBA glClearColor(0, 0, 0, 0); //Устанавливаем ортогональную проекцию матрицы преобразования проекции вида glMatrixMode(GL_PROJECTION); //Сбрасываем текущую указанную матрицу на единичную матрицу glLoadIdentity; //Указываем OpenGL для рисования в этой области glViewPort(0, 0, ClientWidth, ClientHeight) ; //Установим диапазон мировой системы координат gluOrtho2D(0, ClientWidth, ClientHeight, 0); // Переключите объект преобразования матрицы на преобразование представления модели glMatrixMode(GL_MODELVIEW); //Сброс текущей указанной матрицы до единичной матрицы glLoadIdentity;end;procedure TForm1.FormDestroy(Sender: TObject);begin wglMakeCurrent(FDC, FHRC); FHRC ); ReleaseDC(Дескриптор, FDC);конец;процедура TForm1.FormPaint(Sender: TObject);begin Draw;end;procedure TForm1.FormResize(Sender: TObject);begin //Переопределяем область рисования, когда окно меняет размер glClearColor(0, 0, 0, 0); glMatrixMode(GL_PROJECTION); ) ; glLoadIdentity; glViewPort(0, 0, ClientWidth, ClientHeight); gluOrtho2D (0, ClientWidth, ClientHeight, 0); glMatrixMode (GL_MODELVIEW); glLoadIdentity; end; end.
Нажмите здесь, чтобы загрузить полный код