首页 技术 正文
技术 2022年11月21日
0 收藏 484 点赞 4,597 浏览 2228 个字

参考链接:

https://blog.csdn.net/u011047171/article/details/46928463

https://blog.csdn.net/JohnBlu/article/details/83539427

模板测试和深度测试很相似:

1.如果模板测试不通过,则该像素会被舍弃

2.有模板缓冲区,每像素对应存放一个8位整数(0-255)

3.模板测试也是一个比较值的过程,将参考值和模板缓冲的值进行比较

当然也有很不同的地方:

1.即使模板测试不通过,仍然可以修改模板缓冲中的值

一.语法

1.Ref referenceValue

设置参考值,referenceValue(范围0-255)

2.ReadMask readMask

参考值和模板缓冲的值,会和readMask进行按位与(&)操作,readMask(范围0-255),默认值为255,即对读取值不作修改

3.WriteMask writeMask

当将值写入模板缓冲时,值会和writeMask进行按位与(&)操作,writeMask(范围0-255),默认值为255,即对写入值不作修改

4.Comp comparisonFunction

参考值和缓冲值要怎样比较,默认值为always,comparisonFunction可以取的值如下:

[UnityShader基础]05.模板测试

5.Pass stencilOperation

当模板测试和深度测试都通过时,模板缓冲的值要怎么处理,默认值为keep,stencilOperation可以取的值如下:

[UnityShader基础]05.模板测试

6.Fail stencilOperation

当模板测试不通过时,模板缓冲的值要怎么处理,默认值为keep

7.ZFail stencilOperation

当模板测试通过,深度测试不通过时,模板缓冲的值要怎么处理,默认值为keep

二.判断依据

if (参考值 & readMask comparisonFunction 缓冲值 & readMask) 像素通过

else 像素舍弃

因为readMask默认值为255,所以这时可以简化为:if (参考值 comparisonFunction 缓冲值)

三.实例(限制渲染区域,效果类似于Scroll View)

1.Stencil2.shader

 Shader "Custom/Stencil2"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue"="Geometry" } Pass
{
Stencil
{
Ref
Comp Equal
} CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
}; struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
}; sampler2D _MainTex;
float4 _MainTex_ST; v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}

这个shader的意思是:

Ref 1:将参考值设置为1

Comp Equal:if (参考值 == 缓冲值) 像素通过 else 像素舍弃

将这个shader赋给一个Capsule,会发现整个Capsule都不见了,说明模板测试没有通过。如果改为Ref 0,会发现Capsule又出来了,说明模板缓冲中的值默认是0。

2.Stencil.shader

 Shader "Custom/Stencil"
{
Properties
{
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue"="Geometry" } Pass
{
ZWrite Off
ColorMask Stencil
{
Ref
Comp Always
Pass Replace
} CGPROGRAM
#pragma vertex vert
#pragma fragment frag #include "UnityCG.cginc" struct appdata
{
float4 vertex : POSITION;
}; struct v2f
{
float4 vertex : SV_POSITION;
}; v2f vert (appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
return o;
} fixed4 frag (v2f i) : SV_Target
{
return fixed4(, , , );
}
ENDCG
}
}
}

这个shader的意思是:

ColorMask 0:不输出颜色

ZWrite Off:关闭深度写入,防止后面的像素被剔除

Ref 1:设置参考值为1

Comp Always:模板测试始终通过

Pass Replace:将参考值赋值给缓冲值

将这个shader赋给一个Quad,即表示Quad所处区域的模板缓冲值刷新为1。又因为Capsule的参考值为1,因此,只有这两个物体重叠的部分才会有显示,效果如下:

[UnityShader基础]05.模板测试

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,035
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,521
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,369
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,150
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,783
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,864