Chapter 3
Рисуем простые объекты

3.3  Линии

     Для линий вы также можете изменять ширину, цвет, размер, сглаживание. Если вы зададите разные цвета для начала и конца линии, то ее цвет будет переливающимся. OpenGL по умолчанию делает интерполяцию. Так же вы можете рисовать прерывистые линии, делается это путем наложения маски при помощи следующей функции:

void glLineStipple(GLint factor, GLushort pattern   );

     Второй параметр задает саму маску. Например, если его значение равно 255(0x00FF), то, чтобы вычислить задаваемую маску, воспользуемся калькулятором. В двоичном виде это число выглядит так: 0000000011111111, т.е. всего 16 бит. Старшие восемь установлены в ноль, значит тут линии не будет. Младшие установлены в единицу, тут будет рисоваться линия. Первый параметр определяет, сколько раз повторяется каждый бит. Скажем, если его установить равным 2, то накладываемая маска будет выглядить так:

00000000000000001111111111111111
Далее приведен исходный текст с комментариями для наглядной демонстрации, что к чему.
glLineWidth(1);       // ширину линии
                      // устанавливаем 1
 glBegin(GL_LINES);

  glColor3d(1,0,0);     // красный цвет
  glVertex3d(-4.5,3,0); // первая линия
  glVertex3d(-3,3,0);

  glColor3d(0,1,0);     // зеленый
  glVertex3d(-3,3.3,0); // вторая линия
  glVertex3d(-4,3.4,0);

 glEnd();


 glLineWidth(3);      // ширина 3
 glBegin(GL_LINE_STRIP); // см. ниже

  glColor3d(1,0,0);
  glVertex3d(-2.7,3,0);
  glVertex3d(-1,3,0);

  glColor3d(0,1,0);
  glVertex3d(-1.5,3.3,0);
  glColor3d(0,0,1);
  glVertex3d(-1,3.5,0);

 glEnd();


 glLineWidth(5);
 glEnable(GL_LINE_SMOOTH);
 glEnable(GL_LINE_STIPPLE); // разрешаем рисовать
                            // прерывистую линию
 glLineStipple(2,58360);    // устанавливаем маску
                            // пояснения см. ниже


 glBegin(GL_LINE_LOOP);

  glColor3d(1,0,0);
  glVertex3d(1,3,0);
  glVertex3d(4,3,0);

  glColor3d(0,1,0);
  glVertex3d(3,2.7,0);
  glColor3d(0,0,1);
  glVertex3d(2.5,3.7,0);

  glEnd();

 glDisable(GL_LINE_SMOOTH);
 glDisable(GL_LINE_STIPPLE);