手前のオブジェクトだけテクスチャを使ってマスクをかける

まずカメラを二つ作成して同じ位置に用意する。
(奥のほうだけレンダリングするカメラと、手前のオブジェクトだけをレンダリングするカメラ)

奥のほうだけレンダリングするカメラをcam_0とする。
手前のオブジェクトだけをレンダリングするカメラをcam_1とする。

cam_1でレンダリングしたい手前のオブジェクトにはmaskというレイヤーを作ってそのレイヤーに指定しておく。

planeを用意してmask用のshaderを指定したマテリアルを付ける。
下記mask用shader(ビルトインシェーダーのTransparent Cutoutを改造したもの)

Shader "Unlit/Transparent Cutout_mask" {
Properties {
    _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
    _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}
SubShader {
    Tags { "Queue" = "Geometry+10" "IgnoreProjector"="True" "RenderType"="TransparentCutout"}
    LOD 100
    ColorMask 0
    Lighting Off

    Pass {
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 2.0
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata_t {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                float2 texcoord : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                UNITY_VERTEX_OUTPUT_STEREO
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed _Cutoff;

            v2f vert (appdata_t v)
            {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(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);
                clip(col.a - _Cutoff);
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
        ENDCG
    }
}

}


上記のmask用shaderはビルトインシェーダーのTransparent Cutoutを改造したもので、変更した点は2つ(他のshaderでも改造する際は下記の二つを足しておけば良い)

レンダーキューをGeometryの後に描画する(今回はマスクの後ろにあるオブジェクトのレンダーキューはGeometry(2000)なのでGeometry+10になっているが、他のレンダキューの場合、そのキューより後にレンダリングするように設定してあげれば良い)

"Queue" = "Geometry+10"


ColorMask 0と記載することですべてのカラーチャネルのレンダリングを無効化します(ようはこのオブジェクトはレンダリングしないよということ)

ColorMask 0


あとはこのshaderでマテリアルを作ってアルファ付きのテクスチャを貼っておく。

次にカメラの設定
cam_1のinspectorでClearFlagsをDepthOnlyにして
CullingMaskをmaskのみに設定
これでcam_1はmaskしかレンダリングしない
f:id:shinobigiken:20170802090316p:plain

cam_0はCullingMaskでmaskを外す
これでcam_0はmask以外をレンダリングすることになる
f:id:shinobigiken:20170802090227p:plain

下記のようになる
f:id:shinobigiken:20170802091037p:plain