≪
≫

Отсечение областью экрана

Часто на практике требуется вывести графический примитив в рамках определенной прямоугольной области экрана. Если часть объекта выходит за рамки этой области, то она не выводится на экран. Эту задачу решает тест отсечения, задаваемый командой

void glScissor(GLint х, GLint у, GLsizei width, GLsizei height)

Эта команда задает прямоугольник отсечения: х и у - оконные координаты левого нижнего угла области отсечения, width и height - ширина и высота этой области. Все параметры задаются в пикселях. В первый раз, когда контекст воспроизведения подсоединяется к окну, х и у принимают значения (0, 0), a width и height - его ширину и высоту.

Для разрешения и запрещения отсечения используются команды glEnable() и glDisable() с параметром GL_SCISSOR_TEST.

Если выполнить команду glScissor(0, 0, 0, 0), то будет заблокирован вывод графики на экран, так как любая выводимая точка будет выходить за рамки отведенной области.

Отсечение объектов плоскостями

OpenGL предоставляет возможность разработчикам обрезать графические ЗЭ-объекты. В качестве секущей плоскости используется плоскость, заданная коэффициентами уравнения вида Ax + By + Cz + ?) = 0. Напомним, вектор {А, В, С} - задает нормаль к плоскости. Для отсечения используется команда

void glClipPlane (GLenum plane, const GLdouble *equation)

Параметр plane определяет одну из шести (точнее -GL_MAX_CLIP_PLANES) секущих плоскостей и может принимать следующие символьные значения: GL_CLIP_PLANEi, где i - целое число от

О до 5 (GL_MAX_CLIP_PLANES-1). Параметр equation - указатель на массив из четырех значений (А, В, С и D), задающих уравнение плоскости. Внимание'. Данный вектор указывает своим направлением на оставшуюся часть объекта после отсечения. Для разрешения работы с подобными плоскостями необходимо выполнить команду glEnable() с аргументом GL_CLIP_PLANEi. Отключение секущей плоскости происходит после команды glDisable() с соответствующим аргументом.

Рассмотрим пример отсечения некоторого объекта двумя плоскостями. Первая плоскость отсекает полупространство, для которого х< 1, и вторая плоскость отсекает полупространство, для которого у<0 .

// Коэффициенты А, В, С и D для первой плоскости отсечения GLdouble Р10[] ={1.0, 0.0 ,0.0 ,1.0};

// Коэффициенты А, В,С и D для второй плоскости отсечения GLdouble Р11 [] ={0.0 ,1.0 ,0.0 ,0.0};

// Идентифицируем первую плоскость отсечения glClipPlane(GL_CLIP_PLANEO, РЮ);

// Идентифицируем вторую плоскость отсечения glClipPlane(GL_CLIP_PLANEl, Р11);

// Включаем отсечение первой плоскостью

glEnable (GL_CLIP_PLANE0);

// Включаем отсечение второй плоскостью

glEnable (GL_CLIP_PLANE1);

// Здесь выводим объект ...

Следует помнить, что параметры секущей плоскости автоматически изменяются в соответствии с модельными и видовыми преобразованиями. И еще, вектор нормали (А, В, С) не должен быть обязательно перпендикулярен осям, как в нашем примере.

Логические операции при выводе объекта

При поступлении значений объекта в буфер кадра в OpenGL обозначаются несколько интересных ситуаций: либо эти значения просто замещают существующие, либо происходит логическая операция между данными, которые находятся в соответствующем месте буфера кадра с поступающими данными. Задание логической операции определяется командой void glLogicOp(GLenum opcode).

Параметр opcode задает логическую операцию и может принимать следующие значения (принятые обозначения: 5 - значение бита источника, d - значение бита приемника).

Opcode

Логическая операция

GL.CLEAR

0

GL_SET

1

GL.COPY

s

GL_COPY_INVERTED

is

GL.NOOP

d

GL.INVERT

id

GL_AND

s&d

GL.NAND

!(s&d)

GL_OR

sld

GL_NOR

!(sld)

GL_XOR

sAd

GL.EQUIV

!(sAd)

GL_AND_REVERSE

s&id

GL_AND_INVERTED

is&d

GL_OR_REVERSE

slid

GL_OR_INVERTED

isld

Для разрешения подобного режима работы необходимо отработать команду glEnable() с аргументом GL_COLOR_LOGIC_OP для полноцветного цветового режима. Выключается режим командой glDisable() с таким же аргументом. Напомним, логическая операция выполняется побитно над данными.

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