0%

unity shader 模板测试 [摘]

摘自:http://blog.csdn.net/u011047171/article/details/46928463

应用

image

原理

Stencil Buffer&Stencil Test

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

image

image

模板测试语法

一般来说 ,stencil完整语法格式如下:

1
2
3
4
5
6
7
8
9
stencil{  
Ref referenceValue
ReadMask readMask
WriteMask writeMask
Comp comparisonFunction
Pass stencilOperation
Fail stencilOperation
ZFail stencilOperation
}

Ref

1
Ref referenceValue  

Ref用来设定参考值referenceValue ,这个值将用来与模板缓冲中的值进行比较。referenceValue是一个取值范围位0-255的整数。

ReadMask

1
ReadMask  readMask  

ReadMask 从字面意思的理解就是读遮罩 ,readMask将和referenceValue以及stencilBufferValue进行按位与(&)操作 ,readMask取值范围也是0-255的整数 ,默认值为255 ,二进制位11111111 ,即读取的时候不对referenceValue和stencilBufferValue产生效果 ,读取的还是原始值。

WriteMask

1
WriteMask writeMask  

WriteMask是当写入模板缓冲时进行掩码操作(按位与【&】) ,writeMask取值范围是0-255的整数 ,默认值也是255 ,即当修改stencilBufferValue值时 ,写入的仍然是原始值。

Comp

1
Comp comparisonFunction  

Comp是定义参考值(referenceValue)与缓冲值(stencilBufferValue)比较的操作函数 ,默认值:always

comparisonFunction 意义
Greater 相当于“>”操作 ,即仅当左边>右边 ,模板测试通过 ,渲染像素
GEqual 相当于“>=”操作 ,即仅当左边>=右边 ,模板测试通过 ,渲染像素
Less 相当于“<”操作 ,即仅当左边<右边 ,模板测试通过 ,渲染像素
LEqual 相当于“<=”操作 ,即仅当左边<=右边 ,模板测试通过 ,渲染像素
Equal 相当于“=”操作 ,即仅当左边=右边 ,模板测试通过 ,渲染像素
NotEqual 相当于“!=”操作 ,即仅当左边!=右边 ,模板测试通过 ,渲染像素
Always 不管公式两边为何值 ,模板测试总是通过 ,渲染像素
Never 不管公式两边为何值 ,模板测试总是失败 ,像素被抛弃

Pass

1
Pass stencilOperation  

Pass是定义当模板测试(和深度测试)通过时 ,则根据(stencilOperation值)对模板缓冲值(stencilBufferValue)进行处理 ,默认值:keep

Fail

1
Fail stencilOperation  

Fail是定义当模板测试(和深度测试)失败时 ,则根据(stencilOperation值)对模板缓冲值(stencilBufferValue)进行处理 ,默认值:keep

ZFail

ZFail是定义当模板测试通过而深度测试失败时 ,则根据(stencilOperation值)对模板缓冲值(stencilBufferValue)进行处理 ,默认值:keep

Comp,Pass,Fail 和ZFail将会应用给背面消隐的几何体(只渲染前面的几何体) ,除非Cull Front被指定 ,在这种情况下就是正面消隐的几何体(只渲染背面的几何体)。你也可以精确的指定双面的模板状态通过定义CompFront ,PassFront ,FailFront ,ZFailFront(当模型为front-facing geometry使用)和ComBack ,PassBack ,FailBack ,ZFailBack(当模型为back-facing geometry使用)

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 ,(然后继续自减) 。

再来点例子

https://zhuanlan.zhihu.com/p/28506264
https://blog.csdn.net/u013833399/article/details/47340447