旅行しながら働く ムラサメ研究所社長ブログ

主にゲームやプログラミングのログ

UNITYで影をつくる〜ShadowCaster

UNITYでは簡単に影を落とせます
具体的には ShadowCasterパスにて

 #include "UnityStandardShadow.cginc"

とするだけです
CUBEMAPや各種設定に対応するため 上記の用意されたものを呼ぶ
あるいは その中身をみて ビルトイン関数を使うべきですが
勉強のために ビルトイン関数を呼ばずに影を作ってみます

コードはこちら

github.com

影の設定

UNITYでは影のON/OFFは MeshRendererの設定から行う

f:id:murasame-labo:20180909021251p:plain

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を使います

これで地面に影が出るはずです