— 光属性のアルモジナ(VRChat勢) (@arumogina) June 28, 2019
1pass目はComp Alwaysなのでステンシルは常に通る。 CullFrontしているので、Boxの裏側が見えない場合ZFailとなり1が書き込まれる。 2pass目はCullBack,ZTestGreaterでオブジェクトがboxの表面より近くにある場合0を書き込んでいる。 3pass目でCull Front,ステンシルで1が書き込まれてるピクセルのみ描画することで、Box内部にあるオブジェクトの位置のピクセルのみに描写している。
Shader "Custom/Kago" { SubShader{ Tags{"RenderType"="Opaque" "Queue" = "Overlay"} Pass{ ColorMask 0 Cull Front Stencil{ Ref 1 Comp Always Pass Zero ZFail Replace } //float4(0,0,0,0)を返してるのと同じ } Pass{ ColorMask 0 ZTest Greater Cull Back Stencil{ Ref 0 Comp Always Pass Replace } } Pass{ Blend SrcAlpha OneMinusSrcAlpha Cull Front ZTest Greater Stencil{ Ref 1 Comp Equal Pass Zero } CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex:POSITION; }; struct v2f { float4 pos:SV_POSITION; }; v2f vert(appdata v){ v2f o = (v2f)0; o.pos = UnityObjectToClipPos(v.vertex); return o; } float4 frag(v2f i) :SV_Target { return float4(0,0,0,1); } ENDCG } } }