     diffuse = sheenLayer(materialInfo.sheenColor, materialInfo.sheenIntensity, materialInfo.sheenRoughness, NdotL, NdotV, NdotH, diffuse);
 #endif
 
+#ifdef MATERIAL_CLEARCOAT
+    NdotV = clamp(dot(materialInfo.clearcoatNormal, v), 0.0, 1.0);
+
+    lod = clamp(materialInfo.clearcoatRoughness * float(u_MipCount), 0.0, float(u_MipCount));
+    reflection = normalize(reflect(-v, materialInfo.clearcoatNormal));
+
+    brdfSamplePoint = clamp(vec2(NdotV, materialInfo.clearcoatRoughness), vec2(0.0, 0.0), vec2(1.0, 1.0));
+    // retrieve a scale and bias to F0. See [1], Figure 3
+    brdf = texture(u_brdfLUT, brdfSamplePoint).rg;
+
+    specularSample = textureLod(u_SpecularEnvSampler, reflection, lod);
+
+    #ifdef USE_HDR
+    // Already linear.
+        specularLight = specularSample.rgb;
+    #else
+        specularLight = SRGBtoLINEAR(specularSample).rgb;
+    #endif
+
+    float NdotL =  clampedDot(materialInfo.clearcoatNormal, reflection);
+    vec3 h = normalize(reflection + v);
+    float VdotH = clampedDot(v, h);
+    vec3 clearcoatLayer = specularLight * (vec3(1.0) * brdf.x + brdf.y);
+    return clearcoatBlending(diffuse + specular, clearcoatLayer, materialInfo.clearcoatFactor, NdotV,  NdotL, VdotH);
+#endif
+
     return diffuse + specular;
 }
+
+
 
 vec3 getPointShade(vec3 pointToLight, MaterialInfo materialInfo, vec3 view)
 {

    float sheenVisibility = NeubeltVisibility(NdotL, NdotV);
    return sheenColor * sheenIntensity * sheenDistribution * sheenVisibility + (1.0 - sheenIntensity * sheenDistribution * sheenVisibility) * diffuse_term;
}
//---------------------------------------------------------------------------------------------------------

//https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#acknowledgments AppendixB
vec3 diffuseBRDF(vec3 f0, vec3 f90, vec3 diffuseColor, float VdotH)

    vec3 sheenColor;
    float sheenRoughness;

    float clearcoatFactor;
    vec3 clearcoatNormal;
    float clearcoatRoughness;
};

// Lambert lighting
