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

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

Shader 影絵シェーダ

基本的な仕組みとしてはBox内の内側を指定した色にする。

Boxの開放部にGrabTextureを仕込んだシェーダを持つPlaneを設置し、そのGrabTextureの色が指定した色でなければ黒、にしている

 

f:id:arumogina:20190613045345p:plain

 

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