今日まなび(20240826):影を落とすShader+Unityのレンダリング基礎知識おさらい

「今日まなび」は最低1日1h、ゲーム作るために学びたいことなんでもいいから学んでいくコーナー。
完全自分用でまとめることは考えなくてOK.1記事1h。(1hでどんだけ学べるかのスピード感もみていきたいので)
1hのうちに次回学ぶことも決定しておくこと


本日は自作Shaderを適応すると影が描画されない課題を調査していきます。
▼右がStanderdシェーダー、左が自作スタムShader

今日の学び:とりあえず影を落とす処理を作成

影を描画する用のPassを追加すると影が出る。

 Pass
    {
        //実態を描く:自分がカスタムした部分
    }
    Pass
    {
        Tags{ "LightMode"="ShadowCaster" }

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #pragma multi_compile_shadowcaster

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

        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
    }

今日の学び:レンダリングパス

上記をコピペすれば影を落とせるがそれでは理解していないのでまずはレンダリングまわりの基礎知識をおさらいする。

レンダリングパイプライン

Unityでは現時点で、ビルドインパイプライン(BRPとか略されてることもよくある)、URP、HDRPの3つ用意されている。 これに+してレンダリングパイプラインをカスタムすることもでき、これをSRPという。

BRPのレンダリングパスは2つでカメラ単位に設定可能

で、まずは基本のBRPを見ていく。 BRPのレンダリングパスは、フォワードレンダリング、ディファードシェーディングの2つある(レガシーになっているのは省略する) デフォルトはフォワードレンダリングになっている。 ディファードシェーディングはより忠実なライトと影の表現ができるものだが、フォワードでできていた機能が一部使えないなど制限もある。 基本フォワードにしていて必要な場面でディファードを使っていくのがよさそう?

docs.unity3d.com

プロジェクト全体で設定する方法と、+カメラ単位に設定を上書きすることもできる

TODO (調べたいこと、やりたいこととか疑問)

・Quadの影を落としたい ←今進行中
・ことなるポストプロセスを適応したい場合にカメラを分けなくてもいい方法あるんじゃないか
・Unityで深度バッファの値をどうやって取得できる?
・法線マップを扱う
・shaderで図形描いたりするのによく使う関数と使い方まとめ