Final project!
[opengl.git] / pbrfrag.glsl
index 16a9fa7a1ba6128257bff2175ee0b24a8868d407..c45242dfadb39f834d56cc0c6cac828185a83c4c 100644 (file)
@@ -9,15 +9,16 @@ uniform vec3 camPos;
 
 uniform sampler2D albedoMap;
 uniform sampler2D normalMap;
-uniform sampler2D metallicMap;
-uniform sampler2D roughnessMap;
+uniform sampler2D metallicRoughnessMap;
 uniform sampler2D aoMap;
 uniform samplerCube irradianceMap;
+uniform samplerCube prefilterMap;
+uniform sampler2D brdfMap;
 
 out vec4 fragColor;
 
-uniform vec3 lightPositions[4];
-uniform vec3 lightColors[4];
+uniform vec3 lightPositions[6];
+uniform vec3 lightColors[6];
 
 const float PI = 3.14159265359;
 
@@ -67,8 +68,8 @@ vec3 getNormalFromMap() {
 void main() {
        vec3 albedo = pow(texture(albedoMap, texCoords).rgb, vec3(2.2));
        vec3 normal = getNormalFromMap();
-       float metallic = texture(metallicMap, texCoords).r;
-       float roughness = texture(roughnessMap, texCoords).r;
+       float metallic = texture(metallicRoughnessMap, texCoords).b;
+       float roughness = texture(metallicRoughnessMap, texCoords).g;
        float ao = texture(aoMap, texCoords).r;
 
        vec3 N = normalize(normal);
@@ -76,6 +77,8 @@ void main() {
 
        vec3 F0 = mix(vec3(0.04), albedo, metallic);
 
+       vec3 R = reflect(-V, N);
+
        // reflectance
        vec3 Lo = vec3(0.f);
        for (int i = 0; i < lightPositions.length(); i++) {
@@ -102,9 +105,20 @@ void main() {
                Lo += (kD * albedo / PI + specular) * radiance * mdot(N, L);
        }
 
-       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;
        vec3 color = ambient + Lo;
 
        color = color / (color + vec3(1.f)); // map to HDR