OPENGL模板缓冲(Stencil Testing)

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值