透明效果(七)--模板测试的计算流程和使用语法

本文讲解了如何利用Unity ShaderLab的模板测试功能实现像素级透明效果,包括模板值的计算流程、使用语法,以及比较方法和模板操作。通过A物体的参照值与B物体像素的对比,实现镂空效果和自定义透明规则。

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

【本系列文章系学习 唐福幸《Unity ShaderLab 新手宝典》的笔记,包含个人理解,如有错误欢迎批评指出

在这里插入图片描述

一句话总结:A物体表示镂空部分(负责设定参照值),B物体的各个像素与参照值进行比较,不满足条件的像素丢弃掉,形成镂空效果

7.5 模板测试

通过模板测试达到逐像素的保留或丢弃像素的目的

7.5.1 模板测试的计算流程

模板值:模板缓存中,每个像素都有一个8位(0-255)的整数值。可以被改写/递增/递减。
模板值作用:在执行Draw Call时,像素的参照值会与缓存中的模板值进行比较,如果结果不符合要求,会被丢弃,以此实现透明效果

  1. 为物体A指定一个参照值m,将m写入缓存,变成模板值;通过模板测试进行渲染
  2. 为物体B指定参照值n,把n与缓存中的模板值m进行比较
  3. 满足比较方法时,通过模板测试(渲染 ),否则不通过(丢弃)

在这里插入图片描述
不管能否通过测试,在测试结束后都可以对缓存中的模板值做操作(保留,替换等)

7.5.2 模板测试的使用语法

模板测试的指令写在Stencil{ }中,Stencil可以在SubShader、Pass中

Stencil
{
	Ref referenceValue // 参照值,用来与缓存中已经存在的模板值进行比较的数值
	ReadMask readMask // 范围(0-255)当读取参照值与模板值可以使用时,用来制定哪些位数值可以读取,默认255:表示所有位都可以读取
	WriteMask wirteMask // 范围(0-255)当往缓存中写入的时候,用来指定哪些数值允许被写入缓存,默认255,表示所有位都允许写入
	Comp comparisonFunction // 将参照值与模板值进行比较的方法,默认always
	Pass stencilOperation // 如果模板测试和深度测试都通过,缓存中的模板值如何处理,默认keep
	Fail stencilOperation // 如果模板测试没有通过,模板值如何处理,默认keep
	zFail stencilOperation //如果模板测试通过,深度测试没通过,缓存中的值如何处理,默认keep
}
7.5.3 比较方法
比较方法说明
Greater当前渲染像素的参照值 > 缓存的模板值时,通过测试
GEqual当前渲染像素的参照值 >= 缓存的模板值时,通过测试
Less当前渲染像素的参照值 < 缓存的模板值时,通过测试
LEqual当前渲染像素的参照值 <= 缓存的模板值时,通过测试
Equal当前渲染像素的参照值 = 缓存的模板值时,通过测试
NotEqual当前渲染像素的参照值 != 缓存的模板值时,通过测试
Always当前渲染像素总是通过测试
Never当前渲染像素总是不通过测试
7.5.4 模板操作

不管能否通过测试,都可以对缓存中的模板值做操作:

操作说明
Keep保持模板值
Zero把0写进模板值
Replace当前像素的参照值写进缓存
IncrSat递增模板值(到255停止)
DecrSat递减模板值(到0停止)
Invert将模板值按位取反
IncrWrap循环递增模板值(如果是255,变成0)
DecrWarp循环递减模板值(如果是0,变成255)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值