Monday, May 6th 2024
模板测试(Stencil test)
几个函数:
glEnable(GL_STENCIL_TEST);
void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
void glStencilMaskSeparate(GLenum face, GLuint mask);
glEnable(GL_STENCIL_TEST);
用来开启模板测试。
Stencil test
void glStencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
对于当前绘制的fragment
,从stencil buffer
中获取它的模板值,并与mask
进行AND。再使用ref
与mask
进行AND。最后将两个结果进行func
运算。如果结果为true
则通过测试,否则为不通过。
Stencil operations
void glStencilOpSeparate(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
这个函数用来设置如何根据上一步的结果来更新stencil buffer
中的值。
"The stencil operation uses the result of the stencil test to decide how to modify the stencil value in the framebuffer"
sfail
: The stencil test fail, fragment
将会被丢弃,但stencil buffer
中的值可以被更新。如何进行更新根据sfail
的方法进行更新。
dpfail
: The stencil test passes, but depth test fails.fragment
将会被丢弃,但stencil buffer
中的值将会根据dpfail
的方法进行更新。
dppass
: The stencil passes, and the depth test passes. stencil buffer
中的值将会按照dppass
的方法进行更新。
Stencil value update
void glStencilMaskSeparate(GLenum face, GLuint mask);
在对stencil buffer
中的值进行更新时,新的值要和mask
进行AND操作。
Q & A
1. 到底是那两个值进行比较?
是glStencilFuncSeparate
中的ref
和fragment
所对应的stencil buffer
中的值进行比较。
2. stencil buffer
中的值是从哪里来的?
1.可以通过glClear(GL_STENCIL_BUFFER_BIT)
将stencil buffer
的值清空。
2.也可以在第一遍绘制时将stencil value
写入到stencil buffer
中。