3.1 模板测试与深度测试(Stencil Test & Z Test)

一、模板测试(Stencil Test)

模板测试可以实现的一些效果图

1.是什么

①从渲染管线出发:模板测试是在逐片源操作阶段,透明测试之后,深度测试之前的位置。

②从书面概念上理解

说到模板测试,就要先说道模板缓冲区。模板缓冲区与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存一个无符号证书值(通常的话是个8位整数)。这个值的具体一一视程序的具体应用而定。在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。这个比较的过程被称为模板测试。模板测试发生在透明测试之后,深度测试之前。如果模板测试通过,则相应的像素点更新,否则不更新。

③从逻辑上理解:通过一些逻辑判断,针对当前像素进行取舍,如下图。stencilBufferValue是模板缓存中的值,其它由我们定义

2.语法表示

  • Ref referenceValue //参考值
  • ReadMask readMask //读取掩码,取值范围也是0~255的整数,默认255,二进制11111111,即读取的时候不对referenceValue和stencilBufferValue产生效果,读取的还是原始值
  • WriteMask writeMask //输出掩码,当写入模板缓冲时进行掩码操作(按位与【&】),writeMask取值范围是0~255的整数,默认值也是255,即当修改stencilBufferValue值时写入的仍是原始值
  • Comp comparisionFunction //比较方式,关键字见下图
  • Pass stencilOperation //条件满足后的处理
  • Fail stencilOperation //条件不满足后的处理
  • ZFail stencilOperation //深度测试失败后的处理

ComparisionFunction

StencilBufferValue(Pass,Fail,ZFail)

3.模板测试流程

4.模板测试总结

  • 使用模板缓冲区最重要的两个值:当前模板缓冲之(stencilBufferValue)和模板参考值(referenceValue)
  • 模板测试主要就是对这两个值使用特定的比较操作:Never,Always,Less,LEqual,Greater,Equal等等
  • 模板测试之后要对模板缓冲区的值(stencilBufferValue)进行更新操作,更新操作包括:Keep,Zero,Replace,IncrSat,DecrSat,Invert等等
  • 模板测试之后可以根据结果对模板缓冲区做不同的更新操作,比如模板测试成功操作Pass,模板测试失败操作Fail,深度测试失败操作ZFail,还有针对正面和背面精确更新操作PassBack,PassFront,FailBack等等

5.模板测试扩展

  • 描边
  • 多边形填充
  • 反射区域控制
  • shadow volume阴影渲染
  • 等等

视频代码 Stencil-Test

StencilMask

ToonLitStencilMasked

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值