— 光属性のアルモジナ(VRChat勢) (@arumogina) June 27, 2019
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に持っていくと、視界の前に何かあってステンシルが上書きされてしまうのか、真っ黒になってしまう。