Stencil Buffer
模板缓冲
模板缓冲先清空模板缓冲设置所有片段的模板值为0,然后开启矩形片段用1填充。场景中的模板值为1的那些片段才会被渲染(其他的都被丢弃)。
模板函数
void glStencilFunc(GLenum func, GLint ref, GLuint mask)函数有三个参数:
func:设置模板测试操作。这个测试操作应用到已经储存的模板值和glStencilFunc的ref值上,可用的选项是:GL_NEVER、GL_LEQUAL、GL_GREATER、GL_GEQUAL、GL_EQUAL、GL_NOTEQUAL、GL_ALWAYS。它们的语义和深度缓冲的相似。
ref:指定模板测试的引用值。模板缓冲的内容会与这个值对比。
mask:指定一个遮罩,在模板测试对比引用值和储存的模板值前,对它们进行按位与(and)操作,初始设置为1。
void glStencilOp(GLenum sfail, GLenum dpfail, GLenum dppass)函数包含三个选项,我们可以指定每个选项的动作:
sfail: 如果模板测试失败将采取的动作。
dpfail: 如果模板测试通过,但是深度测试失败时采取的动作。
dppass: 如果深度测试和模板测试都通过,将采取的动作。
每个选项都可以使用下列任何一个动作。
操作 | 描述 |
---|---|
GL_KEEP | 保持现有的模板值 |
GL_ZERO | 将模板值置为0 |
GL_REPLACE | 将模板值设置为用glStencilFunc函数设置的ref值 |
GL_INCR | 如果模板值不是最大值就将模板值+1 |
GL_INCR_WRAP | 与GL_INCR一样将模板值+1,如果模板值已经是最大值则设为0 |
GL_DECR | 如果模板值不是最小值就将模板值-1 |
GL_DECR_WRAP | 与GL_DECR一样将模板值-1,如果模板值已经是最小值则设为最大值 |
GL_INVERT | Bitwise inverts the current stencil buffer value. |
物体轮廓
在绘制物体前,把模板方程设置为GL_ALWAYS,用1更新物体将被渲染的片段。
渲染物体,写入模板缓冲。
关闭模板写入和深度测试。
每个物体放大一点点。
使用一个不同的片段着色器用来输出一个纯颜色。
再次绘制物体,但只是当它们的片段的模板值不为1时才进行。
开启模板写入和深度测试。