Опубликован: 02.12.2011 | Уровень: специалист | Доступ: платный
Лекция 4:

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

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

Основная функция формирования изображения

Формирование изображения выполняется при каждом обновлении изображения формы в программе на Object Pascal (Delphi) и обновлении изображения компонента GLControl библиотеки OpenTK в программе на C#. Обычно для этого используется обработчик события формы OnPaint в программе на Object Pascal (Delphi) и обработчик события Paint компонента GLControl в программе на C#.

Ниже приведены примеры соответствующих обработчиков событий ( пример 3.4 и пример 3.5).

procedure TForm1.FormPaint(Sender: TObject);
begin
  glClearColor (0.5, 0.5, 0.75, 1.0); // цвет фона
  // очистка буферов цвета и глубины
  glClear (GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT);
  // поворот изображения
  glLoadIdentity;
  glRotatef(AngleX, 1.0, 0.0, 0.0);
  glRotatef(AngleY, 0.0, 1.0, 0.0);
  glRotatef(AngleZ, 0.0, 0.0, 1.0);
  // формирование изображения
  glBegin (GL_LINES);
    glColor3f(1, 0, 0); glVertex3f (-1, 0, 0); glVertex3f (1, 0, 0);
    glColor3f(0, 1, 0); glVertex3f (0, -1, 0); glVertex3f (0, 1, 0);
    glColor3f(0, 0, 1); glVertex3f (0, 0, -1); glVertex3f (0, 0, 1);
  glEnd;
  // завершение формирования изображения
  glFlush;
  glFinish;
  SwapBuffers(DC);
end;
Листинг 3.4. Пример формирования изображения в обработчике события OnPaint формы в приложении на Object Pascal (Delphi)
private void glControl1_Paint(object sender, PaintEventArgs e)
{
GL.ClearColor(0.5f, 0.5f, 0.75f, 1.0f); // цвет фона
// очистка буферов цвета и глубины
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
// поворот изображения
GL.LoadIdentity();
GL.Rotate(AngleX, 1.0, 0.0, 0.0);
GL.Rotate(AngleY, 0.0, 1.0, 0.0);
GL.Rotate(AngleZ, 0.0, 0.0, 1.0);
// формирование изображения
GL.Begin(BeginMode.Lines);
GL.Color3(1f, 0f, 0f); GL.Vertex3(-1f, 0f, 0f); GL.Vertex3(1f, 0f, 0f);
GL.Color3(0f, 1f, 0f); GL.Vertex3(0f, -1f, 0f); GL.Vertex3(0f, 1f, 0f);
GL.Color3(0f, 0f, 1f); GL.Vertex3(0f, 0f, -1f); GL.Vertex3(0f, 0f, 1f);
GL.End();
// завершение формирования изображения
GL.Flush();
GL.Finish();
glControl1.SwapBuffers();
}
Листинг 3.5. Пример формирования изображения в обработчике события Paint компонента GLControl в приложении на C#

Для формирования изображения OpenGL использует несколько буферов, содержание которых формируется самой библиотекой. Изменение этих буферов и доступ к ним осуществляется с помощью команд библиотеки OpenGL. Основными буферами являются буфер цвета и буфер глубины. В буфере цвета формируется изображение. Буфер глубины используется для реализации алгоритмов отсечения и позволяет отображать объекты в пространстве с учётом их удаленности от наблюдателя. Кроме того, библиотека реализует другие буфера, например, буфера трафарета и текстуры, левый и правый буфер цвета, буфер накопления.

В листингах 3.4 и пример 3.5 сначала вызывается команда ClearColor, которая определяет цвет фона изображения. В качестве параметров указываются красная (параметр red), зеленая (параметр green) и синяя (параметр blue) составляющие цвета:

ClearColor (red, green, blue, alpha: GLclampf)

Значения параметров должны находиться в интервале от 0 до 1, включая граничные значения. Значение 0 соответствует минимальной интенсивности соответствующей составляющей цвета, значение 1 – максимальной интенсивности. Если значение параметра не соответствует указанному интервалу, то оно округляется до ближайшего граничного значения (0 или 1). Четвертый параметр alpha используется для реализации различных визуальных эффектов, например, прозрачности. Если подобные эффекты не используются, то параметр alpha должен быть равен 1.

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

procedure glClearColor (red, green, blue, alpha: GLclampf);

В C# для этого используется статический метод класса GL библиотеки OpenTK:

void ClearColor(float red, float green, float blue, float alpha);

