基本的な仕組みとしてはBox内の内側を指定した色にする。
Boxの開放部にGrabTextureを仕込んだシェーダを持つPlaneを設置し、そのGrabTextureの色が指定した色でなければ黒、にしている
boxに仕込むシェーダ
Shader "Unlit/TVShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Transparent" } LOD 100 Pass { Cull Front Lighting Off CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; }; struct v2f { float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); return o; } fixed4 frag (v2f i) : SV_Target { float val = 0.9998; return float4(val,val,val,val); } ENDCG } Pass { Cull Back CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv); // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } } }
planeに仕込むシェーダ
Shader "Custom/GrabShadow" { SubShader { Tags { "Queue" = "Transparent" } GrabPass { "_GrabPassTexture" } Pass { Cull Back Lighting Off CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" sampler2D _GrabPassTexture; struct v2f { half4 vertex : SV_POSITION; half4 grabPos : TEXCOORD0; }; v2f vert (float4 vertex : POSITION) { v2f o = (v2f)0; o.vertex = UnityObjectToClipPos(vertex); o.grabPos = ComputeGrabScreenPos(o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { float4 ori = tex2Dproj(_GrabPassTexture, i.grabPos); float val = 0.9998; float comp = 0.0005; if(ori.x==ori.y && ori.y == ori.z && ori.z == ori.w){ if(distance(ori.w,val) < comp){ return ori; } } return float4(0,0,0,0); } ENDCG } } FallBack "Diffuse" }