Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Структура приложений, использующих OpenGL
Определение области вывода изображения и матрицы проекции
Определение области вывода является необходимым для вывода изображения. Без определения области вывода изображение не будет отображаться. Область вывода изображения определяется с помощью команды 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.