イラスト、モデリング、Unity、VR関連

unityとかblenderとかvr関連の作業メモ

shader Box内に入ったオブジェクトを黒くするやつ、with ZTestとステンシル

 

f:id:arumogina:20190629032530p:plain

 

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
    }
  }
}