模板测试的作用:对像素进行一个全方位的输出控制,这句话是我自己的理解。为什么叫全方位的呢?
why?? 我们不是有深度测试 和 alpha测试了吗。
- 想想Alpha测试,他针对的是alpha值,而alpha值是美术的图片控制的,有些场合你alpha值不透明但是你还是想他透明,就不好办了。
- 再想想深度测试,他针对的是摄像机的深度,你可以通过渲染队列,以及融合来更改渲染顺序,但是仍然达不到随心所欲的渲染控制。
这里先上一张用模板测试的例子
Game视图
Scene视图
要实现这个模型遮罩的效果其实很简单,我们只需要让钥匙模型的像素不通过模板测试即可
Shader "SoulCoder/Model" {
Properties {
_Color ("Main Color", Color) = (1,1,1,0)
}
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry+2"}
ColorMask RGB
Cull Front
ZTest Always
Stencil {
Ref 0
Comp Equal
}
CGPROGRAM
#pragma surface surf Lambert
float4 _Color;
struct Input {
float4 color : COLOR;
};
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = _Color.rgb;
o.Normal = half3(0,0,-1);
o.Alpha = 1;
}
ENDCG
}
}
//遮罩
Shader "SoulCoder/Mask" {
SubShader {
Tags { "RenderType"="Opaque" "Queue"="Geometry+1"}
ColorMask 0
ZWrite off
Stencil {
Ref 1
Comp always
Pass replace
}
CGINCLUDE
struct appdata {
float4 vertex : POSITION;
};
struct v2f {
float4 pos : SV_POSITION;
};
v2f vert(appdata v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
return o;
}
half4 frag(v2f i) : SV_Target {
return half4(1,1,0,1);
}
ENDCG
Pass {
Cull Front
ZTest Less
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
Pass {
Cull Back
ZTest Greater
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}}
打个小广告 欢迎加入独立游戏开发