Урок 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


  Ничего не происходит, потому что мы еще не рисовали наш буфер. Для этого в обработчике события 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.

Теперь давайте скомпилируем наш проект:

Form1


Ура! У меня появилась форма, окрашенная в фиолетовый цвет. Если вы всё сделали правильно, то у вас должно получиться то же самое. Теперь можно поэкспериментировать с цветом формы.

В следующем уроке мы попытаемся нарисовать простые геометрические фигуры: точку, линию, треугольник, квадрат, куб и т.д.



Добавил(а): an1rk4 Дата: 2012-11-16
DC: HDC; в варах в уроке забыл прописать, ошибку выдавал на строке glClearColor (0.5, 0.5, 0.75, 1.0); //Цвет фона добавь поправку в урок)) еще бы неплохо объяснить что это за глобальные переменные DC: HDC и HRC: HGLRC; , с остальным вроде все понятно



Добавил(а): 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


  1. Евгений
    Евгений a year ago
    В Delphi XE7 все отлично запустилось.
  2. Александр
    Александр 3 months ago
    всё хорошо, только ошибка светится, компонента Paint нет, в кнопку добавил, цвет поменялся :
    procedure TForm1.Button1Click(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;
Отменить.