glColor3f (0.0, 1.0, 0.0);
/* Вызывается процедура создания многоугольника. */
glColor3f (1.0, 0.0, 0.0);
glPolygonMode (GL_FRONT, GL_LINE);
/* Снова вызывается процедура создания многоугольника. */
Для трехмерного многоугольника (у которого не все вершины лежат в плоскости ху) при таком способе изображения сторон закрашенной фигуры могут появиться промежутки между сторонами и внутренней областью. Этот эффект, который иногда называют сшивкой, вызван различиями вычислительных операций алгоритма построчного заполнения и алгоритма построения прямых сторон многоугольника. После закрашивания внутренней области трехмерного многоугольника для каждой точки (х, у) находится значение глубины (расстояния до плоскости ху). Однако на краях многоугольника это значение зачастую отличается от значений глубины, рассчитанных с помощью алгоритма построения прямых линий для тех же самых точек (х, у). Поэтому при проверках на видимость для изображения некоторых точек на границе многоугольника следует пользоваться цветом заполнения, а не цветом сторон.
Один из способов устранения промежутков при изображении сторон трехмерного многоугольника - сместить значения глубины, рассчитанные с помощью процедуры закрашивания, таким образом, чтобы они не накладывались на значения глубины сторон этого многоугольника. Это можно сделать с помощью следующих двух функций OpenGL.
glEnable (GL_POLYGON_OFFSET_FILL); glPolygonOffset (factor!, factor2); Первая функция активизирует процедуру смещения для построчного заполнения, а вторая используется для задания пары значений с плавающей запятой factorl и factor2, которые применяются для вычисления величины сдвига глубины. Этот сдвиг глубины рассчитывается следующим образом:
depthOffset = factorl • maxSlope + factor2 • const, (4.11)
где maxSlope - тангенс максимального угла наклона многоугольника, a const - константа реализации. Для многоугольника, лежащего в плоскости ху, угол наклона равен 0. В противном случае максимальный тангенс угла наклона находится как изменение глубины многоугольника, разделенное либо на изменение величины х, либо на изменение величины у. Как правило, значения этих двух коэффициентов равны либо
0,75, либо 1,0, хотя часто, чтобы получить хороший результат, с этими значениями приходится поэкспериментировать. Для иллюстрации присваивания значений коэффициентам сдвига изменим предыдущий фрагмент программы следующим образом.
glColor3f (0.0, 1.0, 0.0); glEnable (GL_POLYGON_OFFSET_FILL) ; glPolygonOffset (1.0, 1.0);
/* Вызывается процедура создания многоугольника. */
glDisable(GL_POLYGON_OFFSET_FILL); glColor3f (1.0, 0.0, 0.0); glPolygonMode (GL_FRONT, GL_LINE);
/* Снова вызывается процедура создания многоугольника. */
Внутренняя закрашенная часть многоугольника отодвигается немного вглубь и не накладывается на глубины сторон многоугольника. Этот подход можно также реализовать, использовав сдвиг в алгоритме построения прямых линий - изменив аргумент функции glEnable на GL_POLYGON_OFFSET_LINE. В этом случае будут применяться отрицательные коэффициенты, в результате чего глубина сторон многоугольника станет немного меньше. А если потребуется изобразить только разноцветные точки в вершинах многоугольника, вместо того, чтобы выделять стороны, то аргументом функции glEnable должна быть константа GL_POLYGON_OFFSET_POINT.