Работа с буфером трафарета Буфер трафарета (stencil buffer) является очень мощным средством, позволяющим работать на уровне отдельных пикселов. Он может использоваться, например, для отсечения отраженного изображения по границе зеркала.
Для использования буфера трафарета сначала следует разрешить Проведение теста трафарета при помощи команды
glEnable (GL_STENCIL_TEST );
Для запрещения использования теста трафарета служит команда
glDisable ( GL_STENCIL_TEST );
Задать закон прохождения теста трафарета можно при помощи следующей функции:
void glStencilFunc { GLenum func, GLint ref, GLuint mask );
Параметр func определяет, в каком случае тест трафарета считается выполненным. Возможные значения для этого параметра приводятся в табл. 4.9.
Таблица 4.9
Значение |
Условие выполнения |
GL_NEVER |
Никогда |
GL_LESS |
Если (ref & mask)<(stencil & mask) |
GL_EQUAL |
Если (ref & mask)==(stenci! & mask) |
Основы библиотеки OpenGL
GLJJEQUAL |
Если (ref & mask)<=<stencil & mask) |
GL_CREATER |
Если (ref & mask)>(stencil & mask) |
GU.NOTEQUAL |
Если (ref & mask)!=(stencil & mask) |
GL.GEQUAL |
Если (ref & mask)>=(stencil & mask) |
GL_ALWAYS |
Всегда |
Для задания действия над буфером трафарета в зависимости от прохождения теста трафарета и теста глубины служит функция
void glStencilOp ( GLenum fail, GLenum zfail, GLenum zpass );
Первый параметр задает действие, которое будет выполнено над значением трафарета для текущего пиксела в случае, если тест трафарета не выполнен.
Параметр zfail задает действие, которое будет выполнено в случае, когда тест трафарета выполнен, а тест глубины - нет.
Третий параметр задает действие, когда выполнены и тест трафарета и тест глубины.
Возможные значения для этих параметров приводятся в табл. 4.10. Таблица 4.10
Значение |
Действие |
GLJŒEP |
Текущее значение ие изменяется |
GL_ZERO |
Текущее значение обнуляется |
GL.REPLACE |
Текущее значение заменяется значением параметра к{ |
GLJNGR |
Текущее значение увеличивается иа единицу |
GL_DECR |
Текущее значение уменьшается на единицу |
GLJNVERT |
Осуществляется побитовое инвертирование текущего значения |
На самом деле OpenGL перед выводом каждого пиксела осуществляет целый ряд проверок, позволяющий отбрасывать отдельные пикселы. Ниже приводится диаграмма, показывающая порядок этих проверок.