OpenGL. Компьютерная графика. Васильев С.А. - 54 стр.

UptoLike

Составители: 

56
Параметр ref задает значение для сравнения и может принимать любое из диапазона [0, 2
n
– 1], где n
число битовых плоскостей в буфере трафаретов. Аргумент mask задает маску для значений ref и sten-
cil.
По умолчанию тест трафарета заблокирован. В этом случае модификация буфера трафарета не мо-
жет произойти и это означает положительный результат теста трафарета.
Команда glStencilOp предназначена для определения действий над пикселем буфера маски в случае
положительного или отрицательного результата теста.
void glStencilOp (GLenum fail, GLenum zfail, GLenum zpass)
Аргумент fail задает действие в случае отрицательного результата теста, и может принимать сле-
дующие значения:
Константа Действие
GL_KEEP СОХРАНИТЬ ТЕКУЩЕЕ ЗНАЧЕНИЕ В
БУФЕРЕ ТРАФАРЕТА
GL_ZERO
Установить значение буфера трафарета в ноль
GL_REPLA
CE
Заменить значение буфера трафарета на значе-
ние переменной ref, заданной командой
glStencilOp
GL_INCR
Увеличить на единицу текущее значение буфе-
ра трафарета
GL_DECR
Уменьшить на единицу текущее значение бу-
фера трафарета
GL_INVER
T
Поразрядно инвертировать текущее значение
трафарета
Параметры zfail и zpass определяют действия для отрицательного и положительного, соответствен-
но, завершение теста глубины, которые будут выполнены в случае положительного результата выпол-
нения теста трафарета. Для этих параметров допускаются те же символьные константы, что для пара-
метра fail.
Рассмотрим простой пример использования буфера трафарета.
Пусть на фоне градиентно-закрашенного квадрата необходимо вывести зеленый треугольник с вы-
резанным окном в виде треугольника меньшего размера, через который можно видеть базовый квадрат.
Квадрат расположен чуть дальше, чем остальные объекты. Рассмотрим поэтапно наши действия:
1 Определяем значение буфера трафарета для фона, например – 1.
2 Рисуем градиентно-закрашенного квадрат.
3 Заполняем в буфере трафаретов треугольное "окно" значениями, например – 2.
4 Выводим зеленого треугольника в тех местах, где значения в буфере трафарета не равны 2.
Рассмотрим фрагмент кода программы, выполняющий поставленную задачу. Комментарии подроб-
но поясняют все выполняемые действия.
GLvoid DrawPrim()
{
// Значение, которым будет заполняться буфер стенсила при его очистке
glClearStencil(1);
// Определяем, какие биты могут писаться в стенсил буфер
glStencilMask(0xFF);
// Очищаем все буферы
glClear( GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
glBegin(GL_QUADS); // Рисуем градиентно-закрашенный квадрат
glColor3f( 1,0,0);glVertex3f( 2.0f, 2.0f, -0.1f);
glColor3f( 0,1,0);glVertex3f(-2.0f, 2.0f, -0.1f);
glColor3f( 0,0,1);glVertex3f(-2.0f, -2.0f, -0.1f);