Запуск логических операций производится с помощью команды 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, б) представляет собой эластичную прямую линию, которая простирается от опорной точки до позиции мыши, увеличиваясь и уменьшаясь в длине по мере перемещения мыши. Эта нить является вариацией резинового прямоугольника, когда рисуется только его диагональ.