unity-shader模板测试-遮罩
实验效果
场景中有个 人物a, 隐藏看不见, 使用一个 平面b 当显示面, 当 平面b 移到与 人物a 重叠时, 显示 平面b 范围内的 人物a.
原理
- 先绘制 平面b, 同时把 模板缓冲区 填一个参考值1 (Ref 1, 值可以随意)
- 再绘制 人物a, 设置 参考值为1, 比较 模板缓冲区 的参考值 相同 才通过.
- 由绘制的先后顺序可知, 平面b 的 RenderQueue 值 < 人物a. (越大越后绘制). shader代码
平面b 加上透明效果
平面b 的 RenderQueue 设为透明度类型之上, 假设为 3000. alpha 值调为 0即可
则 人物a 的为 3000+, 假设为 3001
效果
shader代码
平面b 上的shader - testStencilByMaskPlane.shader
Shader "ITS/test/testStencilByMaskPlane" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_MainColor ("Color", Color) = (1, 1, 1, 1)
}
SubShader {
// Tags { "RenderType"="Transparent" }
Tags {"Queue"="Transparent" "RenderType"="Transparent"}
LOD 100
Blend SrcAlpha OneMinusSrcAlpha
Pass {
Stencil
{
Ref 1
Comp Always
Pass Replace
ZFail Replace
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
UNITY_FOG_COORDS(1)
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _MainColor;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.texcoord);
col *= _MainColor;
UNITY_APPLY_FOG(i.fogCoord, col);
// UNITY_OPAQUE_ALPHA(col.a);
return col;
}
ENDCG
}
}
}
人物a 上的shader - testStencilByMaskChar .shader
Shader "ITS/test/testStencilByMaskChar" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_MainColor ("Color", Color) = (1, 1, 1, 1)
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 100
Pass {
ZTest LEqual
Stencil
{
Ref 1
Comp Equal
}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
UNITY_FOG_COORDS(1)
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _MainColor;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.texcoord);
col *= _MainColor;
UNITY_APPLY_FOG(i.fogCoord, col);
UNITY_OPAQUE_ALPHA(col.a);
return col;
}
ENDCG
}
}
}