     f_emissive *= SRGBtoLINEAR(texture(u_EmissiveSampler, getEmissiveUV())).rgb;
 #endif
 
-    vec3 color = vec3(0); // f_emissive + f_specular + f_diffuse + punctualColor;
+    vec3 color = vec3(0);
+
+///
+/// Layer blending
+///
 
     vec3 blendFactor = vec3(0.f);
 
     #ifdef MATERIAL_CLEARCOAT
-        blendFactor = materialInfo.clearcoatFactor * fresnelReflection(vec3(0.04), vec3(1.0), clampedDot(materialInfo.clearcoatNormal, view));
+        blendFactor = materialInfo.clearcoatFactor * fresnelReflection(materialInfo.clearcoatF0, materialInfo.clearcoatF90, clampedDot(materialInfo.clearcoatNormal, view));
     #endif
 
     color = (f_emissive + f_diffuse) * (1.0 - blendFactor) + mix(f_specular, f_clearcoat, blendFactor);

    for (int i = 0; i < LIGHT_COUNT; ++i)
    {
        Light light = u_Lights[i];
        if (light.type == LightType_Directional)
        {
            punctualColor += applyDirectionalLight(light, materialInfo, view);
        }
        else if (light.type == LightType_Point)
        {
            punctualColor += applyPointLight(light, materialInfo, view);
        }
        else if (light.type == LightType_Spot)
        {
            punctualColor += applySpotLight(light, materialInfo, view);
        }
    }
#endif // !USE_PUNCTUAL

    f_diffuse += getDiffuseIBLContribution(normal, materialInfo.albedoColor);

    #ifdef MATERIAL_CLEARCOAT
        f_clearcoat += getSpecularIBLContribution(materialInfo.clearcoatNormal, view, materialInfo.clearcoatRoughness, materialInfo.clearcoatF0);
    #endif
#endif

