一、模板测试与深度测试原理
1.1 Part 1:
Stencil Test :模板测试,在输入片段的模板上进行,以确定片段是否该被拒绝说到模板测试,就要先说到模板缓冲区。模板缓冲区与颜色缓冲区和深度缓冲区类似,模板缓冲区可以为屏幕上的每个像素点保存个无符号整数值(通常的话是个8位整数)。这个值的具体意义视程序的具体应用而定。在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值。这个比较的过程被称为模板测试。模板测试发生在透明度测试(alphatest)之后,深度测试(depth test)之前。如果模板测试通过,则相应的像素点更新,否则不更新。
1.2 Part 2:
Stencil Test :
模板缓冲区(StencilBuffer)可以为屏幕上的每个像素点保存一个无符号整数值,这个值的具体意义视程序的具体应用而定.在渲染的过程中,可以用这个值与一个预先设定的参考值相比较,根据比较的结果来决定是否更新相应的像素点的颜色值.这个比较的过程被称为模板测试.
将StencilBuffer的值与ReadMask与运算,然后与Ref值进行Comp比较,结果为true时进行Pass操作,否则进行Fail操作,操作值写入StencilBuffer前先与WriteMask与运算.
模版缓冲中的默认值为:0
公式:(Ref & ReadMask) Comp (StencilBufferValue & ReadMask)
1.3 Part3:
Stencil Test :
Stencil
{
Ref [_Stencil]
ReadMask [_StencilReadMask]
WriteMask [_StencilWriteMask]
Comp [_StencilComp] ((UnityEngine.Rendering.CompareFunction))
Pass [_StencilOp] (UnityEngine.Rendering.StencilOp)
Fail [_Fail]
ZFail [_ZFail]
}
Ref: 设定的参考值,这个值将用来与模板缓冲中的值进行比较.取值范围位为0-255的整数.
ReadMask: ReadMask的值将和Ref的值以及模板缓冲中的值进行按位与(&)操作,取值范围也是0-255的整数,默认值为255(二进制位11111111),即读取的时候不对Ref的值和模板缓冲中的值产生修改,读取的还是原始值.
WriteMask: WriteMask的值是当写入模板缓冲时进行的按位与操作,取值范围是0-255的整数,默认值也是255,即不做任何修改.
Comp: 定义Ref与模板缓冲中的值比较的操作函数,默认值为always.
Pass: 当模板测试(和深度测试)通过时,则根据(stencilOperation值)对模板缓冲值进行处理,默认值为keep.
Fail: 当模板测试(和深度测试)失败时,则根据(stencilOperation值)对模板缓冲值进行处理,默认值为keep.
ZFail: 当模板测试通过而深度测试失败时,则根据(stencilOperation值)对模板缓冲值进行处理,默认值为keep.
深度测试:拿当前像素的深度值与深度缓冲中的深度值进行比较,默认值为LEqual。可通过在属性中添加枚举UnityEngine.Rendering.CompareFunction
Disabled: 禁用,相当于永远通过。
Never: 于永远不通过。
Less:小于,表示如果当前像素的深度值小于深度缓冲中的深度值,则通过,以下类同。
Equal:等于。
LEqual:小于等于。
Greater:大于。
NotEqual:不等于。
Gequal:大于等于。
Always:永远通过。
二、模板测试与深度测试用途
三、关键代码:
1.4 Part4:实现效果
1.5 Part5:关于更多深度测试与模板测试详细内容参考Unity_Shader入门精要、bilibili百人计划《霜狼》!