 
 vec3 getIndirectLighting(const Surface surface, textureCube environment, vec3 sphericalHarmonics[9]) {
   float NoV = dot(surface.normal, surface.view);
-  float roughness = surface.roughness2;
-  vec2 lookup = prefilteredBRDF(NoV, roughness);
+  vec2 lookup = prefilteredBRDF(NoV, surface.roughness);
 
   int mipmapCount = textureQueryLevels(samplerCube(environment, Sampler));
-  vec3 specular = (surface.f0 * lookup.r + lookup.g) * textureLod(samplerCube(environment, Sampler), surface.reflection, roughness * mipmapCount).rgb;
+  vec3 ibl = textureLod(samplerCube(environment, Sampler), surface.reflection, surface.roughness * mipmapCount).rgb;
+  vec3 specular = (surface.f0 * lookup.r + lookup.g) * ibl;
+
   vec3 sh = evaluateSphericalHarmonics(sphericalHarmonics, surface.normal);
   vec3 diffuse = surface.diffuse * surface.occlusion * sh;
 

}

float D_GGX(const Surface surface, float NoH) {
  float alpha2 = surface.roughness2 * surface.roughness2;
  float denom = (NoH * NoH) * (alpha2 - 1.) + 1.;
  return alpha2 / (PI * denom * denom);
}

  vec3 diffuse;
  vec3 emissive;
  float metalness;
  float roughness;
  float roughness2;
  float occlusion;
  float clearcoat;
