デコシノニッキ

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

独習ShaderGraph その4 氷みたいな半透明をつくる

続きです。
www.tattichan.work

これまではパラメータをちょっといじる程度でしたがいきなりやることが増えます。
nn-hokuson.hatenablog.com

氷シェーダのシェーダプログラム

お手本にそってShaderを作成します。内積が分かれば理解できるはず。

Shader "Custom/sample" {
    SubShader{
        Tags{ "Queue" = "Transparent" }
        LOD 200

        //変更点
        //サーフェイスシェーダに、法線ベクトルと視線ベクトルを入力している
        //透明度の求めるために、ベクトル計算をしている
        //ドラゴンの輪郭部分の透明度が低くなっているのに対して、中央部分の透明度は高くなるようにする

        CGPROGRAM
#pragma surface surf Standard alpha:fade
#pragma target 3.0

        struct Input {
        //オブジェクトの法線ベクトル
        float3 worldNormal;
        //視線(カメラが向いている方の)ベクトル
        float3 viewDir;
    };

    void surf(Input IN, inout SurfaceOutputStandard o) {
        o.Albedo = fixed4(1, 1, 1, 1);

        //内積の基本
        //垂直: A * B = 0
        //平行: A * B = 1 or -1

        //オブジェクトの面が自分に向いている(平行な)ほど0に近くなる。
        //オブジェクトの輪郭は、自分から向いている向きに対してほぼ垂直なため0に近くなる
        //内積値をそのままアルファとして用いると、輪郭が透明になり、中央部分の透明度が低くなり、目的と逆の効果を生む。
        //そのため1から内積値を引いている
        float alpha = 1 - (abs(dot(IN.viewDir, IN.worldNormal)));
        //1.5fはお好みで数値をかえる
        o.Alpha = alpha*1.5f;
    }
    ENDCG
    }
        FallBack "Diffuse"
}

完成
f:id:haikage1755:20180127193943p:plain:w250

氷シェーダをノードでつくってみる

先に完成形です。先ほどの式をノードでそのまま再現してみます。
f:id:haikage1755:20180127195218p:plain

まずは内積を作りましょう。
・View Direction space view: 視線(カメラが向いている方の)ベクトル
・Normal Vector space world: オブジェクトの法線ベクトル
内積を計算してくれるDot Productに入力します。
f:id:haikage1755:20180127195323p:plain:w250

絶対値はAbsoluteで計算することができます。
f:id:haikage1755:20180127195736p:plain:w250

内積値を1から引く必要があるので、One Minusに入れます。
f:id:haikage1755:20180127195817p:plain:w250

出てきた値に1.5をかけます。1次元の定数はVector 1、掛け算にはMultiplyノードを使います。
f:id:haikage1755:20180127200047p:plain:w250

最終的なoutをalphaに入力すれば完成です。

f:id:haikage1755:20180127200132p:plain:w250

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