Перед формированием изображения необходимо очистить буфера цвета и глубины. Для этого используется вызов команды Clear:

Clear (mask: GLbitfield)

Команда Clear выполняет очистку буферов, которые определяются в качестве параметра mask.

В Object Pascal (Delphi) выполнение команды Clear реализуется с помощью процедуры:

procedure glClear (mask: GLbitfield);

Для определения каждого очищаемого буфера используется целочисленная константа. Если необходимо очистить несколько буферов, то в качестве параметра задается сумма констант этих буферов.

В листинге 3.5 в качестве параметра процедуры glClear передается сумма двух констант:

GL_COLOR_BUFFER_BITбуфер цвета, в котором формируется изображение;

GL_DEPTH_BUFFER_BITбуфер глубины, который используется для отбора примитивов в зависимости от удалённости от точки наблюдения (см. раздел 3.1).

В C# для реализации команды Clear используется статический метод класса GL библиотеки OpenTK:

void Clear(ClearBufferMask mask);

Значение параметра mask представляет собой перечисление типа ClearBufferMask. Для очистки буферов цвета и глубины используется сумма двух значений:

  • ClearBufferMask.ColorBufferBit - буфер цвета;
  • ClearBufferMask.DepthBufferBit – буфер глубины.

Далее в листингах 3.4 и пример 3.5 формируется изображение трех отрезков разного цвета, направление которых совпадает с направлением декартовых осей координат в пространстве.

Формирование отрезков начинается с вызова команды Begin.

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

procedure glBegin (mode: GLenum);

В качестве параметра ей передается целочисленная константа, которая определяет графический примитив (точки, отрезки, треугольники, четырехугольники, многоугольники), который будет формироваться. В данном случае используется константа GL_LINES для формирования отрезков.

В C# для реализации команды Begin используется статический метод класса GL:

void Begin(BeginMode mode);

Формируемый примитив определяется с помощью значения перечисления BeginMode. Для формирования отрезков используется значение этого перечисления Lines.

Затем выполняется вызов команды Vertex для задания координат вершин отрезков.

В Object Pascal для реализации команды Vertex используется несколько процедур с различными параметрами. В примере используется одна из этих процедур, которая в качестве параметров принимает три вещественных значения:

procedure glVertex3f (x,y,z: GLfloat);

В C# для этого используется один из статических методов класса GL:

void Vertex3(float x, float y, float z);

Каждая пара команд Vertex формирует отдельный отрезок. Команде Vertex передаются в качестве параметров три значения, определяющие декартовые координаты вершины.

Формирование отрезков завершается с помощью команды End.

В Object Pascal команда реализована с помощью процедуры:

procedure glEnd;

В C# для реализации команды End используется статический метод класса GL:

void End();

Библиотека OpenGL может формировать изображение в одном из двух режимов: с освещением и без освещения. По умолчанию режим освещения отключён. В режиме без освещения цвет примитивов может задаваться с помощью команды Color.

В листинге 3.5 для выполнения этой команды вызывается процедура:

procedure glColor3f (red, green, blue: GLfloat);

В примере программы на C# ( пример 3.4) для этого используется один из статических методов класса GL:

void Color3(float red, float green, float blue);

В качестве параметров команды Color задаются красная (параметр red), зеленая (параметр green) и синяя (параметр blue) составляющие цвета.

Значения параметров должны находиться в интервале от 0 до 1, включая граничные значения.

Команды Flush и Finish используются для завершения формирования изображения. Команда Flush информирует библиотеку OpenGL о том, что все параметры изображения были переданы. Так как изображение может быть довольно сложным, то для его формирования может потребоваться некоторое время. Команда Finish приостанавливает работу программы до завершения формирования изображения библиотекой OpenGL.

Приложение на Object Pascal (Delphi) пока еще не выполняет освобождение ресурсов, используемых операционной системой для работы с библиотекой OpenGL. Поэтому при повторном запуске программы возможно некорректное формирование изображения. Для исправления ситуации потребуется перезагрузить компьютер. В дальнейшем, чтобы это не повторялось, необходимо выполнить действия, описанные в разделе 3.6.
< Лекция 3 || Лекция 4: 1234 || Лекция 5 >
Владислав Нагорный
Владислав Нагорный

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

Спасибо!

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

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

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

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

 

Денис Сафронов
Денис Сафронов
Россия
жылдыз насырбекова
жылдыз насырбекова
Киргизия, бишкек