Четверг, 17.07.2025, 03:13
Приветствую Вас Проходимец | RSS

Хотите Заработать!? ↓

Поиск

Статьи

Главная » Статьи » Обучение » Delphi

Урок 3. Минимальная программа OpenGL [Фрукт]

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

Пример 1 

unit Unit1;
interface

uses
  Windows, Messages, Forms, Classes, Controls, ExtCtrls, ComCtrls,
  StdCtrls, Dialogs, SysUtils,  
  OpenGL;

type
  TfrmGL = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormDestroy(Sender: TObject);

  private
    hrc: HGLRC;  // ссылка на контекст воспроизведения                   
  end;

var
  frmGL: TfrmGL;

implementation

{$R *.DFM}

{=======================================================================
Рисование картинки}
procedure TfrmGL.FormPaint(Sender: TObject);
begin
 wglMakeCurrent(Canvas.Handle, hrc);

 glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
 glClear (GL_COLOR_BUFFER_BIT);      // очистка буфера цвета

 wglMakeCurrent (0, 0);
end;

{=======================================================================
Формат пикселя}
procedure SetDCPixelFormat (hdc : HDC);
var
 pfd : TPixelFormatDescriptor;
 nPixelFormat : Integer;
begin
 FillChar (pfd, SizeOf (pfd), 0);
 nPixelFormat := ChoosePixelFormat (hdc, @pfd);
 SetPixelFormat (hdc, nPixelFormat, @pfd);
end;

{=======================================================================
{Создание формы}
procedure TfrmGL.FormCreate(Sender: TObject);
begin
 SetDCPixelFormat(Canvas.Handle);
 hrc := wglCreateContext(Canvas.Handle);
end;

{=======================================================================
Конец работы приложения}
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
 wglDeleteContext(hrc);
end;

end.
Список uses дополнен модулем OpenGL — это программист должен сделать сам.
Раздел private описания класса формы содержит строку
hrc: HGLRC;  // ссылка на контекст воспроизведения

Обработчик события onCreate формы содержит следующие строки:
SetDCPixelFormat(Canvas.Handle);      //задаем формат пиксела
hrc := wglCreateContext(Canvas.Handle);//создаем контекст воспроизведения
Первая строка — обращение к описанной в этом же модуле пользовательской процедуре, задающей формат пиксела:

procedure SetDCPixelFormat (hdc : HDC);
var
 pfd : TPixelFormatDescriptor;
 nPixelFormat : Integer;
begin
 FillChar (pfd, SizeOf (pfd), 0);
 nPixelFormat := ChoosePixelFormat (hdc, @pfd);
 SetPixelFormat (hdc, nPixelFormat, @pfd);
end;



Во второй строке обработчика OnCreate, как ясно из комментария, задается величина типа HGLRC, т. е. создается контекст воспроизведения. Аргументом функции wglCreateContext является ссылка на контекст устройства, на который будет осуществляться вывод. Сейчас устройством вывода служит окно формы. Для получения этого контекста OpenGL необходима величина типа HDC. Здесь, как и во многих других примерах, мы используем факт, что Canvas.Handle и есть ссылка на контекст устройства, связанная с окном формы.

Функция wglCreateContext физически размещается в файле opengl32.dll, а прототип ее находится в файле windows.pas. В этот файл также помещены прототипы всех функций и процедур, имеющих отношение к реализации OpenGL под Windows, а прототипы собственно команд OpenGL расположены в файле opengl.pas.

Функции и процедуры, имеющие отношение только к Windows-версии OpenGL, обычно имеют приставку wgl, как, например, wgicreatecontext, но могут и не иметь такой приставки, как, например, SwapBuffers. Собственно команды OpenGL имеют приставки gl или glu в зависимости от размещения в библиотеках opengl32.dll и glu32.dll, соответственно.
Итак, контекст воспроизведения создан, и теперь можно осуществлять вывод командами OpenGL. Обработка события onPamt выглядит следующим образом:


wglMakeCurrent (Canvas.Handle, hrc); // установить контекст
glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета
wglMakeCurrent (0,0); // освободить контекст
Первая строка делает контекст воспроизведения текущим, т. е. занимает его для последующего вывода. Далее задаем цвет фона. Следующую строку будем понимать как очистку экрана и окрашивание его заданным цветом. После работы освобождаем контекст.
Обработка события onDestroy формы состоит из одной строки:
wglDeleteContext(hrc);


Тем самым мы по завершении работы приложения удаляем контекст воспроизведения, освобождая память.

Вернемся к команде glclearcolor, определяющей цвет фона. У нее четыре аргумента, вещественные числа, первые три из которых задают долю красного, зеленого и синего в результирующем цвете. Согласно справке, все четыре аргумента функции glclearcolor имеют тип GLclampf, соответствующий вещественным числам в пределах от нуля до единицы.
Категория: Delphi | Добавил: LimansK (14.07.2009)
Просмотров: 1438 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

DN™ © 2025
Хостинг от uCoz