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

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

shader Box内に入ると黒くするやつ ステンシル+視界ジャックver

 

Box

Shader "Custom/StencilBox" {
	SubShader{
		Tags{"RenderType"="Transparent" "Queue" = "Transparent+99999"}
		Blend SrcAlpha OneMinusSrcAlpha
		Pass{
			Stencil {
				Ref 1
				Comp always
				Pass replace
			}
			Cull Front
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct appdata {
				float4 vertex:POSITION;
				float4 uv:TEXCOORD0;
				float3 normal : NORMAL;
			};

			struct v2f {
				float4 pos:SV_POSITION;
				float4 uv:TEXCOORD0;
			};

			v2f vert(appdata v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}

			float4 frag(v2f i) :SV_Target {
				return float4(0,0,0,0);
			}
			ENDCG
		}//Pass
		Pass{
			Stencil {
				Ref 0
				Comp Equal
			}
			Cull Back
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct appdata {
				float4 vertex:POSITION;
				float4 uv:TEXCOORD0;
				float3 normal : NORMAL;
			};

			struct v2f {
				float4 pos:SV_POSITION;
				float4 uv:TEXCOORD0;
			};

			v2f vert(appdata v){
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				o.uv = v.uv;
				return o;
			}

			float4 frag(v2f i) :SV_Target {
				return float4(0,0,0,1);
			}
			ENDCG
		}//Pass
	}//SubShader
	FallBack "Diffuse"
}

視界ジャック

Shader "Custom/jack" {
	Properties{
		_Scale("Scale",Range(1,10)) = 1
		_Near("Near",Range(0,1)) = 0.3
	}
	SubShader{
		Tags{"RenderType" = "Transparent" "Queue" = "Transparent+1000000"  "DisableBatching"="true"}
		Blend SrcAlpha OneMinusSrcAlpha
		Pass{
			Stencil{
				Ref 0
				Comp Equal
			}
			ZTest always
			Cull Front
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#include "UnityCG.cginc"

			struct appdata {
				float4 vertex:POSITION;
			};

			struct v2f {
				float4 pos:SV_POSITION;
			};

			float _Scale;
			float _Near;
			float BoxLength(){
				float s = _Scale/2+_Near;//Boxサイズ=Scale/2,カメラのnearclip位置を考慮する必要あり
				float3 CuPos = mul(unity_ObjectToWorld,float4(0,0,0,1));
				float3 p = abs(CuPos.xyz-_WorldSpaceCameraPos) - float3(s,s,s);
				return length(max(p,0.0));
			}

			v2f vert(appdata v){
				v2f o = (v2f)0;
				//プロジェクション座標系で考える(x,yが-1~1で表される)
				o.pos = float4(v.vertex.xy*2.0,1,1);
				return o;
			}

			float4 frag(v2f i) :SV_Target {
				if(BoxLength()<0.001) return float4(0,0,0,1);
				clip(-1);
				return float4(0,0,0,0);//エラーが出るのでダミーに
			}
			ENDCG
		}//Pass
	}//SubShader
	FallBack "Diffuse"
}   

Unity上ではうまく動くがvrchatに持っていくと、視界の前に何かあってステンシルが上書きされてしまうのか、真っ黒になってしまう。