Запуск логических операций производится с помощью команды g1Enable(GL_C0L0R_L0GIC_0P). Оператор выбирается с помощью подпрограммы glLogicOpO, аргумент которой показан в табл. 10.1, где буквой S обозначен пиксел источника, а буквой D - пиксел адресата. По умолчанию принято GLC0PY, в результате чего пиксел адресата просто замещается пикселом источника.

Таблица 10.1. Допустимые логические операции в OpenGL

Значение параметра

Величина, записанная в карту адресата

GL_CLEAR
GL.COPY S
GL_NOOP D
GL_SET
GL_COPY_INVERTED NOTS
GLJNVERT NOT D
GL_AND_REVER.SE S OR NOT D
GL_AND S AND D
GL_OR SORD
GL_NAND NOT(S AND D)
GL_NOR NOT(S OR D)
GL_XOR SXORD
GL.EQUIV NOT(S XOR D)
GL_AND_INVERTED NOT S AND D
GLORJNVERTED NOT S OR D

На рис. 10.16 приводятся примеры логического комбинирования двух пиксельных карт для случая пикселов, заданных в двоичной форме. Связывание значения пиксела с цветом здесь выглядит так: 0 - черный, 1 - белый. (Как эти пиксельные карты будут выглядеть после применения операторов GL_AND и GL_EQUIV?)

Ниже описывается классическое применение операции XOR для рисования «резиновых прямоугольников»; там же показывается, как это реализуется в рамках OpenGL. При этой операции используется тот факт, что два последовательных рисования в режиме XOR стирают объект, оставляя исходное изображение нетронутым. Еще несколько примеров рассматриваются в упражнениях.

Средства для растровой графики

Эффекты применения различных логических операций

Рис. 10.16. Эффекты применения различных логических операций Пример 10.3.6. Рисование «резиновых прямоугольников»

«Резиновые прямоугольники» («rubber rectangles») и «резиновые нити» («rubber-band Unes») очень удобны для пользователя, который желает рисовать на дисплее при помощи мыши аккуратные фигуры. На рис. 10.17 показано несколько примеров. При рисовании резинового прямоугольника (см. рис. 10.17, а) пользователь вначале указывает мышью точку на том месте, где должен находиться один угол желаемого прямоугольника, после чего нажимает кнопку мыши. Это действие определяет опорную точку (pivot). Затем по мере того, как пользователь перемещает мышь от опорной точки, появляется «эластичный» прямоугольник, один угол которого все время находится в опорной точке, а противоположный угол - в текущей позиции мыши. При изменении этого прямоугольника он накладывается на все нарисованное на экране, ничего там не меняя. Пользователь может корректировать этот прямоугольник взад-вперед до тех пор, пока он в точности не охватит нужную область. При отпускании кнопки мыши последний вариант прямоугольника остается видимым на экране, причем его координаты могут использоваться программой для дальнейшего рисования. Резиновая нить (см. рис. 10.17, б) представляет собой эластичную прямую линию, которая простирается от опорной точки до позиции мыши, увеличиваясь и уменьшаясь в длине по мере перемещения мыши. Эта нить является вариацией резинового прямоугольника, когда рисуется только его диагональ.


⇐ Предыдущая| |Следующая ⇒