OpenGL基础之Stencil Testing
stencil testing发生在fragment shader之后,depth testing之前,它利用stencil-buffer来舍弃一些片元,余下的会进入depth testing进行进一步的比较。
stencil buffer中每一个片元通常对应一个8bit的stencil value,也就是每一个像素或者片元可以设置256个不同的值,我们可以根据这些值来决定哪些片元可以保留,哪些可以舍弃。

我们可以在片元渲染的过程中,指定stencil-buffer中的值;在同一个渲染循环中,就可以读stencil buffer中的值,来保留或者舍弃一些片段,通常的流程如下:
1、开启写stencil-buffer
2、渲染物体,更新stencil-buffer
3、关闭写stencil-buffer
4、渲染物体,并根据stencil-testing结果舍弃一些片元
同样,可以通过glEnable(GL_STENCIL_TEST)来开启深度模板测试,并且需要每一帧都清空stencil-buffer:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
同时可以通过函数glStencilMask(0xff),来制定一个值与写入的值进行 ‘与’操作,如果设置为0x00,则写入的值永远为0;
Stencil functions
跟depth testing一样,我们可以指定stencil testing的比较函数,以此来决定片元的通过方式,用法是:
glStencilFunc(GLenum func, GLint ref, GLuint mask);
func:stencil test function,包括了GL_NEVER, GL_LESS, GL_LEQUAL, GL_GREATER, GL_GEQUSAL, GL_NOTEQUAL,GL_ALWAYS
ref:指定一个引用值,与stencil-buffer的内容进行比较
mask:指定mask值,在stencil test之前,先与stencil-buffer中的值和ref值进行‘与’操作
可以使用函数glStencilOp(GLenum sfail, GLenum dpfail,GLenum dppass)指定一些操作:
1、sfail:如果stencil test失败采取的操作;
2、dpfail:如果stencil test通过,但是depth test失败进行的操作;
3、dppass:如果stencil test和depth test都通过采取的操作;
这些操作的定义如下表:
|
Action |
Description |
|
GL_KEEP |
stencil-value值保持不变 |
|
GL_ZERO |
stencil-value设置为0 |
|
GL_REPLACE |
stencil-value替换为ref |
|
GL_INCR |
stencil-value加1(不能大于最大值) |
|
GL_INCR_WRAP |
stencil-value加1(大于最大值后循环回0) |
|
GL_DECR |
stencil-value减1(不能小于最小值) |
|
GL_DECR_WRAP |
stencil-value减1(小于最小值循环到最大值) |
|
GL_INVERT |
按位取反 |

浙公网安备 33010602011771号