≪
≫

Грани плоских многоугольников

Каждый плоский многоугольник имеет две стороны - лицевую и обратную. Если посмотреть на поверхность многоугольника и описать его списком вершин обходя многоугольник против хода часовой стрелки, то такая грань называется лицевой. В противном случае - обратной. Очевидно, что лишь одна грань многоугольника может быть видна. Чтобы не делать лишней работы на невидимых гранях объекта, необходимо эту ситуацию отслеживать. По умолчанию в OpenGL считается, что многоугольник задается вершинами против часовой стрелки. Но это правило можно изменить командой

void glFrontFace (GLenum mode)

Значением параметра mode можно изменять правило задания вершин для лицевых граней. Если этот параметр принимает значение символьной константы GL_CW, то признак лицевой грани - обход вершин по часовой стрелке и GL_CCW - против часовой стрелки.

Лицевые или обратные грани можно целенаправленно исключать из процесса вывода полигонов. Рассмотрим команду, осуществляющую управление выводом полигонов в зависимости от типа грани:

void glCullFace (GLenum mode)

Если значение параметра mode равно GL_FRONT, то не будут отображаться лицевые грани. Также возможны значения GLJBACK и GL_FRONT_AND_BACK. По умолчанию берется значение GL_BACK, т.е. выводить только лицевые грани. Перед тем как использовать glCull-Face() необходимо выполнить команду glEnable(GL_CULL_FACE), которая разрешит использовать данный режим. Блокировка данного режима осуществляется командой glDisable(GL_CULL_FACE).

Рассмотрим небольшой пример работы с лицевыми и обратными гранями полигонов:

glEnable(GL_CULL_FACE); // Вкл. режим упр. выводом граней

//glCullFace(GL_FRONT); И Исключить вывод лицевых граней g!Color3f(1.0f, O.Of, O.Of); // Красный цвет для треугольника glBegin(GL_TRIANGLES); // Треугольник (против часовой)

glVertex3i(100, 100, 0); //Вершина 1

glVertex3i(50, 50, 0); // Вершина 2

glVertex3i(150, 50, 0); // Вершина 3

glEnd();

glColor3f(0.0f, 1 .Of, O.Of); // Зеленый цвет для прямоугольника glBegin(GL_QUADS); И Прямоугольник (по часовой)

glVertex3i(200, 100, 0); И Вершина 1

glVertex3i(250, 100, 0); // Вершина 2

glVertex3i(250, 50, 0); // Вершина 3 glVertex3i(200, 50, 0); // Вершина 4 glEnd();

Если посмотреть на результат работы данного фрагмента программы, то можем увидеть на экране только красный треугольник, так как зеленый прямоугольник был отброшен (по умолчанию в данном режиме отбрасываются обратные грани полигонов). Если разблокировать команду glCull-Face(GL_FRONT) (убрать комментарии), то на экране вместо треугольника появится прямоугольник зеленого цвета. Его описание соответствует нелицевой грани.

 
Посмотреть оригинал