Опубликован: 02.12.2011 | Доступ: свободный | Студентов: 980 / 117 | Оценка: 5.00 / 4.00 | Длительность: 09:26:00
Специальности: Программист
Теги: .net, open source, opengl
Лекция 4:

Структура приложений, использующих OpenGL

< Лекция 3 || Лекция 4: 1234 || Лекция 5 >

Определение области вывода изображения и матрицы проекции

Определение области вывода является необходимым для вывода изображения. Без определения области вывода изображение не будет отображаться. Область вывода изображения определяется с помощью команды OpenGL:

Viewport (x,y: GLint; width, height: GLsizei)

В приведённых ниже примерах выполняется определение матрицы проекции с помощью команды Ortho, которая формирует ортогональную проекцию с областью видимости от -1 до 1 вдоль каждой из осей координат. Более подробно формирование матрицы проекции описано в "Координатные преобразования в OpenGL" .

Библиотека OpenTK, C#

В библиотеке OpenTK для этого применяется статический метод класса GL (C#):

void Viewport(int x, int y, int width, int height);

Координаты области вывода задаются относительно компонента GLControl и область вывода ограничивается размерами этого компонента.

Параметры команды имеют следующие значения:

  • x, y – координаты левой верхней вершины прямоугольной области отображения в координатах компонента GLControl;
  • width, height – ширина и высота области вывода в границах компонента GLControl.

Обычно вызов метода GL.Viewport выполняется в обработчике события изменения размера компонента GLControl ( пример 3.2).

private void glControl1_Resize(object sender, EventArgs e)
{
GL.Viewport(0, 0, glControl1.Width, glControl1.Height);
GL.MatrixMode(MatrixMode.Projection);
GL.LoadIdentity();
GL.Ortho(-1, 1, -1, 1, -1, 1);
GL.MatrixMode(MatrixMode.Modelview);
glControl1.Invalidate();
}
Листинг 3.2. Пример определения области вывода для компонента GLControl библиотеки OpenTK

В конце листинга 3.2 вызывается метод компонента GLControl:

void Invalidate();

Метод инициализирует событие Paint компонента GLControl, в обработчике которого выполняется обновление изображения с учетом изменения размеров компонента.

Object Pascal (Delphi)

В программе на Object Pascal для реализации команды Viewport используется процедура:

procedure glViewport (x,y: GLint; width, height: GLsizei);

Команда определяет область вывода изображения в координатах окна, для которого был установлен текущий контекст отображения с помощью функции wglMakeCurrent.

Параметры команды имеют следующие значения:

  • x, y – координаты левой верхней вершины прямоугольной области отображения в координатах окна;
  • width, height – ширина и высота области вывода в координатах окна.

Обычно вызов процедуры glViewport выполняется в обработчике формы изменения размера окна OnResize ( пример 3.3). Это позволяет корректировать размеры области вывода в соответствии с размерами формы.

procedure TForm1.FormResize(Sender: TObject);
begin
  // Установка области вывода
  glViewPort (0, 0, ClientWidth, ClientHeight);
  // задание матрицы проекции
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glOrtho(-1, 1, -1, 1, -1, 1);
  glMatrixMode(GL_MODELVIEW);
  // перерисовка изображения
  InvalidateRect(Handle, nil, False);
end;
Листинг 3.3. Пример изменения области вывода изображения в обработчике события формы OnResize

В листинге 3.3 выполняется вывод изображения на всю клиентскую часть формы, поэтому в качестве параметров процедуры glViewPort указываются размеры клиентской области формы: ClientWidth и ClientHeight.

В конце обработчика FormResize ( пример 3.3) вызывается системная функция:

function InvalidateRect(hWnd: HWND; lpRect: PRect; bErase: BOOL): BOOL;

Она используется для перерисовки изображения после изменения размера области вывода. Функция InvalidateRect посылает форме, дескриптор которой передается в качестве первого параметра hWnd, сообщение, которое приводит к возникновению события OnPaint. В обработчике события OnPaint формируется изображение. Второй параметр определяет прямоугольную область формы для обновления. Если это значение равно nil, то обновляется вся клиентская область формы. Последний параметр bErase определяет: будет ли операционная система обновлять фон формы. При выводе изображения средствами OpenGL это не требуется, поэтому этот параметр равен False.

Вместо использования функции InvalidateRect можно было бы попробовать использовать метод Repaint формы, но он обновляет фон формы, и поэтому его вызов будет приводить к эффекту мелькания изображения.
< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?