Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СКТ - 5,6сем.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
8.67 Mб
Скачать

Библиотека OpenGl

OpenGL – это стандартная библиотека для всех 32-разрядных операционных систем.

В Delphi код, написанный как обработчик события OnCreate, выполняется при получении приложением сообщения WM_CREATE и т.д.

Все окна при создании регистрируются в операционной системе и получают дескриптор типа HWND.

Ссылка на контекст устройства – это величина типа HDC. Ссылке соответствует свойство Canvas.Handel формы. В OpenGL имеется понятие - ссылка на контекст воспроизведения (тип HGLRC), аналогичное ссылке на контекст устройства.

Библиотека OpenGL является переносимой по отношению к платформам, ОС и средам программирования. Для обеспечения независимости в ней определены собственные типы с префиксом GL. Типы в OpenGL: GLint, GLfloat, GLdouble. Для массивов введены специальные типы: TGLArrayf4=array[0..3] of GLfloat;

Функции и процедуры имеют следующий синтаксис:

CommandName[1234][b s i f d ub us ui]

byte, short, int, float, double, unsigned byte, unsigned short, unsigned int

Например, glColor3i команда с тремя целыми аргументами.

Простейшая программа

Список uses необходимо самостоятельно дополнить модулем OpenGL.

private

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

end;

Необходимы обработчики следующих событий: OnCreate, OnPaint, OnResize, OnDestroy. Обработчики событий вывода и изменения размеров могут быть одинаковыми.

Создание формы

procedure TfrmGL.FormCreate(Sender: TObject);

begin

SetDCPixelFormat(Canvas.Handle); задаем формат пикселя, это обращение к соответствующей процедуре (см. ниже).

hrc := wglCreateContext(Canvas.Handle); создаем контекст воспроизведения, аргументом является ссылка на контекст устройства, на который будет осуществляться вывод. Сейчас устройством вывода служит окно формы.

end;

Вывод картинки:

procedure TfrmGL.FormPaint(Sender: TObject);

begin

wglMakeCurrent(Canvas.Handle, hrc); установить контекст

glViewPort (0, 0, ClientWidth, ClientHeight); // область вывода

glClearColor (0.9, 0.1, 0.75, 1.0); // цвет фона RGB (0-1)

glClear (GL_COLOR_BUFFER_BIT); // очистка буфера цвета

wglMakeCurrent (0, 0); освободить контекст

end;

Чтобы при изменении размеров окна картинка не изменялась, у события OnResize должен быть такой же обработчик, что и у OnPaint.

Завершение работы приложения:

procedure TfrmGL.FormDestroy(Sender: TObject);

begin

wglDeleteContext(hrc); удаление контекста

end;

Формат пикселя

Специальная структура TPixelFormatDescriptor представляет данные формата пикселей. Полям структуры присваиваются желаемые значения, затем вызовом функции ChoosePixelFormat осуществляется запрос системе, поддерживается ли данном рабочем месте выбранный формат пикселей, выбирается наиболее совпадающий формат с описанным в структуре, на которую указывает pfd, и, наконец, вызовом функции SetPixelFormat устанавливается заданный формат в контексте устройства.

procedure SetDCPixelFormat (hdc : HDC);

var

pfd : TPixelFormatDescriptor;

nPixelFormat : Integer;

begin

FillChar (pfd, SizeOf (pfd), 0);

// здесь можно добавить флаги

nPixelFormat := ChoosePixelFormat (hdc, @pfd);

SetPixelFormat (hdc, nPixelFormat, @pfd);

end;

Здесь явно не заданно ни одно из полей структуры, но можно добавить строку флагов:

pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;

  1. разрешено рисование в окне или на поверхности устройства

  2. поддерживает рисование OpenGL.

  3. поддерживает режим двойной буферизации. Вывод осуществляется не на экран, а в память, затем содержимое буфера выводится на экран (позволяет избежать мерцания).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]