Stencil在Unity中的使用

(一)、Stencil的理论知识

Stencil用于在渲染时保留和抛弃像素

Stencil对应的材质组件在Unity中的显示如图:
材质组件

1. Ref ReferenceValue

对应组件中的Stencil ID由程序自己设定,用于和缓冲(Stencil Buffer)中的值相比较,比较的方式在Stencil Comparison中设定,满足条件则渲染出来(保留)。

2. Stencil Comparison

渲染时判断是否保留的条件。将ref中的value与buf中的value进行比较公式如下:

if((refValue & readMask) comparisonFunction (bufferValue & readMask)) 
{ 通过测试,渲染时保留 }
else 
{ 渲染时抛弃 }

具体的方式包括:

比较方法含义
Disabled0不进行Stencil与深度测试
Never1无论左边和右边为何值,使测试永远不通过,渲染时总是抛弃
Less2左边 < 右边时通过测试,渲染时保留,否则抛弃
Equal3左边 = 右边时通过测试,渲染时保留,否则抛弃
LessEqual4左边 <= 右边时通过测试,渲染时保留,否则抛弃
Greater5左边 > 右边时通过测试,渲染时保留,否则抛弃
NotEqual6左边 != 右边时通过测试,渲染时保留,否则抛弃
GreaterEqual7左边 >= 右边时通过测试,渲染时保留,否则抛弃
Always8使测试永远通过,渲染时总是保留(是Stencil Comparison的默认值即8)

具体对应的值可在Unity的接口UnityEngine.Rendering.CompareFunction枚举中查看,当所填值不在该范围内时采用默认值8即Always渲染时总是保留。

3. Stencil Operation

渲染测试之后,无论像素最终被保留或被抛弃都会执行Stencil Operation来更新缓冲中的值stencilBufferValue,具体更新的方式包括:

更新方式含义
Keep0保持当前buf的值不变
Zero1不管ref值为何值都将当前buf的值置0
Replace2将ref值写入buf,即将原来的buf值替换为现在的ref值
IncrementSaturate3不管ref值为何值都将当前buf的值+1,超过255不变
DecrementSaturate4不管ref值为何值都将当前buf的值置-1,超过0不变
Invert5不管ref值为何值都将当前buf的值按位取反
IncrementWrap6不管ref值为何值都将当前buf的值+1,若当前值为255增1则变为0
DecrementWrap7不管ref值为何值都将当前buf的值-1,若当前值为0减1则变为255

具体对应的值可在Unity的接口UnityEngine.Rendering.StencilOp枚举中查看,当所填值不在范围内时采用默认值zero(试验得来·)。

4. Read Mask & Write Mask

读遮罩与写遮罩,分别在读取与写入时对ref的值与buf的值进行掩码操作,最大255,默认255即不对ref值与buf值进行操作,直接读或者写。

(二)、Stencil实例

1. 新建材质

新建材质
新建材质MatCube、MatSphere,shader选择带Stencil的即可,可见Stencil Comparison的默认值是8即总在渲染时保留,另外将MatCube颜色设成黑色、MatSphere颜色设成白色便于区分。

2. 新建Cube与Sphere

新建Cube与Sphere,并将Cube放大2倍,调整好相对位置,设置好相机便于观察,Scene与Game视图如图,此时Cube与Sphere都被渲染出来了。
在这里插入图片描述

3. 设置参数

MatCube参数设置
这里参数的含义是将方块永远渲染出来并且将buf中的值(默认是0)替换成2,这时界面不会有任何变化,因为球体的Stencil Comparison是8默认渲染时全部保留,不管ref与buf中的值是多少。如图所示:
改变方块的参数界面显示
再将球体的Stencil Comparison改为3,即等于0的部分渲染时保留,此时界面就变成了这样,如图,因为方块已经将方块区域buf的值改成了2,而整个小球所有的ref值都是0,所以只有没被方块改变的部分,渲染时保留了下来。
等于0时显示
再将球体的ref值改为2,结果如图,只有buf值等于2的部分被渲染出来了。
在这里插入图片描述

4. 总结与注意

buf中值的更改总是作用于被Stencil影响的区域,没有影响的区域buf的默认值是0,并且buf中值的更新总是在渲染测试之后,所以在只有方块和球体且渲染顺序是Cube > Sphere的情况下,MatSphere中Stencil Operation无论为何值都不会影响方块与球体的渲染,只会影响后续在此位置的物体的渲染。

(三)、利用代码改变Stencil的相关参数

private Material m_MatSphere;
	void Start () 
	{
        //int op = (int)UnityEngine.Rendering.StencilOp.Replace;
        //int com = (int)UnityEngine.Rendering.CompareFunction.Equal;
        m_MatSphere = transform.GetComponent<Renderer>().material;
        if (m_MatSphere.HasProperty("_StencilComp") && m_MatSphere.HasProperty("_Stencil") && m_MatSphere.HasProperty("_StencilOp"))
        {
            //float value = m_MatSphere.GetFloat("_StencilComp");
            m_MatSphere.SetFloat("_StencilComp", 3);
            m_MatSphere.SetFloat("_Stencil", 3);
            m_MatSphere.SetFloat("_StencilOp", 3);
        }
    }

具体这些key可以先选中材质然后Edit Shader看到,如图所示:
key
将脚本挂在Sphere上,运行游戏,结果如下:
代码修改参数

(四)、渲染顺序

关于物体的渲染顺序可以在Frame Debugger中查看Windows -> Analysis -> Frame Debugger。如图:
Frame Debugger
点击Enable即可得到当前场景的渲染信息,点击小箭头也可查看每一步的渲染信息,如图也能看到当前场景中Cube的渲染是优于Sphere的所以Cube的Stencil Operation是能够影响Sphere的渲染的。
渲染信息

注意:当Stencil与Mask(比如使用ScrollRect时)一块使用时,会出现混乱,可以取消使用Mask,在ScrollRect与其子物体上使用Stencil来控制显示范围

  • 19
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Stencil Unity是一种船的设计理念,它注重船体的结构刚性和船身的稳定性。Stencil Unity船采用具有高刚性的船体结构,使船只能充分抵抗外部的力量,从而提高了船只的稳定性和航行安全性。 首先,Stencil Unity船的船体结构采用了特殊的设计方案。船体结构的主要工作是在船体的各个部分承受外部力量时分散和传递这些力量,以保持船只的稳定性。Stencil Unity船的船体采用了特殊的材料和结构形式,使得它具备更高的刚性,能够更好地承受外界力量的作用,从而提高船只整体的稳定性。 其次,Stencil Unity船注重船身的稳定性。船身是支撑整个船只的基础,船身的设计直接影响船只的航行稳定性和操控性。Stencil Unity船的船身设计考虑到了船只在不同水平面上的稳定性,通过优化船身的形状和船体的重心分布等方式,进一步提高了船只的稳定性。 最后,Stencil Unity船在实际航行表现出了更出色的性能。船只的稳定性和航行安全性直接关系到船只能否稳定地在各种恶劣环境航行,而Stencil Unity船正是通过船体结构和船身设计的优化,使得船只在恶劣环境下的适应能力得到了提升,大大降低了事故的风险。 总之,Stencil Unity船是一种注重船体结构刚性和船身稳定性的船型设计理念,通过优化船体结构和船身设计,提高了船只的稳定性和航行安全性,使得船只能够在恶劣环境稳定地航行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿斯提尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值