【本系列文章系学习 唐福幸《Unity ShaderLab 新手宝典》的笔记,包含个人理解,如有错误欢迎批评指出
最终效果: 
7.5 模板测试
在B物体上挖一个洞,形状是A物体的轮廓,所以要分别给A,B物体写脚本 A物体脚本:
Shader "Chapter7/Shader756A"
{
SubShader
{
Tags { "Queue"="Geometry-1" }
pass
{
Stencil
{
Ref 1
Comp Always
Pass Replace
}
ColorMask 0
ZWrite Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
float4 vert(in float4 vertex : POSITION) : SV_POSITION
{
float4 pos = UnityObjectToClipPos(vertex);
return pos;
}
void frag(out fixed4 color : SV_Target)
{
color = fixed4(1,1,1,1);
}
ENDCG
}
}
}
B物体脚本
Shader "Chapter7/Shader756B"
{
Properties
{
_MainColor ("Main Color", Color) = (1,1,1,1)
_MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Tags { "Queue"="Geometry" }
Pass
{
Tags {"LightMode" = "ForwardBase"}
Stencil
{
Ref 1
Comp NotEqual
Pass Keep
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "UnityLightingCommon.cginc"
struct v2f
{
float4 worldPos : TEXCOORD0;
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD1;
float2 texcoord : TEXCOORD2;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _MainColor;
v2f vert (appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
o.worldNormal = normalize(UnityObjectToWorldNormal(v.normal));
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
float3 worldLight = UnityWorldSpaceLightDir(i.worldPos.xyz);
worldLight = normalize(worldLight);
fixed NdotL = saturate(dot(i.worldNormal,worldLight));
fixed4 color = tex2D(_MainTex,i.texcoord);
color.rgb *= _MainColor * NdotL * _LightColor0.rgb;
color.rgb += unity_AmbientSky.rgb;
return color;
}
ENDCG
}
}
}
实现步骤:

- 创建一个胶囊体,位置归0,绑定带有A脚本的材质
- 创建一个正方体,位置归0,绑定带有B脚本的材质
- 在胶囊体后面放一个物体作为是否透明的参考
|