【Unity Shader】关于Stencil的理解小记

本文介绍了Unity Shader中的Stencil基本概念,包括Ref、Comp、Pass参数的使用。通过实例展示了如何设置Stencil实现不同阴影重叠效果,并分析了各种组合的工作原理,帮助理解Stencil在渲染流程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面:本文只介绍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<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值