デコシノニッキ

デコシノニッキ

ホロレンジャーの戦いの記録

独習ShaderGraph その5 リムライティング

前回 www.tattichan.work

リムライティングというカッコいいエフェクトです。リムは"ふち"っていう意味です。
nn-hokuson.hatenablog.com

リムライティングのシェーダプログラム

今回もコードにちょこちょこメモしています。

Shader "Custom/sample" {
    SubShader{
        Tags{ "RenderType" = "Opaque" }
        LOD 200

        //氷シェーダーをベースに
        //オブジェクトの輪郭部分のエミッションを高くする


        CGPROGRAM
#pragma surface surf Standard 
#pragma target 3.0

        struct Input {
        float2 uv_MainTex;
        float3 worldNormal;
        float3 viewDir;
    };

    void surf(Input IN, inout SurfaceOutputStandard o) {
        //基本カラー
        fixed4 baseColor = fixed4(0.05, 0.1, 0, 1);
        //リムカラー
        fixed4 rimColor = fixed4(0.5,0.7,0.5,1);

        o.Albedo = baseColor;

        //求めたrim(0< rim <1)をrimColorにかける
        //が、そのままだとcosθに従うので減衰が弱い
        //3乗することによって減衰を強調してやる
        //satulate: 値を0~xに制限する
        float rim = 1 - saturate(dot(IN.viewDir, o.Normal));
        o.Emission = rimColor * pow(rim, 2.5);
    }
    ENDCG
    }
        FallBack "Diffuse"
}

いきなり出てきたsatulate、どうやら値をclampする関数のようです。
nyahoon.com

適応
f:id:haikage1755:20180127212124p:plain:w250

リムライティングのノード

完成形です
f:id:haikage1755:20180128011220p:plain:w350

内積をとって1から引くパートです。氷のときとほぼ同じなのですが、さきほどのsaturateをabsoluteの代わりに使います。もしくはclampでも代用できます。 f:id:haikage1755:20180128011303p:plain:w250

Power(Mathf.Powとかで使われるPowはPowerの略)で渡ってきた値を2.5乗してあげます。 f:id:haikage1755:20180128011456p:plain:w250

最後にふちの色と掛け合わせてEmissionに代入して終わりです。この時注意といいますか、氷のときのShaderをそのまま使うとAlphaBlendになっていると思うのですが、ここをOverWriteにしておかないと、中途半端に透けたりと見た目が壊れるので注意です。 f:id:haikage1755:20180128011627p:plain:w250

完成した姿
f:id:haikage1755:20180128011852p:plain

ベースカラーが重たい色になってしまっていますが、ふちが明るくなり、輪郭が協調されているのが分かると思います。
今回は以上です。

おまけ
途中分からなくなり、試しにShaderForgeでも作ってみました
f:id:haikage1755:20180128012123p:plain:w250

[デコシノニッキ]は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」