При помощи процедуры
void glCullFace ( GLenum mode );
вывод лицевых или нелицевых многоугольников можно запретить. Параметр mode принимает одно из значений GLJFRONT (оставить только лицевые грани). GL_BACK (оставить нелицевые) или GL FRONT ANDBACK (оставить все грани). Для отсечения граней необходимо разрешить отсечение при помощи команды glEnable ( GL_CULL_FACE ); Шаблон для заполнения грани можно задать при помощи процедуры void gIPolygonStipple ( const GLubyte * mask ); '
где mask задает массив битов размером 32 на 32. Для разрешения использования шаблонов при выводе многоугольников служит команда glEnable ( GL_POLYGONjSTIPPLE );
12. Работа с библиотекой OpenGL
Свой вектор нормали для каждой вершины можно задать при помощи одной из следующих процедур:
void glNormal3{b s і d f}( TYPE nx, TYPE ny, TYPE nz ); void glNormal3{b s і d f}v ( const TYPE * v );
В версиях с суффиксами b, s или / значения аргументов масштабируются в отрезок [-1,1].
В качестве примера приведем процедуру, строящую прямоугольный параллелепипед с ребрами, параллельными координатным осям, по диапазонам изменения х, у и z.
(21 // File drawbox.cpp
void drawBox ( GLfloat x1, GLfloat x2, GLfloat y1, GLfloat y2, GLfloat z1, GLfloat z2 )
{
gIBegin ( GL_POLYGON ); // front face
glNorma!3f ( 0.0, 0.0, 1.0 );
glVertex3f (x1, y1, z2 );
g!Vertex3f ( x2, y1, z2 );
glVertex3f ( x2, y2, z2 );
glVertex3f ( x1, y2, z2 ); glEnd ();
gIBegin ( GL_POLYGON ); // back face
glNormal3f (0.0, 0.0,-1.0 );
glVertex3f (x2, y1, z1 );
glVertex3f (x1, y1, z1 );
glVertex3f (x1, y2, z1 );
glVertex3f ( x2, y2, z1 ); glEnd ();
gIBegin ( GL_POLYGON ); // left face
glNormal3f (-1.0, 0.0, 0.0 );
glVertex3f ( x1, y1, z1 );
glVertex3f (x1, y1, z2 );
glVertex3f ( x1, y2, z2 );
glVertex3f (x1,y2, z1 ); glEnd ();
gIBegin ( GL_POLYGON ); // right face
glNorma!3f (1.0, 0.0, 0.0 );
glVertex3f ( x2, y1, z2 );
glVertex3f ( x2, y1, z1 );
glVertex3f ( x2, y2, z1 );
glVertex3f ( x2, y2, z2 ); glEnd ();
gIBegin ( GL_POLYGON ); // toD face
glNorma!3f ( 0.0, 1.0, 0.0 );