当前位置: 首页 > 工具软件 > Stencil > 使用案例 >

OPENGL模板缓冲(Stencil Testing)

戚俊人
2023-12-01

执行顺序:片段着色器处理完片段——模板缓冲——深度缓冲

模板值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,不影响测试通过区域的模板值;绘制边框。

 类似资料: