Unity Shader (六)模板測試(Stencil)
阿新 • • 發佈:2018-11-05
模板測試的作用:對畫素進行一個全方位的輸出控制,這句話是我自己的理解。為什麼叫全方位的呢?
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
}
}}
打個小廣告 歡迎加入獨立遊戲開發