unity-shaderテンプレートテスト-マスク
unity-shaderテンプレートテスト-マスク
シーン中の人物aは、見えないことを隠す、1つの平面bを用いて表示面、平面bが人物aと重なるとき、平面bの範囲内の人物aを表示する.
まず平面bを描画するとともに、テンプレートバッファを参照値1(Ref 1、値は任意) に記入する.再描画人物aは、基準値を1とし、比較テンプレートバッファの基準値が同じであるから通過する. 描画の前後順から分かるように、平面bのRenderQueue値<人物a.(大きいほど後に描画).shaderコード
平面bのRenderQueueは透明度タイプの上、3000とする.Alpha値を0にすればよい
人物aは3000+であり、3001と仮定する
効果
じっけんこうか
シーン中の人物aは、見えないことを隠す、1つの平面bを用いて表示面、平面bが人物aと重なるとき、平面bの範囲内の人物aを表示する.
げんり
平面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
}
}
}