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。再使用refmask进行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中的reffragment所对应的stencil buffer中的值进行比较。

2. stencil buffer中的值是从哪里来的?

1.可以通过glClear(GL_STENCIL_BUFFER_BIT)stencil buffer的值清空。 2.也可以在第一遍绘制时将stencil value写入到stencil buffer中。