影の処理、ちょっと理解した pic.twitter.com/Uip3oE1RM2
— DefaultCube-DC01-E01 アルモジナ(VRChat勢) (@arumogina) 2020年4月4日
参考:
【Unity】【Shader】影を描画する、影を受け取る - Qiita
1pass目で他のオブジェクトからの影を受け取り自身にかかる影を描画
2pass目で他のオブジェクトに自身から伸びる影を情報を渡している
Shader "Unlit/ShadowVF" { Properties { _Color("Color",Color) = (0,1,0,1) _ShadowColor("ShadowColor",Color) = (1,0,0,1) } SubShader { Pass { Tags { "LightMode"="ForwardBase" } CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fwdbase nolightmap nodirlightmap nodynlightmap novertexlight #include "UnityCG.cginc" #include "UnityLightingCommon.cginc" #include "Lighting.cginc" #include "AutoLight.cginc" float4 _Color; float4 _ShadowColor; struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; float2 texcoord : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; fixed4 diff : COLOR0; float4 pos : SV_POSITION; // posに変更する!!TRANSFER_SHADOWがposとうい名前でないと受け付けない。 SHADOW_COORDS(1) }; v2f vert (appdata v) { v2f o; // ここの左辺もposに変更 o.pos = UnityObjectToClipPos(v.vertex); o.uv = v.texcoord; half3 worldNormal = UnityObjectToWorldNormal(v.normal); half NdotL = saturate(dot(worldNormal, _WorldSpaceLightPos0.xyz)); o.diff = NdotL * _LightColor0; TRANSFER_SHADOW(o) return o; } fixed4 frag (v2f i) : SV_Target{ //影はここで計算する //SHADOW_ATTENUATIONで他のオブジェクトから影の濃度を受け取っている //濃度に合わせて任意の色を掛ければそれが影の色に出来る float shadow = SHADOW_ATTENUATION(i); float4 col = i.diff * lerp(_ShadowColor,_Color,shadow); return col; } ENDCG } Pass{ /* 他のオブジェクトに影の情報を渡している 上記のSHADOW_ATTENUATION(i)の返り値となる値を考えればよいと思う */ Tags{ "LightMode"="ShadowCaster" } CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_shadowcaster #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; float2 texcoord : TEXCOORD0; }; struct v2f{ V2F_SHADOW_CASTER; }; v2f vert (appdata v) { v2f o; TRANSFER_SHADOW_CASTER_NORMALOFFSET(o) return o; } fixed4 frag (v2f i) : SV_Target{ SHADOW_CASTER_FRAGMENT(i) } ENDCG } } }