     float NdotH2 = NdotH*NdotH;
 
     float nom = a2;
+
     float denom = (NdotH2 * (a2 - 1.0) + 1.0);
-
     denom = M_PI * denom * denom;
     denom = max(0.0001, denom);
 

    #ifdef defAlbedo
        vec3 albedo = texture2D(u_albedo, v_texCoord).rgb;
    #else
        vec3 albedo = vec3(1.0);
    #endif

    #ifdef defMetalness
        float metalness = texture2D(u_metalness, v_texCoord).r;
    #else
        float metalness = 0.5;
    #endif

    #ifdef defRoughness
        float roughness = texture2D(u_roughness, v_texCoord).r;
    #else
        float roughness = 0.5;
    #endif

    float ambientOcclusion = 0.03;

    vec3 N = normalize(v_normal);
    vec3 V = normalize(-v_position);

    vec3 Lo = vec3(0.0);

    uniform sampler2D u_roughness;
#endif

#ifdef defNormal
    uniform sampler2D u_normal;
#endif

#ifdef defAmbientOcclusion
    uniform sampler2D u_ambientOcclusion;
#endif

varying vec2 v_texCoord;
varying vec3 v_position;
varying vec3 v_normal;
varying vec3 v_binormal;
varying vec3 v_tangent;

vec3 fresnelSchlick(float cosTheta, vec3 F0) {
    return F0 + (1.0 - F0) * pow(1.0 - cosTheta, 5.0);
