Implement IBL diffuse part
[opengl.git] / pbrfrag.glsl
index 4421b99b6021a9e6a7da4953122bebf30bbf2499..16a9fa7a1ba6128257bff2175ee0b24a8868d407 100644 (file)
@@ -12,6 +12,7 @@ uniform sampler2D normalMap;
 uniform sampler2D metallicMap;
 uniform sampler2D roughnessMap;
 uniform sampler2D aoMap;
+uniform samplerCube irradianceMap;
 
 out vec4 fragColor;
 
@@ -24,6 +25,10 @@ vec3 fresnelSchlick(float cosTheta, vec3 F0) {
        return F0 + (1.f - F0) * pow(1.f - cosTheta, 5.f);
 }
 
+vec3 fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness) {
+       return F0 + (max(vec3(1.f - roughness), F0) - F0) * pow(1.f - cosTheta, 5.f);
+}
+
 float distributionGGX(vec3 N, vec3 H, float roughness) {
        float a = roughness * roughness;
        float NdotH = mdot(N, H);
@@ -97,7 +102,9 @@ void main() {
                Lo += (kD * albedo / PI + specular) * radiance * mdot(N, L);
        }
 
-       vec3 ambient = vec3(0.03) * albedo * ao;
+       vec3 kD = 1.f - fresnelSchlickRoughness(mdot(N, V), F0, roughness);
+       vec3 diffuse = texture(irradianceMap, N).rgb * albedo;
+       vec3 ambient = (kD * diffuse) * ao;
        vec3 color = ambient + Lo;
 
        color = color / (color + vec3(1.f)); // map to HDR