OpenGL. Отрисовка примитивов
Вступление
В прошлой статье было рассказано, как инициализировать и закрывать OpenGL. А зачем это всё необходимо? Как ни странно, для рисования на окне программы ;)
А как это делать я сейчас расскажу...
Примитивы
Рисование на окне OpenGL программы осуществляется примитивами, т.е. элементарными геомотрическими фигурами. Всего таких примитивов существует 5 видов, причём каждый из них имеет свои подкатегории:
- точки
- отрезки
- простой отрезок
- неразрывный отрезок
- замкнутый отрезок
- треугольники
- простой треугольник
- связанные треугольники
- "веер треугольников"
- чутырёхугольники
- простой четырёхугольник
- связанные четырёхугольники
- многоугольники
Установка системы координат
Но, для того, чтобы рисовать необходимо определится с системой координат.
Изначально, мы будем работать в 2D пространстве, и вот функция, устанавливающая матрицу проекции для этой системы координат:
procedure Set2D;
begin
glViewport(0,0,800,600); //установка области вывода на экране в пикселах, 800x600 - размеры окна
glMatrixMode(GL_PROJECTION); //режим матрицы - проекция
glLoadIdentity;
//очищение матрицы проекции от всякого хлама
gluOrtho2D(0,800,600,0);
//так как матрица теперь зачищена - можно установить параметры системы координат
glMatrixMode(GL_MODELVIEW); //теперь выбираем матрицу вида модели, т.к. она используется в 3D построениях...
glLoadIdentity
//...то очищаем её!;
end;
|
Этот код необходимо вставить непосредственно перед кодом прорисовки.
А теперь подробнее о каждом виде примитивов.
Точки
Вот так точка выглядит на экране:
Вспомним код из предыдущей статьи:
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
//вот сюда необходимо поместить код рисования
SwapBuffers(h_dc);
|
Итак, вот мы и подобрались к рисованию. Рисование в OpenGL осуществляется указанием системе отдельных вершин примитивов. Вообще, в системе OpenGL вершина представляет собой
совокупность данных. Одна вершина может содержать в себе следующие данные:
- координаты вершны
- цвет вершины
- нормаль к вершине. Используется для расчёта освещения
- текстурные координаты
- и так далее...
По сути, для отображения на экране можно указать только координаты вершины. Но, системе необходимо знать, какой тип примитива вы хотите нарисовать. Для этого существует команда
glBegin
Для рисования точек, необходимо вызвать эту команду с параметром GL_POINTS. Так же существует парная этой команде процедура glEnd .
Таким образом, код рисования одной точки выглядит так:
glBegin(GL_POINTS);
glVertex2f(50,50)
glEnd;
|
В этом коде неизвестная команда только одна: glVertex2f(...)
Эта команда указывает координаты одной вершины. Условно, её можно разбить на 3 части:
- префикс "gl", указывающий, что эта команда относится к библиотеке OpenGL
- значащая часть "Vertex", обозначающая, что эта команда задаёт координаты вершины
- постфикс "2f", показывающий требуемые командой параметры. В данном случае 2f означает, что в неё передаются 2 часла с плавающей запятой (x, y)
По аналогии можно определить команду glColor3f , задающую текущий цвет рисования.
Таким образом, весь код рисования сводится к следующему:
Set2D;
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POINTS);
glColor3f(1,1,1); //параметры этой команды лежат в пределах от 0 до 1,
//и обозначают значения красного, зеленого и синего цветов соответственно!
glVertex2f(50,50);
glEnd;
SwapBuffers(h_dc);
|
Точки осилили. Идём дальше.
Отрезки
Принцип рисования абсолютно токай же, как и в случае с точками. Но в команду glBegin передаётся один из трёх параметров:
- GL_LINES - для рисования отдельных отрезков
- GL_LINE_STRIP - для рисования связанных отрезков
- GL_LINE_LOOP - для рисования замкнутых отрезков
И, естественно, между командами glBegin и glEnd указываются более одной вершины.
А вот так эти отрезки выглядят на зкране:
|
В этом случае использован параметр GL_LINES. Как видно, вершины соединяются попарно.
|
|
В этом случае использован параметр GL_LINE_STRIP. Как видно, вершины соединяются последовательно, одна за другой.
|
|
В этом случае использован параметр GL_LINE_LOOP. Как видно, вершины соединяются последовательно, одна за другой, и первая вершина соединяется с последней.
|
Треугольники
Отрисовка закрашенных треугольников. Параметры команды glBegin :
- GL_TRIANGLES. простой треугольник
- GL_TRIANGLE_STRIP. связанные треугольники
- GL_TRIANGLE_FAN. "веер треугольников"
Число вершин между glBegin и glEnd должно быть больше или равно трём.
Вот, как это выглядит на экране:
|
В этом случае использован параметр GL_TRIANGLES. Как видно, две вершины не участвуют в прорисовке, т.к. число вершин при таком режиме рисования должно быть кратно трём.
|
|
В этом случае использован параметр GL_TRIANGLE_STRIP. Каждая новая вершина образует треугольник с двумя предыдущими, т.е. получаются треугольники 1-2-3, 2-3-4, 3-4-5.
|
|
Здесь использован параметр GL_TRIANGLE_LOOP. Каждая новая вершина образует треугольник с первой и предыдущей, т.е. получаются треугольники 1-2-3, 1-3-4, 1-4-5.
|
Заключение
Я умышленно не стал рассматривать четырёхугольники и многоугольники, т. к. они при прорисовке всё равно разбиваются на треугольники, и работают медленнее, чем отрисовка с параметром GL_TRIANGLE[XXX]
На этом статью я считаю законченной, в следующей статье я расскажу о том, как организавать высокоэффективное приложение для отрисовки графики на OpenGL, и о том, каким образом можно загружать и использовать текстуры.
Примеры к этой статье:
исходник бинарник
Автор: Zealot
|