写在前面:本文只介绍Stencil最基本的三种参数:Ref Comp Pass ,其他的略略带过。
碎碎念:之前用过Stencil,但是没有完全理解,原因在于虽然理解了每项的意思,但是实际的使用效果不如人意,最后得出的结果纯靠运气试出来的。昨晚按照渲染流程走了一遍,豁然开朗,感觉自己好瓜皮qaq
Stencil简介
Stencil是模板测试的意思,通常写在Pass里面最开头,CGPROGRAM之前。Stencil会在该场景生成一个Stencil缓冲区,缓冲值初始为0。在运行中,Stencil会通过读取每个像素的缓冲值,与Ref定义的参考值进行比较,若通过则对该像素缓冲值进行Pass后的操作,并渲染该像素,若不通过则进行Fail后的操作。
stencil完整语法格式如下:
stencil{
Ref referenceValue
ReadMask readMask
WriteMask writeMask
Comp comparisonFunction
Pass stencilOperation
Fail stencilOperation
ZFail stencilOperation
}
但一般来说,我只取Ref Comp Pass
三项
Ref
Ref用来设定参考值,这个值将用来与模板缓冲中的值进行比较。
例:Ref 0
意为“设定参考值0”。
Comp
comp等于英语compare,意思是将参考值与缓冲值相比。
例:Ref 0 Comp Less
意为“若参考值0小于缓冲值”,千万不要弄反了。
Pass
Pass意思是通过了就执行xx操作。
例:Pass keep
意思是若通过了就不改变缓冲区的值,并渲染该像素。
Comp和Pass的可取值类型如上1
举例
现在正式进入我们的探索阶段,虽然上面讲得很清楚,但是实践下来可能会发现结果和自己理解的不一样(比如我)。那么现在我们就创建一个平面投影shader2,用这个来测试Stencil。
Shader "Custom/PlanarShadow"
{
Properties
{
_Tint("_Tint", Color) = (1,1,1,1)
_MainTex("_MainTex (albedo)", 2D) = "white" {
}
[Header(Alpha)]
[Toggle(_CLIPPING)] _Clipping ("Alpha Clipping", Float) = 1
_Cutoff("_Cutoff (Alpha Cutoff)", Range(0.0, 1.0)) = 0.5 // alpha clip threshold
[Header(Shadow)]
// _GroundHeight("_GroundHeight", Range(-100, 100)) = 0
_GroundHeight("_GroundHeight", Float) = 0
_ShadowColor("_ShadowColor", Color) = (0,0,0,1)
_ShadowFalloff("_ShadowFalloff", Range(0<