Урок 1 - Инициализация OpenGL
Этот курс уроков OpenGL предназначен для программистов, обладающих навыками разработки программ на Delphi.
Давайте разберемся, что такое OpenGL. Википедия гласит: OpenGL (Open Graphics Library — открытая графическая библиотека, графическое API)
— спецификация, определяющая независимый от языка программирования платформонезависимый программный интерфейс для написания приложений,
использующих двумерную и трёхмерную компьютерную графику.
В этом уроке мы поймем, как инициализировать OpenGL в Delphi.
Итак, давайте начнем!
Создадим новый проект (File->New->Application).
Теперь необходимо добавить в секцию uses Модуль OpenGL.
Далее нам надо задать формат пиксела, который будет использоваться в нашем приложении.
Для этого надо:
- Создать глобальную переменную HRC с типом HGLRC;
var Form1: TForm1; HRC: HGLRC;
- Создать процедуру SetDCPixelFormat.
procedure SetDCPixelFormat ( hdc : HDC ); var pfd : TPixelFormatDescriptor; nPixelFormat : Integer; begin FillChar (pfd, SizeOf (pfd), 0); nPixelFormat := ChoosePixelFormat (hdc, @pfd); SetPixelFormat (hdc, nPixelFormat, @pfd); end;Всё! С форматом пиксела мы закончили.
Далее в обработчике событий Form1 onCreate будет наша инициализация OpenGL.
procedure TForm1.FormCreate(Sender: TObject); begin SetDCPixelFormat(Canvas.Handle); //Применяем формат пиксела заданный ранее hrc := wglCreateContext(Canvas.Handle); //Выделяем контекст устройства wglMakeCurrent(Canvas.Handle, hrc); end;В этой процедуре системе сообщается, что будет использоваться режим с поддержкой OpenGL. Аргументом функции wglCreateContext является ссылка на контекст устройства, на который будет осуществляться вывод. Сейчас устройством вывода служит окно формы. Для получения этого контекста OpenGL необходима величина типа HDC Здесь, как и во многих других примерах, мы используем факт, что canvas. Handle и есть ссылка на контекст устройства, связанная с окном формы. Сейчас если мы скомпилируем наш проект, то мы ничего не увидим (просто пустая форма).

Ничего не происходит, потому что мы еще не рисовали наш буфер. Для этого в обработчике события Form1 onPaint запишем следующий код:
procedure TForm1.FormPaint(Sender: TObject); begin glClearColor (0.5, 0.5, 0.75, 1.0); //Цвет фона glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Очистка буфера цвета и глубины wglMakeCurrent (0, 0); end;Здесь стоит отметить, что первые 3 параметра функции glClearColor (R,G,B,A) задают оттенки красного, зелёного и синего результирующего цвета (в данном случае фиолетовый), а 4 параметр является альфа каналом (прозрачностью фона). Все эти параметры могут принимать значения от 0 до 1.
Теперь давайте скомпилируем наш проект:

Ура! У меня появилась форма, окрашенная в фиолетовый цвет. Если вы всё сделали правильно, то у вас должно получиться то же самое. Теперь можно поэкспериментировать с цветом формы.
В следующем уроке мы попытаемся нарисовать простые геометрические фигуры: точку, линию, треугольник, квадрат, куб и т.д.
Добавил(а): an1rk4 | Дата: 2012-11-16 | |
DC: HDC; в варах в уроке забыл прописать, ошибку выдавал на строке glClearColor (0.5, 0.5, 0.75, 1.0); //Цвет фона
![]() |
Добавил(а): Feraset | Дата: 2012-11-18 | |
WTF? Серый цвет на фоте как был так и остался. У меня Delphi 7
![]() |
Добавил(а): Feraset | Дата: 2012-11-18 | |
Паррдон цвет меняется но ток какойто непонятный RGB - Цвет меняет только <B> a RG как будто не причём
![]() |
Добавил(а): Klesh | Дата: 2012-11-18 | |
an1rk4, переменная DC не используется в данном уроке, я просто забыл убрать её из исходника. Какую ошибку тебе выдаёт делфи?
|
Добавил(а): Doggy | Дата: 2013-01-11 | |
прикольно!!
а рисовать будем только на форме?
можно же все это замутить и для панелей или Image или PaintBox?
Это будет в др. уроках?
Ща буду смотреть
![]() |
Добавил(а): Klesh | Дата: 2013-01-12 | |
Да, рисовать можно на всем у чего есть свойство Handle.
|
Добавил(а): nucell | Дата: 2013-01-18 | |
Тупо белая форма... если что-то менять в glclearcolor толку ноль. Delphi 7
|
Добавил(а): Епифан | Дата: 2013-04-30 | |
А как сделать вывод OpenGL на TPanel? или другие элементы формы?
|
Добавил(а): Klesh | Дата: 2013-05-01 | |
/opengl/oles2.php последний коментарий
|
Добавил(а): gasmator | Дата: 2013-05-11 | |
меняю прозрачность фона - ничего не происходит
|
Добавил(а): Klesh | Дата: 2013-05-11 | |
Это нормально, ничего не должно меняться, просто в OpenGL пиксель состоит из 4 компонентов. Нужно же чем то забить последний
![]() |
Добавил(а): Maks | Дата: 2013-08-01 | |
Конеш никаких комментариев практически нет...ничего не описано, мало пояснений. просто пишет автор ВСЕ и типо это нормально...и это уроки?
|
Добавил(а): Daniel | Дата: 2013-08-13 | |
Всё очень печально... Даже скачанный пример не работает.В чём может быть причина?
![]() |
Добавил(а): Stormteller | Дата: 2013-11-01 | |
Что нужно изменить что бы рисовать на панели?
|
Добавил(а): kordalk | Дата: 2014-01-06 | |
"Да, рисовать можно на всем у чего есть свойство Handle."
Не на чем угодно. Рисовать можно на всех тех компонентах, которые унаследованы от TWinControl. К таким относятся: TForm, TPanel, TButton, TGroupBox и др. Если быть точнее, у тех компонентов свойство Handle которых, должно иметь тип HWND.
|
Добавил(а): dimonsky | Дата: 2017-07-03 | |
ЗАпускается, но фоорма меняет цвет не каждый раз, а один из трех-четырех запусков.
|
Добавил(а): dimonsky | Дата: 2017-07-03 | |
canvas.handle не работает.
Вместо этого надо GetDC(panel1.handle).
|
Добавил(а): N0E0O7 | Дата: 2017-08-16 | |
А у меня форма чёрная запускается
![]() |
Добавил(а): SteelFlame | Дата: 2018-07-27 | |
Что такое 1.формат пиксела 2. тип - HGLRC
![]() |
-
В Delphi XE7 все отлично запустилось.