- vec3 kD = 1.f - fresnelSchlickRoughness(mdot(N, V), F0, roughness);
- vec3 diffuse = texture(irradianceMap, N).rgb * albedo;
- vec3 ambient = (kD * diffuse) * ao;
+ vec3 F = fresnelSchlickRoughness(mdot(N, V), F0, roughness);
+
+ vec3 kS = F;
+ vec3 kD = (1.f - kS) * (1.f - metallic);
+
+ vec3 irradiance = texture(irradianceMap, N).rgb;
+ vec3 diffuse = irradiance * albedo;
+
+ const float maxReflectionLoD = 4.f;
+ vec3 prefilteredColor = textureLod(prefilterMap, R, roughness * maxReflectionLoD).rgb;
+ vec2 envBRDF = texture(brdfMap, vec2(mdot(N, V), roughness)).rg;
+ vec3 specular = prefilteredColor * (F * envBRDF.x + envBRDF.y);
+
+ vec3 ambient = (kD * diffuse + specular) * ao;