模板测试与透明度测试以及深度测试类似,模板测试也是用来决定一个像素点是否渲染的过程。其中要用到的模板缓冲区与颜色缓冲区以及深度缓冲区类似,模板缓冲区可以为屏幕上的为每个像素点保存一个无符号整数值(通常的话是个8位整数)。模板测试发生在透明度测试(alpha test)之后,深度测试(depth test)之前。其中所有的测试都通过,才会更新颜色缓冲区中的颜色。
一般来说,stencil完整语法格式如下:
stencil{
Ref referenceValue
ReadMask readMask
WriteMask writeMask
Comp comparisonFunction
Pass stencilOperation
Fail stencilOperation
ZFail stencilOperation
}
关键字 | 实际意义 | 默认值 |
Ref | 作为与缓冲区中的值比较的参考值。 | 无 |
ReadMask | (ref & readMask Comp函数 stencilBuffer & readMask)的bool值决定是否通过模板测试 | 255 |
WriteMask | (ref & writeMask)的值在修改方式为replace的情况,整数值将覆盖buffer,其他修改方式无效 | 255 |
Comp | 定义参考值与模板值比较的方式,即决定的是模板测试通过与否的方式。 | Always |
Pass | 定义模板测试与深度测试皆通过时,基于参考值对模板值的修改方式。 | Keep |
Fail | 定义模板测试不通过时,基于参考值对模板值的修改方式。 | Keep |
ZFail | 定义模板测试通过,深度测试不通过时,基于参考值对模板值的修改方式。 | Keep |
ComparisonFunction可选类型: | |
Greater | 相当于“>”操作,即仅当左边>右边,模板测试通过,渲染像素 |
GEqual | 相当于“>=”操作,即仅当左边>=右边,模板测试通过,渲染像素 |
Less | 相当于“<”操作,即仅当左边<右边,模板测试通过,渲染像素 |
LEqual | 相当于“<=”操作,即仅当左边<=右边,模板测试通过,渲染像素 |
Equal | 相当于“=”操作,即仅当左边=右边,模板测试通过,渲染像素 |
NotEqual | 相当于“!=”操作,即仅当左边!=右边,模板测试通过,渲染像素 |
Always | 不管公式两边为何值,模板测试总是通过,渲染像素 |
Never | 不敢公式两边为何值,模板测试总是失败 ,像素被抛弃 |
StencilOperation可选类型: | |
Keep | 保留当前缓冲中的内容,即stencilBufferValue不变 |
Zero | 将0写入缓冲,即stencilBufferValue值变为0 |
Replace | 将参考值写入缓冲,即将referenceValue赋值给stencilBufferValue |
IncrSat | stencilBufferValue加1,如果stencilBufferValue超过255了,那么保留为255,即不大于255 |
DecrSat | stencilBufferValue减1,如果stencilBufferValue超过为0,那么保留为0,即不小于0 |
Invert | 将当前模板缓冲值(stencilBufferValue)按位取反 |
IncrWrap | 当前缓冲的值加1,如果缓冲值超过255了,那么变成0,(然后继续自增) |
DecrWrap | 当前缓冲的值减1,如果缓冲值已经为0,那么变成255,(然后继续自减) |