Рис. 4.33. Разделение вогнутого многоугольника (панель о) на набор треугольников (панель 6) приводит к изображению сторон треугольников (пунктирные линии), из которых состоит исходный многоугольник Еще один способ устранения эффекта сшивки на краях многоугольника - использовать буфер шаблонов OpenGL для ограничения области закрашивания внутренней части многоугольника, чтобы она не накладывалась на стороны. Однако этот метод сложнее и, в общем случае, медленнее, поэтому метод сдвига глубины многоугольника является более предпочтительным.
Чтобы с помощью стандартных процедур OpenGL изобразить вогнутый многоугольник, его сначала нужно разделить на набор выпуклых многоугольников. Как правило, вогнутый многоугольник делится на набор треугольников с помощью методов, описанных в разделе 3.15. После этого вогнутый многоугольник изображается как закрашенная фигура. Аналогично, если требуется показать только вершины многоугольника, отображаются вершины треугольников. Отметим, что для того, чтобы изобразить исходный вогнутый многоугольник в виде контура, нельзя просто задать режим изображения как GL_LINE, поскольку при этом будут изображаться все стороны треугольников, из которых состоит исходный вогнутый многоугольник (рис. 4.33).
К счастью, в пакете OpenGL есть механизм, который позволяет удалять выделенные стороны с контурного изображения. Каждая вершина многоугольника записывается с однобитовым флагом, который сообщает о том, соединена ли эта вершина со следующей вершиной граничной стороной многоугольника. Таким образом, все, что нам нужно, - это перевести этот флаг в положение “выключено”, и тогда сторона, следующая за этой вершиной, изображаться не будет. Флаг для стороны устанавливается с помощью следующей функции.
glEdgeFlag (flag); Чтобы показать, что за вершиной нет граничной стороны, параметру flag присваивается значение константы OpenGL GL_FALSE. Этот подход применяется ко всем последовательно задаваемым вершинам до следующего вызова функции glEdgeFlag. Константа OpenGL GL_TRUE возвращает флаг в исходное положение, которое устанавливается по умолчанию. Отметим, что функция glEdgeFlag может помещаться внутри пары glBegin/glEnd. В качестве иллюстрации применения флагов сторон приведен следующий фрагмент программы, в котором изображаются только две стороны заданного треугольника (рис. 4.34).
Рис. 4.34. Треугольник (панель а) можно изобразить таким образом, как показано на панели б, присвоив флагу стороны для вершины у2 значение СЬ_РАЬЗЕ и предполагая, что вершины задаются в направлении против часовой стрелки
glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); glBegin (GL_POLYGON); glVertex3fv (vl); glEdgeFlag (GL_FALSE); glVertex3fv (v2); glEdgeFlag (GL_TRUE); glVertex3fv (v3); glEnd ( ); Флаги сторон многоугольников также задаются как массивы, которые можно объединять или связывать с массивом вершин (разделы 3.17 и 4.3). Существуют такие операторы создания массива флагов.
glEnableClientState (GL_EDGE_FLAG_ARRAY); glEdgeFlagPointer (offset, edgeFlagArray); Параметр offset показывает количество битов между значениями флагов сторон в массиве edgeFlagArray. По умолчанию значение параметра offset равно 0.