Работа с буфером трафарета Буфер трафарета (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 перед выводом каждого пиксела осуществляет целый ряд проверок, позволяющий отбрасывать отдельные пикселы. Ниже приводится диаграмма, показывающая порядок этих проверок.


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