Любую трёхмерную фигуру, какая бы сложная она не была, можно разбить на двухмерные (плоские) составляющие. Эти составляющие я и буду называть примитивами, хотя некоторые авторы считают, что примитивами следует обозвать вышеперечисленные трёхмерные фигуры.
Примитивы определяются одной или несколькими точками, которые в OpenGL задаются внутри командных скобок glBegin/glEnd:
С++ |
void glBegin(mode); void glEnd(); |
Delphi |
procedure glBegin(mode); procedure glEnd; |
Параметр mode показывает, какие примитивы будут рисоваться. Доступны следующие значения:
GL_POINTS |
Каждая вершина – отдельная точка |
GL_LINES |
Каждая пара вершин – отдельная линия. Если число вершин нечётно, то последняя игнорируется |
GL_LINE_STRIP |
Последовательность связанных отрезков. Первые две вершины – первый отрезок. Третья вершина определяет второй отрезок с началом в конце первого и концом в этой вершине и т.д |
GL_LINE_LOOP |
Аналогичен GL_LINE_STRIP, только последняя вершина соединяется отрезком с первой. |
GL_TRIANGLES |
Каждая тройка вершин – отдельный треугольник |
GL_TRIANGLE_STRIP |
Группа связанных треугольников. Первые три вершины – первый треугольник. Вторая, третья и четвёртая вершины - второй треугольник и т.д. |
GL_TRIANGLE_FAN |
Также группа связанных треугольников. Первые три вершины – первый треугольник. Первая, вторая и четвёртая вершины - второй треугольник и т.д. |
GL_QUADS |
Каждые четыре вершины – отдельный четырёхугольник. |
GL_QUAD_STRIP |
Группа связанных четырёхугольников. Первые четыре вершины – первый четырёхугольник. Третья, четвёртая, пятая и шестая вершины – второй четырёхугольник и т.д. |
GL_POLYGON |
Рисует отдельный выпуклый многоугольник (один). |
Особое внимание нужно уделить GL_QUAD_STRIP. Здесь не совсем понятный, но очень удобный порядок указания вершин:
У каждого примитива есть минимальное число вершин. Если указанное число вершин меньше минимального для данного примитива, то примитив не рисуется.
Осталось только сказать, как задать вершину. Для этого определена следующая процедура:
glVertex[2 3 4][s i f d][v](coord)
Вершина определяется четырьмя параметрами: координаты x, y, z и параметр w – коэффициент, на который делится каждая из координат, т.е. w определяет масштаб. По умолчанию z=0, w=1, т.е когда вы вызываете, например, glVertex2f(1,1) на самом деле вызывается glVertex4f(1,1,0,1).
С каждой вершиной связаны некоторые данные:
· Текущий цвет – цвет вершины (окончательный цвет высчитывается с учётом света). Цвет задаётся процедурой glColor*
· Текущие координаты текстуры – координаты текстуры, соответствующие этой вершине. Задаются процедурой glTexCoord*
· Текущая нормаль – вектор нормали, соответствующий данной вершине. Задаётся процедурой glNormal*
· Текущая позиция растра – используется для определения положения растра при работе с пикселями и битовыми массивами. задаётся процедурой glRasterPos*
ПРИМЕЧАНИЕ: вместо звёздочки ‘*’ ставятся соответствующие суффиксы; такое сокращение принято во многих документациях по OpenGL.