     vec3 f_specular = vec3(0.0);
     vec3 f_diffuse = vec3(0.0);
     vec3 f_emissive = vec3(0.0);
+    vec3 f_clearcoat = vec3(0.0);
 
     // Calculate lighting contribution from image based lighting source (IBL)
 #ifdef USE_IBL
     f_specular += getSpecularIBLContribution(normal, view, materialInfo.perceptualRoughness, materialInfo.f0); // specularColor
     f_diffuse += getDiffuseIBLContribution(normal, materialInfo.albedoColor);
+
+    #ifdef MATERIAL_CLEARCOAT
+        f_clearcoat += getSpecularIBLContribution(materialInfo.clearcoatNormal, view, materialInfo.clearcoatRoughness, vec3(0.04));
+    #endif
 #endif
 
 vec3 punctualColor = vec3(0.0);


    return diffuseLight * diffuseColor;
}

vec3 getPointShade(vec3 pointToLight, MaterialInfo materialInfo, vec3 view)
{

}

// https://github.com/google/filament/blob/master/shaders/src/brdf.fs#L136
float neubeltVisibility(float NdotL, float NdotV)
{
    return clamp(1.0 / (4.0 * (NdotL + NdotV - NdotL * NdotV)),0.0,1.0);
}

vec3 sheenLayer(vec3 sheenColor, float sheenIntensity, float sheenRoughness, float NdotL, float NdotV, float NdotH, vec3 diffuse_term)
{
    float sheenDistribution = charlieDistribution(sheenRoughness, NdotH);
    float sheenVisibility = neubeltVisibility(NdotL, NdotV);
    return sheenColor * sheenIntensity * sheenDistribution * sheenVisibility + (1.0 - sheenIntensity * sheenDistribution * sheenVisibility) * diffuse_term;
}

