UNITYで影をつくる〜ShadowCaster
UNITYでは簡単に影を落とせます
具体的には ShadowCasterパスにて
#include "UnityStandardShadow.cginc"
とするだけです
CUBEMAPや各種設定に対応するため 上記の用意されたものを呼ぶ
あるいは その中身をみて ビルトイン関数を使うべきですが
勉強のために ビルトイン関数を呼ばずに影を作ってみます
コードはこちら
影の設定
UNITYでは影のON/OFFは MeshRendererの設定から行う
UNITYでは
ShadowCasterパスでシャドウマップに書き込み
ShadowRecieveパスで影を描画していましたが
いつからか ShadowRecieveパスがなくなり(効率化!)
SHADOW_ATTENUATION として、通常のレンダリングパスで影を取得出来るようになりました
ShadowCaster
上記のincludeを使わず自力で行ってみます
ShadowCasterパスをつくり、そこに下記のコードを
Pass { Name "ShadowCaster" Tags { "LightMode" = "ShadowCaster" } ZWrite On ZTest LEqual CGPROGRAM #pragma target 3.0 #pragma vertex vertShadowCaster #pragma fragment fragShadowCaster struct VertexInput { float4 vertex : POSITION; }; struct VertexOutput { float4 pos : SV_POSITION ; }; VertexOutput vertShadowCaster (VertexInput v) { VertexOutput o = (VertexOutput)0; o.pos = UnityObjectToClipPos( v.vertex ); return o; } float4 fragShadowCaster(VertexOutput i) : SV_TARGET { return 0; } ENDCG }
基本的に ShadowCasterパスでは色は関係ないようです
Zバッファに書き込むだけでよさそう
影のZファイティングを避けるため LEqualを使います
これで地面に影が出るはずです