【本系列文章系学习 唐福幸《Unity ShaderLab 新手宝典》的笔记,包含个人理解,如有错误欢迎批评指出
一句话总结:A物体表示镂空部分(负责设定参照值),B物体的各个像素与参照值进行比较,不满足条件的像素丢弃掉,形成镂空效果
7.5 模板测试
通过模板测试达到逐像素的保留或丢弃像素的目的
7.5.1 模板测试的计算流程
模板值:模板缓存中,每个像素都有一个8位(0-255)的整数值。可以被改写/递增/递减。
模板值作用:在执行Draw Call时,像素的参照值会与缓存中的模板值进行比较,如果结果不符合要求,会被丢弃,以此实现透明效果
- 为物体A指定一个参照值m,将m写入缓存,变成模板值;通过模板测试进行渲染
- 为物体B指定参照值n,把n与缓存中的模板值m进行比较
- 满足比较方法时,通过模板测试(渲染 ),否则不通过(丢弃)
不管能否通过测试,在测试结束后都可以对缓存中的模板值做操作(保留,替换等)
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) |