Закончив с линиями, перейдем к треугольникам — примитиву, задаваемому константой GL_TRIANGLES. В этом примитиве последующие вершины берутся триплетами, тройками, по которым строится каждый отдельный треугольник.
Следующий код служит иллюстрацией рисования одного треугольника.
glBegin (GL_TRIANGLES);
glVertex2f (-1, -1);
glVertex2f (-1, 1);
glVertex2f (1, 0);
glEnd;
Для рисования правильного шестиугольника из отдельных треугольников код должен выглядеть так:
glBegin (GL_TRIANGLES);
For i := 0 to 5 do begin
glVertex2f (0, 0);
glVertex2f (0.5 * cos (2 * Pi * i / 6),
0.5 * sin (2 * Pi * i / 6));
glVertex2f (0.5 * cos (2 * Pi * (i + 1) / 6),
0.5 * sin (2 * Pi * (i + 1) / 6));
end;
glEnd;
В качестве опорных точек выбраны шесть точек на окружности.
Мы можем перейти к примитиву, задаваемому константой GL_TRIANGLE_STRIP: связанная группа треугольников. Первые три вершины образуют первый треугольник, вершины со второй по четвертую — второй треугольник, с третьей по пятую — третий и т. д.Пример нарисует флажок, образованный наложением двух треугольников (рис. 1):
glBegin (GL_TRIANGLE_STRIP);
glVertex2f (1, 1);
glVertex2f (-1, 1);
glVertex2f (-1, -1);
glVertex2f (1, -1);
glEnd;
Рис. 1. Флаг получается наложением двух отдельных треугольников
Попробуем поэкспериментировать с нашей программой: будем рисовать треугольники разного цвета (проект из подкаталога Ех10):
glBegin (GL_TRIANGLE_STRIP);
glColor3f (0.0, 0.0, 1.0);
glVertex2f (1, 1);
glVertex2f (-1, 1);
glColor3f (1.0, 0.0, 0.0);
glVertex2f (-1, -1);
glVertex2f (1, -1);
glEnd;
Результат окажется неожиданным и живописным: у фигуры возникнет плавный переход синего цвета в красный (рис. 2).
Рис. 2. Плавный переход цвета
Вызов перед командными скобками функции glShadeModel (GL_FLAT) , задающей правило тонирования, избавит от градиентного заполнения фигуры, но результат все равно будет неожиданным — оба треугольника станут красными, т. е. цвета второго из них.
Ознакомившись со справкой по этой команде, мы обнаружим, что для связанных треугольников наложение цветов происходит именно по правилу старшинства цвета второго примитива. Здесь же узнаем, что по умолчанию тонирование задается плавным, как и получилось в предыдущей программе.
Рисование шестиугольника путем наложения треугольников может быть реализовано с помощью следующего кода:
glBegin (GL_TRIANGLE_STRIP);
For i := 0 to 6 do begin
glColor3f (random, random, random);
glVertex2f (0, 0);
glVertex2f (0.5 * cos (2 * Pi * i / 6),
0.5 * sin (2 * Pi * i / 6));
end;
glEnd;
Следующий примитив, определяемый константой GL_TRIANGLE_FAN, также задает последовательно связанные треугольники, однако фигура строится по другому принципу: первая вершина является общей для всех остальных треугольников, задаваемых перечислением вершин, т. е. треугольники связываются наподобие веера.
Для построения шестиугольника с использованием такого примитива цикл надо переписать так:
glBegin (GL_TRIANGLE_FAN);
glVertex2f (0, 0);
For i := 0 to 6 do begin
glColor3f (random, random, random);
glVertex2f (0.5 * cos (2 * Pi * i / 6),
0.5 * sin (2 * Pi * i / 6));
end;
glEnd;
Теперь поговорим о режимах вывода многоугольников.
Для устранения ступенчатости многоугольников используется команда glEnable с аргументом GL_POLYGON_SMOOTH.
Если в примеры на треугольники перед командными скобками поместить строку glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
то треугольники будут рисоваться контурно — только линии
Команда glPolygonMode задает режим воспроизведения для всех типов многоугольников.
Ширину линий контура можно варьировать с помощью glLinewidth, пунктирные линии контура задаются командой glLineStipple.
Команда glPolygonMode позволяет выводить вместо заполненных и контурных многоугольников только их вершины, если ее вторым аргументом взять константу GL_POINT (не путать с GL_POINTS!). Размеры точек вершин и наличие сглаживания у них можно задавать так же, как и для обычных точек. По умолчанию многоугольники строятся заполненными (включен режим GL_FILL).
Мы изучили примитивы "точка", "линия", "треугольник". В принципе, этих римитивов вполне достаточно, чтобы нарисовать все что угодно, пусть подчас и чересчур громоздким способом. Даже более того, остальные примитивы фактически являются усовершенствованными треугольниками и строятся из треугольников, чем и вызваны их некоторые ограничения. Построения на основе треугольников являются оптимальными по своим скоростным показателям: треугольники строятся наиболее быстро, и именно этот формат чаще всего предлагается для аппаратного ускорения.