【Unity】【シェーダ】ライトの方向を考慮したリムシェーダ

ライトの方向を考慮したリムシェーダを書いてみます。

Unity2018.4.0

シェーダ

早速ですがシェーダです。

Shader "Rim"
{
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            
            #include "UnityCG.cginc"

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

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float3 viewDir : TEXCOORD1;
                float3 lightDir : TEXCOORD2;
                float3 normal : TEXCOORD3;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                float3 worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
                o.viewDir = normalize(UnityWorldSpaceViewDir(worldPos));
                o.lightDir = normalize(UnityWorldSpaceLightDir(worldPos));
                o.normal = UnityObjectToWorldNormal(v.normal);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                i.viewDir = normalize(i.viewDir);
                i.lightDir = normalize(i.lightDir);
                i.normal = normalize(i.normal);
                
                // リムのかかり方を調整したければpowの第二引数をそれぞれ調整する
                half vdotn = pow(1.0 - max(0, dot(i.normal, i.viewDir)), 1);
                half ldotn = pow(max(0, dot(i.normal, i.lightDir)), 1);
                return ldotn * vdotn;
            }
            ENDCG
        }
    }
}

結果

レンダリング結果は以下のようになります。

f:id:halya_11:20190514004357p:plain

ライトの方向が重点的に照らされていることがわかります。