simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

URP MToon シェーダーで日陰で暗くならない問題を解決できている

次のコード、修正前は false を返していましたが、true を返すように書き換えました

// EXPERIMENTAL
inline bool MToon_IsPbrCorrectOn()
{
    return true;
}

修正前の課題感(日陰で暗くならない?)

修正後の改善案(日陰になじんでくれるようになりました)

まだ有効化前の機能の様子?
でも、いい感じです

実装メモ:
やっぱりまだ実験的なコードな様子
動的に WebGL で読み込んで表示すると、影の出方が壊れているのでいったんオフに

さらに、Shadow に関しては 1 を返すところ、 0.35 を返すのが無難(明るくなりすぎない)

inline half GetMToonLighting_Shadow(const UnityLighting lighting, const half dotNL)
{
    if (MToon_IsPbrCorrectOn())
    {
        return lighting.directLightAttenuation.x * step(0, dotNL);
    }

    if (MToon_IsForwardBasePass())
    {
        return 0.35; // ココ 1 を 0.35 にした
    }

追記2
indirectLight が明るすぎて、暗がりにいても光ってしまうので 0.5 のところを 0.1 にしました

UnityLighting GetUnityLighting(const Varyings input, const half3 normalWS)
{
    MTOON_LIGHT_DESCRIPTION(input, atten, lightDir, lightColor);

    if (MToon_IsForwardBasePass())
    {
        UnityLighting output;
        output.indirectLight = MToon_SampleSH(half3(normalWS));
        output.indirectLightEqualized = (MToon_SampleSH(half3(0, 1, 0)) + MToon_SampleSH(half3(0, -1, 0))) * 0.1; // ココ0.5 を 0.1 にした

これで一応、明るすぎず、メインライトの影響を受ける見た目になりました