float4 frag (v2f i, uint facing : SV_IsFrontFace) : SV_Target
{
    UNITY_SETUP_INSTANCE_ID(i);
    #ifndef UNITY_PASS_SHADOWCASTER
        i.vDir = normalize(i.vDir);
        float3 lightning = 1.0, DirectSpecular = 0.0, col = 0.0;
        calcNormals(i, facing);
        float4 m = mFX(i);

        getLightning(i, lightning, DirectSpecular, m.w);
        m.xyz *= lerp(lightning, 1.0, _MetEmission);
        col = UNITY_SAMPLE_TEX2D(_MainTex, TRANSFORM_TEX(i.uv, _MainTex)) * _Color * lightning;

        UNITY_BRANCH if (_MetAdd != 0 && _MetMul != 1) col += m.xyz * m.w * _MetAdd;
        UNITY_BRANCH if (_MetMul != 0) col = lerp(col, m.xyz, m.w * _MetMul);

        #if defined(UNITY_PASS_FORWARDBASE)
            col += UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionMap, _MainTex, TRANSFORM_TEX(i.uv, _EmissionMap)) * _EmissionColor;
        #endif

        col += DirectSpecular;

        UNITY_APPLY_FOG(i.fogCoord, col);
        return float4(col, 1.0);
    #else
        SHADOW_CASTER_FRAGMENT(i);
    #endif
}