1、Stencil buffer概念:
屏幕平面好比一块大的平面,然后每个像素都有自己对应的stencil值,可以把他理解为一个数字标记,然后所有像素的初始默认stencil值都是0
这个时候如果想用到Stencil Buffer,那么就要去改变这些像素的值来舍弃或保留这些像素,相当于去判断渲染哪些像素
stencil buffer其实是zBuffer其中的一部分,StencilTest在ZTest之前,两者紧密联系,存在于显存内的某一片区域中。目前的显卡架构中,比如在depth/stencil缓冲区某个32位的区域中,有24位记录着像素A的depth数据,紧接着8位记录着像素A的stencil数据。
2、API:
unityShader中可以直接定义Stencil结构,pass,subshader中都可以,类似ztest
Ref referenceValue,这个是设定参考值,stencilbuffer里面的值会与他比较
ReadMask readMask,这个是在比较参考值和buffer值的时候用的,用于读取buffer值里面的值。
WriteMask writeMask,这个是写入buffer值用的。
Comp comparisonFunction,让Ref的值和Stencil Buffer里的值比较,注意比较时是左边是Ref,右边是Stencil Buffer里的值。大致有Greater,GEqual,Equal等八种比较方式,具体待会列图。
Pass stencilOperation,这个是当stencil测试和深度测试都通过的时候,进行的stencilOperation操作方法。改变Stencil Buffer里的值,只改变Stencil Buffer里的Stencil值,不改变任何其他东西,什么color,depth值都不会牵扯到
Fail stencilOperation,这个是在stencil测试通过的时候执行的stencilOperation方法。这里只要stencil测试通过就可以了
ZFail stencilOperation,这个是在stencil测试通过,但是深度测试没有通过的时候执行的stencilOperation方法。
一般Comp,Pass,Fail,ZFail只用于正面的渲染,除非有Cull front,这样的语句出现。如果要渲染两面,可以用CompFront,PassFront等和CompBack,PassBack等。意思和上面的一样
比较方式:
Disabled | Depth or stencil test is disabled. | 0 |
---|---|---|
Never | Never pass depth or stencil test. | 1 |
Less | Pass depth or stencil test when new value is less |