X-Git-Url: https://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=pbrfrag.glsl;h=c45242dfadb39f834d56cc0c6cac828185a83c4c;hp=16a9fa7a1ba6128257bff2175ee0b24a8868d407;hb=d0c631f46c6db417e013b1bc0edec24cb9c2824a;hpb=9e43c799021b7bcca324b988aae44e98b05d10b4 diff --git a/pbrfrag.glsl b/pbrfrag.glsl index 16a9fa7..c45242d 100644 --- a/pbrfrag.glsl +++ b/pbrfrag.glsl @@ -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