模板测试

2019-12-30  本文已影响0人  APP4x

其实UGUI的Mask,就是使用了模板测试。

什么是模板测试?(Stencil Buffer)
如果开启了模板测试,GPU会首先读取(使用读取掩码)模板缓冲区中该片元位置的模板值,然后将该值和读取(使用读取掩码)到的参考值(reference value)进行比较,这个比较函数是可配置的。
如果这个片元没有通过这个测试,该片元就会被舍弃。
且不管有没有通过测试,都可以根据模板测试的结果来修改模板缓冲值,也是可配置的。

如何开启模板测试呢?
在properties中添加

 _StencilComp ("Stencil Comparison", Float) = 8
 _Stencil ("Stencil ID", Float) = 0
 _StencilOp ("Stencil Operation", Float) = 0
 _StencilWriteMask ("Stencil Write Mask", Float) = 255
 _StencilReadMask ("Stencil Read Mask", Float) = 255

并且在subShader中添加

Stencil {
    Ref [_Stencil]
    Comp [_StencilComp]
    Pass [_StencilOp]
    ReadMask [_StencilReadMask]
    WriteMask [_StencilWriteMask]
}

然后进行相应的赋值,就可以进行模板测试进行正常的裁剪了。

具体是什么意思呢?
Ref:设定参考值reference value
Comp:比较方法,拿reference value和stencilBuffer value比较


UnityEngine.Rendering.CompareFunction:
Disable=0:模板测试(或者深度测试)不可用
Nerver:永远不通过
Less:小于
Equal:等于
LessEqual:小于等于
Greater:大于
NotEqual:不等于
GreaterEqual:大于等于
Always:永远通过


Pass:当模板测试和深度测试都通过后,进行的操作


UnityEngine.Rendering,StencilOp:
Keep=0:保持当前的stencilBuffer value
Zero:设为0
Replace:使用reference value代替
IncrementSaturate:+1(超过255不变)
DecrementSaturate:-1(小于0不变)
Invert:按位取反(若为0则变为255)
IncrementWrap:+1(超过255变为0)
DecrementWrap:-1(小于0变为255)


ReadMask:读取时将该值mask value与reference value和stencilBuffer value分别按位&操作
WriteMask:写入的时候将该值与reference value和stencilBuffer Value分别按位&操作


比较方法大概:

if( (referenceValue & maskValue) comparisonFunction (stencilBufferValue & maskValue) )
{
    通过测试,保留像素
}
else
{
    丢弃像素
}

Fail:当模板测试和深度测试都失败时,进行的操作处理
ZFail:当模板测试通过,深度测试失败,进行的操作处理

上一篇 下一篇

猜你喜欢

热点阅读