I'd create a depth mask for that.
Follow this tutorial, i've used this one in the past and it would produce your desired result.
https://www.youtube.com/watch?v=uxXEV91xsSc
Code from the video (credits for video: https://www.blog.radiator.debacle.us/2012/08/how-to-dig-holes-in-unity3d-terrains.html)
Custom Depth Shader
//Place onto the object you want to see things through i.e. window / hole
Shader "Custom/CustomDepthShader" {
SubShader {
Tags {"Queue" = "Geometry+10" }
Lighting Off
ZTest LEqual
ZWrite On
ColorMask 0
Pass {}
}
}
Custom Depth Shader Terrain
// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
// Unity Standard terrain shader + custom "Queue" = "Geometry+100"
Shader "Custom/CustomDepthShader(Terrain)" {
Properties {
[HideInInspector] _Control ("Control (RGBA)", 2D) = "red" {}
[HideInInspector] _Splat3 ("Layer 3 (A)", 2D) = "white" {}
[HideInInspector] _Splat2 ("Layer 2 (B)", 2D) = "white" {}
[HideInInspector] _Splat1 ("Layer 1 (G)", 2D) = "white" {}
[HideInInspector] _Splat0 ("Layer 0 (R)", 2D) = "white" {}
[HideInInspector] _Normal3 ("Normal 3 (A)", 2D) = "bump" {}
[HideInInspector] _Normal2 ("Normal 2 (B)", 2D) = "bump" {}
[HideInInspector] _Normal1 ("Normal 1 (G)", 2D) = "bump" {}
[HideInInspector] _Normal0 ("Normal 0 (R)", 2D) = "bump" {}
// used in fallback on old cards & base map
[HideInInspector] _MainTex ("BaseMap (RGB)", 2D) = "white" {}
[HideInInspector] _Color ("Main Color", Color) = (1,1,1,1)
}
CGINCLUDE
#pragma surface surf Lambert vertex:SplatmapVert finalcolor:SplatmapFinalColor finalprepass:SplatmapFinalPrepass finalgbuffer:SplatmapFinalGBuffer noinstancing
#pragma multi_compile_fog
#include "TerrainSplatmapCommon.cginc"
void surf(Input IN, inout SurfaceOutput o)
{
half4 splat_control;
half weight;
fixed4 mixedDiffuse;
SplatmapMix(IN, splat_control, weight, mixedDiffuse, o.Normal);
o.Albedo = mixedDiffuse.rgb;
o.Alpha = weight;
}
ENDCG
Category {
Tags {
"Queue" = "Geometry+100"
"RenderType" = "Opaque"
}
// TODO: Seems like "#pragma target 3.0 _TERRAIN_NORMAL_MAP" can't fallback correctly on less capable devices?
// Use two sub-shaders to simulate different features for different targets and still fallback correctly.
SubShader { // for sm3.0+ targets
CGPROGRAM
#pragma target 3.0
#pragma multi_compile __ _TERRAIN_NORMAL_MAP
ENDCG
}
SubShader { // for sm2.0 targets
CGPROGRAM
ENDCG
}
}
Dependency "AddPassShader" = "Hidden/TerrainEngine/Splatmap/Diffuse-AddPass"
Dependency "BaseMapShader" = "Diffuse"
Dependency "Details0" = "Hidden/TerrainEngine/Details/Vertexlit"
Dependency "Details1" = "Hidden/TerrainEngine/Details/WavingDoublePass"
Dependency "Details2" = "Hidden/TerrainEngine/Details/BillboardWavingDoublePass"
Dependency "Tree0" = "Hidden/TerrainEngine/BillboardTree"
Fallback "Diffuse"
}
Hide Object
//Add to any object you want to hide when looking through the depthmask (DOES NOT WORK ON TERRAIN, USE CUSTOM TERRAIN SHADER)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HideObject : MonoBehaviour {
void Start (){
// get all renderers in this object and its children:
var renders = GetComponentsInChildren<Renderer>();
foreach(Renderer rendr in renders){
rendr.material.renderQueue = 3000;
}
}
}