一、模板测试(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