执行顺序:片段着色器处理完片段——模板缓冲——深度缓冲
模板值8位,每个片段有256个不同的模板值
GLFW自动配置了模板缓冲。
大概步骤:
启用模板缓冲写入; glEnable(GL_STENCIL_TEST);
渲染物体,更新模板缓冲的内容;
禁用模板缓冲写入; glStencilMask(0x00);
渲染其他物体,根据模板缓冲丢弃片段。
函数:
glStencilMask()
与深度测试glDepthMask()一样,glStencilMask()设置一个位掩码,与将要写入模板缓冲的模板值进行与(AND)运算。
glStencilMask(0xFF); // 每一位写入模板缓冲时都保持原样
glStencilMask(0x00); // 每一位在写入模板缓冲时都会变成0(禁用写入)
glStencilFunc(GLenum func, GLint ref, GLuint mask)
func:模板测试函数,将模板值和ref进行比较。GL_NEVER、GL_LESS、GL_LEQUAL、GL_GREATER、GL_GEQUAL、GL_EQUAL、GL_NOTEQUAL和GL_ALWAYS。
ref:参考值
mask:设置一个掩码,它将会与参考值和储存的模板值在测试比较它们之前进行与(AND)运算。初始情况下所有位都为1。
glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)
sfail:模板测试失败采取的行为
dpfail:模板测试通过,但深度测试失败时采取的行为。
dppass:模板测试和深度测试都通过时采取的行为
默认情况下glStencilOp是设置为
(GL_KEEP, GL_KEEP, GL_KEEP),如果想要更新模板缓冲,要修改参数。
更新缓冲:模板测试和深度测试都通过,将模板值设置为glStencilFunc()函数设置的ref值
绘制箱子边框:
1.绘制地板。设置掩码为ox00,写入全为0,不影响模板值。
2.绘制箱子。设置掩码oxFF,正常写入模板,写入值为ref。
3.放大箱子,绘制边框。设置 glStencilFunc(GL_NOTEQUAL, 1, 0xFF),模板值和1不相等,通过测试;设置掩码为ox00,写入全为0,不影响测试通过区域的模板值;绘制边框。