Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Основные графические примитивы OpenGL и их свойства
Цель лекции: Научиться использовать основные примитивы OpenGL для формирования изображения.
Примеры на C# (WinForms) и Object Pascal (Delphi)
Пример № 4.1 Пример демонстрирует формирование несвязанных отрезков.
Пример № 4.2 Пример демонстрирует формирование замкнутой ломаной.
Пример № 4.3 Пример демонстрирует формирование несвязанных треугольников.
Пример № 4.4 Пример демонстрирует формирование треугольников с общими гранями.
Пример № 4.5 Пример демонстрирует формирование треугольников с общей вершиной.
Пример № 4.6 Пример демонстрирует формирование несвязанных четырехугольников.
Пример № 4.7 Пример демонстрирует формирование четырехугольников с общими гранями.
Пример № 4.8 Пример демонстрирует формирование многоугольника.
Пример № 4.9 Пример демонстрирует построение графика функции y = z*Sin(x*n) с возможностью изменения коэффициентов n и z с помощью клавиатуры.
В OpenGL все изображения формируются из графических примитивов, основными из которых являются точки, отрезки, треугольники, четырехугольники, многоугольники. Базовым графическим примитивом для построения сложных объёмных изображений является треугольник. Такие примитивы как четырехугольники и многоугольники хотя и создаются с помощью отдельных команд, но формируются библиотекой OpenGL из набора треугольников. Необходимая детализация сложных изображений достигается за счет уменьшения размера примитивов, из которых строится изображение, и увеличения их количества.
Формирование примитива начинается с вызова команды Begin и передачи ей в качестве значения параметра mode целочисленной константы, которая определяет формируемый примитив:
Begin (mode: GLenum);
В Object Pascal для реализации команды Begin используется процедура
procedure glBegin (mode: GLenum);
Например, для формирования точек используется константа GL_POINTS, для формирования отрезков –константа GL_LINES.
В библиотеке OpenTK для реализации команды Begin используется статический метод класса GL (C#):
void Begin(BeginMode mode);
Формируемый примитив определяется с помощью элемента перечисления BeginMode. Для формирования точек используется значение этого перечисления Points, для формирования отрезков – значение Lines.
Формирование примитивов завершается с помощью команды End.
В Object Pascal эта команда реализуется с помощью процедуры:
procedure glEnd;
В библиотеке OpenTK для реализации команды End используется статический метод класса GL (C#):
void End();
Все примитивы состоят из набора вершин. Для задания расположения вершин в пространстве используются нормализованные координаты.
Координаты каждой вершины определяются с помощью команды OpenGL:
Vertex[2 3 4][s i f d]
Вызов этой команды должен выполняться межу вызовами команд Begin и End, иначе команда Vertex будет проигнорирована библиотекой.
Команда может иметь от 2 до 4 параметров. Если команда имеет три параметра, то ей передаются декартовые координаты вершин. В варианте команды с двумя параметрами они соответствуют декартовым координатам по оси OX и OY, координата по оси OZ принимается равной нулю.
В Object Pascal команда Vertex реализована набором процедур, объявление двух из них приведено ниже:
procedure glVertex2d (x,y: GLdouble); procedure glVertex3d (x,y, z: GLdouble);
В библиотеке OpenTK команда реализуется с помощью статических методов класса GL с различным числом параметров и типами данных. Объявление двух из них приведено ниже.
void Vertex2(double x, double y); void Vertex3(double x, double y, double z);
Необходимо обратить внимание на то, что для каждого вызова команды Begin должен быть соответствующий вызов команды End. Их можно сравнить с парой операторов begin и end языка Pascal, которые так же являются парными. Но в отличие от них для команд Begin и End компилятор не проверяет их парность, и эта задача ложится полностью на программиста. При несоблюдении парности вызовов команд Begin и End часто возникают довольно сложно выявляемые ошибки в формировании изображения.
Точки
Для формирования точек в качестве значения параметра mode команды Begin необходимо указать значение:
- константу GL_POINTS в программе на Object Pascal;
- значение Points перечисления BeginMode в программе на C#.
Перед формированием точек могут быть указаны их размер и определён режим сглаживания, который будет использоваться при их отображении. Эти параметры должны быть установлены перед вызовом команды Begin.
Размер точки
Размер точки может быть установлен с помощью команды PointSize. В Object Pascal команда реализуется с помощью процедуры:
procedure glPointSize (size: GLfloat);
В библиотеке OpenTK для этого используется статический метод класса GL (C#):
void PointSize(float size);
По умолчанию размер точки равен одному пикселу. Необходимо обратить внимание на то, что хотя координаты точки задаются в масштабе сцены, но размер точки задается в координатах устройства вывода изображения. Связано это с тем, что точки формируются на одном из последних этапов формирования изображения – на этапе растеризации.